3 ms·
Show HN: Textile – A desktop app for weaving together bits of text
Hi all,
I'm excited to show off Textile, a desktop app I recently built.
Textile can combine bits of text using various inputs, such as commands on your computer, the contents of your clipboard, and hard-coded strings that you provide. It lets you carefully build up and modify a dynamic string, step by step, until it's exactly how you need it. The saved steps can then be executed on demand, with the click of a button or using a keyboard shortcut.
I built Textile because I was often constructing complicated, dynamic URLs from various sources that all existed on my computer. I got tired of manually switching between different apps, copying and pasting various chunks of text, and assembling them all together somewhere. I've also found Textile to be quite useful as a kind of repository for obscure bits of static text, such as ½ and other fraction characters, when I can't be bothered to remember their built-in keyboard combinations.
I also built Textile because I wanted to learn Electron, although I expect there will be some gnashing of teeth about this here. :) I think desktop development is quite interesting, in part because it doesn't require me, the developer, to pay for an API server and database in the cloud. The app itself is both the UI and the "server," and the local drive is effectively the "database." I knows this trades away syncing with the cloud but, on the other hand, there's something nice about knowing that your files are on your drive and not on somebody else's server.
I realize that something like Textile may already exist, and may have much more functionality but, again, I wanted to learn. I must say that multi-sequence keyboard shortcuts are hard, and there are cases that don't work right in Textile. I feel vulnerable admitting that my approach has much room for improvement!
For what it's worth, I did not use an LLM to write any code for Textile (although I did ask many questions of an LLM, as an alternative to Googling).
Textile is open source, free to use, and does not require sign up, email, phone, or other such barriers. Try it and let me know what you think!
(Note: I don't have access to hardware running Windows or Linux, so Textile is only available for macOS at the moment.)
- frereubu 4mo agoThe text on your site is cut off on both left and right on my iPhone 13 mini, and I can't zoom, so it's unreadable.
- thejokeisonme 4mo agoSame on Android, duck browser
- thejokeisonme 4mo agoLooks much better now
- stack_framer 4mo agoThanks! Should be fixed.
- darkteflon 4mo agoThis looks really cool and right up my alley. Congratulations on showing it to people. Will check it out!
- cosmotic 4mo agoLooks a lot like CyberChef which is web based. https://cyberchef.org/ https://cyberchef.org/
- tquinn35 4mo agoI’m a little confused what this does. Is it like espanso?
- stack_framer 4mo agoI'm not too familiar with Espanso, but Textile is not a text expander. Textile allows you to pre-define a sequence of steps that dynamically generate the text you want, by running commands on your computer, reading your clipboard, or using hard-coded text you provide. Here's a quick example, and one that I often use with Textile to generate a preview URL based on my current branch: (1) Start with the output of the command `git branch --show-current` in the `~/code` directory (yielding text like `JIRA-1234/some-feature`). (2) Replace all `/` characters with `-` (now the text is `JIRA-1234-some-feature`). (3) Prepend `[preview](https://staging-`, which is the start of a markdown link (now the text is `[preview](https://staging-JIRA-1234-some-feature`). (4) Append `.example.com)`, which is the end of the markdown link (now the text is `[preview](https://staging-JIRA-1234-some-feature.example.com https://staging-JIRA-1234-some-feature.example.com)`). (5) Copy the result to my clipboard. With those steps saved in Textile, I can now click a button to run them over and over again (or use a keyboard shortcut if I assigned one). So no matter which branch I'm on, I'll always get a proper preview link without having to construct it manually myself.
- Alifatisk 4mo agoCan't this be done with a bash script? Or is this supposed to be a more convenient, ergonomic and declarative way to do it?
- stack_framer 4mo agoI'm certain everything Textile does could be handled by bash scripts, or any other script flavors / languages / tools. So, yes, Textile is supposed to be a more convenient way to do it.
- cardamomo 4mo agoThis could be useful for writing report card comments! Source: I'm a teacher. It's report card season. :)
- metalliqaz 4mo agoshares a name with the markup language[1] and even though it's in a different category, it's a little close for comfort [1] https://en.wikipedia.org/wiki/Textile_(markup_language) https://en.wikipedia.org/wiki/Textile_(markup_language)
- baliex 4mo agoCan it wait/prompt for something new to be put onto the clipboard while it runs a Textile? For a use-case where I've copied thing 1, then I start my Textile, then I go and copy thing 2 from somewhere, and then Textile continues with the remaining steps with thing 1 and thing 2?
- stack_framer 4mo agoNo, but this is a great suggestion. I imagine a flow that looks something like this: (1) When creating the textile, you would add a step to "wait for new clipboard data." (2) When you run the textile, and it gets to that step, a modal would appear, prompting you to copy the new thing to your clipboard. (3) Once you've got the new thing on your clipboard, you would go back and click "Continue" on the modal from step 2. (4) Textile would continue with the new thing on your clipboard. Is that kind of what you were thinking?
- baliex 4mo agoThat’s exactly what I was thinking. And I think you’re saying the same thing, but to be sure: the _wait_ wouldn’t be a timer, it’d be watching the clipboard for changes and proceeding as soon as it changed. If we’re going to do the discovery out in the open.. it would be nice to be able to specify the prompt as part of the Textile (e.g. “Copy the GitHub URL”). And then also showed the clipboard contents it is going to proceed with, before proceeding. A single key press (Enter?) would be ideal to proceed. That protects me from accidentally passing sensitive data through.
- stack_framer 4mo agoI like the idea of being able to specify the prompt, as a reminder of what you wanted to copy to the clipboard at that point. I've created a new issue for this (it's similar to an idea I already had): https://github.com/rob-johansen/textile/issues/75 https://github.com/rob-johansen/textile/issues/75
- vifly_net 4mo agoexpend to ime could be a way
- ChrisArchitect 4mo agoNot to be confused with https://textile-lang.com/ https://textile-lang.com/
- Terretta 4mo ago`Textile` is a similar language to Markdown, used to weave text across multiple IDEs, programming languages, and CMSs: https://textile-lang.com/ https://textile-lang.com/ Textile is one of the core markups supported by GitHub and Pandoc: https://github.com/github/markup https://github.com/github/markup / https://pandoc.org/ https://pandoc.org/ And many CMS, most famously TextPattern and MoveableType, but also things like Jekyll: https://textile-lang.com/article/textile-markup-language-support-in-cms https://textile-lang.com/article/textile-markup-language-sup...
- 97-109-107 4mo agoHere's a few use cases that are in the same territory, which I tried address at various stages with emacs and scripts. 1. Everything I ever paste (which is longer than >N) will be saved into a file. The assumption being is that it's an e-mail or message with high reuse potential 2. I have a single keybind that launches a script-selector and passes the currently selected text to it. 3. Script examples: save selection as markdown in a preset file (for use with LLMs); send selection to a temporary emacs buffer. 4. I have two shortcut that - take the current text area into emacs to edit it; then, send the emacs buffer back to the current selected area (by pasting). Useful for replying to messages
- craftedcode 4mo agoThe "local drive as database" tradeoff is interesting. No sync but you own your data completely. For certain use cases that's actually the right call.
- Talpur1 4mo ago[dead]
- mevlut 4mo ago[dead]