diff options
Diffstat (limited to 'tabfs.md')
-rw-r--r-- | tabfs.md | 705 |
1 files changed, 0 insertions, 705 deletions
diff --git a/tabfs.md b/tabfs.md deleted file mode 100644 index 8527fd9..0000000 --- a/tabfs.md +++ /dev/null @@ -1,705 +0,0 @@ ---- -title: TabFS -meta: | - <meta name="twitter:card" content="summary_large_image"> - <meta name="twitter:site" content="@rsnous"> - <meta name="twitter:creator" content="@rsnous"> - <meta name="twitter:title" content="TabFS"> - <meta name="twitter:description" content="A browser extension that mounts your browser tabs as a filesystem on your computer."> - <meta name="twitter:image" content="https://omar.website/projects/tabfs.png"> ---- -<!-- I'm setting this page in Verdana-on-gray so I feel more comfortable --> -<!-- jotting random notes and stuff down. --> -<style> -body { font-family: Verdana, sans-serif; background: #eee; } -h1 { font-family: Helvetica; } -#TableOfContents > ul > li:first-child { display: none; } -#TableOfContents a[rel=footnote] { display: none; } -pre { white-space: pre-wrap; } -</style> - -[TabFS](https://github.com/osnr/TabFS) is a browser extension that -mounts your browser tabs as a filesystem on your computer. - -Out of the box, it supports Chrome and (to a lesser extent[^firefox]) -Firefox and Safari, on macOS and Linux.[^otherbrowsers] - -(**update**: You can now **[sponsor me to help support further -development of TabFS](https://github.com/sponsors/osnr)** :-) - -[^firefox]: because of the absence of the [chrome.debugger API for - extensions](https://developer.chrome.com/docs/extensions/reference/debugger/). - With a bit more plumbing, you could maybe find a way to connect it - to the remote debugging protocol in Firefox and other browsers and - get that second level of functionality that is currently - Chrome-only. - -[^otherbrowsers]: plus some related browsers and platforms: it also - supports [Brave](https://github.com/osnr/TabFS/issues/30), - Vivaldi, FreeBSD, etc. It could probably be made to work [on - Windows using Dokan or WinFUSE/WSL stuff - (?)](https://github.com/osnr/TabFS/issues/13), but I haven't - looked into that yet. - -Each of your open tabs is mapped to a folder. - -<div class="figure"> -<a href="doc/00-browser.png"><img src="doc/00-browser.png" style="width: 70%"></a> -<a href="doc/00-finder.png"><img src="doc/00-finder.png" style="width: 80%; max-height: 1000px"></a> -<p class="caption" style="margin-top: -20px">I have 3 tabs open, and -they map to 3 folders in TabFS</p> -</div> - -The files inside a tab's folder directly reflect (and can control) the -state of that tab in your browser. (TODO: update as I add more) - -<div class="figure"> -<video autoplay loop muted> - <source src="doc/finder-contents.mp4" type="video/mp4"> -</video> -<p class="caption">Going through the files inside a tab's folder. For -example, the url.txt, text.txt, and title.txt files tell me those live -properties of this tab</p> -</div> - -This gives you a _ton_ of power, because now you can apply [all the -existing tools](https://twitter.com/rsnous/status/1018570020324962305) -on your computer that already know how to deal with files -- terminal -commands, scripting languages, point-and-click explorers, etc -- and -use them to control and communicate with your browser. - -Now you don't need to [code up a browser extension from -scratch](https://twitter.com/rsnous/status/1261392522485526528) every -time you want to do anything. You can write a script that talks to -your browser in, like, a melange of Python and bash, and you can save -it as [a single ordinary -file](https://twitter.com/rsnous/status/1308588645872435202) that you -can run whenever, and it's no different from scripting any other part -of your computer. - -### table of contents - -{{< table_of_contents >}} - -## Examples of stuff you can do![^examples] - -[^examples]: maybe some of these feel a little more vital and - fleshed-out and urgent than others. the things I actually wanted - to do and reached for vs. the things that satisfy some pedagogical - property (simple to explain, stack on top of the previous example, - ...) - -(assuming your current directory is the `fs` subdirectory of the git -repo and you have the extension running) - -### List the titles of all the tabs you have open - -``` -$ cat mnt/tabs/by-id/*/title.txt -GitHub -Extensions -TabFS/install.sh at master ยท osnr/TabFS -Alternative Extension Distribution Options - Google Chrome -Web Store Hosting and Updating - Google Chrome -Home / Twitter -... -``` - -### Cull tabs like any other files - -<div class="figure"> -<video autoplay loop muted> - <source src="doc/delete.mp4" type="video/mp4"> -</video> -<p class="caption">Selecting and deleting a bunch of tabs in my file manager</p> -</div> - -I'm using Dired in Emacs here, but you could use whatever tools you -already feel comfortable managing your files with. - -### Close all Stack Overflow tabs - -``` -$ rm mnt/tabs/by-title/*Stack_Overflow* -``` - -or (older / more explicit) - -``` -$ echo remove | tee -a mnt/tabs/by-title/*Stack_Overflow*/control -``` - -#### btw - -(this task, removing all tabs whose titles contain some string, is a -little contrived, but it's not that unrealistic, right?) - -(now... how would you do this _without_ TabFS? I honestly have no -idea, off the top of my head. like, how do you even get the titles of -tabs? how do you tell the browser to close them?) - -(I looked up the APIs, and, OK, if you're already in a browser -extension, in a 'background script' inside the extension, _and_ your -extension has the `tabs` permission -- this already requires you to -make 2 separate files and hop between your browser and your text -editor to set it all up! -- you can do -[this](https://developer.chrome.com/docs/extensions/reference/tabs/#method-query): -`chrome.tabs.query({}, tabs => chrome.tabs.remove(tabs.filter(tab => -tab.title.includes('Stack Overflow')).map(tab => tab.id)))`) - -(not _terrible_, but look at all that upfront overhead to get it set -up. and it's not all that discoverable. and what if you want to reuse -this later, or plug it into some larger pipeline of tools on your -computer, or give it a visual interface? the jump in complexity once -you need to communicate with anything -- possibly setting up a -WebSocket, setting up handlers and a state machine -- is pretty -horrifying) - -(but to be honest, I wouldn't even have conceived of this as a thing I -could do in the first place) - -### Save text of all tabs to a file - -``` -$ cat mnt/tabs/by-id/*/text.txt > text-of-all-tabs.txt -``` - -### Evaluate JavaScript on a page / watch expressions: [demo](https://twitter.com/rsnous/status/1364008241588363264) - -(was `evals` in linked demo, is now renamed to `watches`) - -``` -$ touch mnt/tabs/last-focused/watches/'document.body.style.background = "green"' - -$ touch mnt/tabs/last-focused/watches/'alert("hi!")' - -$ touch mnt/tabs/last-focused/watches/'2 + 2' -$ cat mnt/tabs/last-focused/watches/'2 + 2' -4 -``` - -``` -$ touch mnt/tabs/last-focused/watches/window.scrollY -``` - -Now you can `cat window.scrollY` and see where you are scrolled on the -page at any time. - -Could make an [ad-hoc -dashboard](https://twitter.com/rsnous/status/1080878682275803137) -around a Web page: a bunch of terminal windows floating around your -screen, each sitting in a loop and using `cat` to monitor a different -variable. - -### Get images / scripts / other resource files from page - -(TODO: [document better](https://github.com/osnr/TabFS/issues/5), put in screenshots) - -The [`debugger/` -subdirectory](https://github.com/osnr/TabFS/blob/fef9289e3a7f82cda6319d5f19d5a5f13f3cc44b/extension/background.js#L355) -in each tab folder has synthetic files that let you access loaded -resources (in `debugger/resources/`) and scripts (in -`debugger/scripts/`). - -Images will show up as actual PNG or JPEG files, scripts as actual JS -files, and so on. (this is experimental.) - -(TODO: edit the images in place? you can already kinda edit the -scripts in place) - -### Retrieve what's playing on YouTube Music: [youtube-music-tabfs](https://github.com/junhoyeo/youtube-music-tabfs) - -[thanks](https://www.reddit.com/r/programming/comments/kok4dw/tabfs_mount_your_browser_tabs_as_a_filesystem/ghtbgw1/) to [Junho Yeo](https://github.com/junhoyeo)! - -### Reload an extension when you edit its source code - -Suppose you're working on a Chrome extension (apart from this -one). It's a pain to reload the extension (and possibly affected Web -pages) every time you change its code. There's a [Stack Overflow -post](https://stackoverflow.com/questions/2963260/how-do-i-auto-reload-a-chrome-extension-im-developing) -with ways to automate this, but they're all sort of hacky. You need -yet another extension, or you need to tack weird permissions onto your -work-in-progress extension, and you don't just get a command you can -trigger from your editor or shell to refresh the extension. - -TabFS lets you do all this in [an ordinary shell -script](https://github.com/osnr/playgroundize-devtools-protocol/blob/main/go.sh). -You don't have to write any browser-side code at all. - -This script turns an extension (this one's title is "Playgroundize -DevTools Protocol") off, then turns it back on, then reloads any tabs -that have the relevant pages open (in this case, I decided it's tabs -whose titles start with "Chrome Dev"): - -``` -#!/bin/bash -eux -echo false > mnt/extensions/Playg*/enabled -echo true > mnt/extensions/Playg*/enabled -echo reload | tee mnt/tabs/by-title/Chrome_Dev*/control -``` - -I mapped this script to Ctrl-. in my text editor, and now I just hit -that every time I want to reload my extension code. - -### TODO: Live edit a running Web page - -edit `page.html` in the tab folder. I guess it could just stomp -outerHTML at first, eventually could do something more sophisticated - -then you can use your existing text editor! and you'll always know -that if the file saved, then it's up to date in the browser. no flaky -watcher that you're not sure if it's working - -(it would be cool to have a persistent storage story here -also. I like the idea of being able to put arbitrary files anywhere in -the subtree, actually, because then you could use git and emacs -autosave and stuff for free... hmm) - -### TODO: Import data (JSON? XLS? JS?) - -drag a JSON file `foo.json` into the `imports` subfolder of the tab -and it shows up as the object `imports.foo` in JS. (modify -`imports.foo` in JS and then read `imports/foo.json` and you read the -changes back?) - -import a plotting library or whatever the same way? dragging -`plotlib.js` into `imports/plotlib.js` and then calling -`imports.plotlib()` to invoke that JS file - -the browser has a lot of potential power as an interactive programming -environment, one where graphics come [as -naturally](https://twitter.com/rsnous/status/1295828978477932544) as -console I/O do in most programming languages. i think something that -holds it back that is underexplored is lack of ability to just... drag -files in and manage them with decent tools. many Web-based 'IDEs' have -to reinvent file management, etc from scratch, and it's like a -separate universe from the rest of your computer, and migrating -between one and the other is a real pain (if you want to use some -Python library to munge some data and then have a Web-based -visualization of it, for instance, or if you want to version files -inside it, or make snapshots so you [feel -comfortable](https://twitter.com/rsnous/status/1288725175895068673) -trying stuff, etc). - -(what would the persistent storage story here be? localStorage? it's -interesting because I almost want each tab to be [less of a -commodity](https://twitter.com/rsnous/status/1344753559007420416), -less -[disposable](https://twitter.com/rsnous/status/1270192308772691968), -since now it's the site I'm dragging stuff to and it might have some -persistent state attached. like, if I'm programming and editing stuff -and saving inside a tab's folder, that tab suddenly really -[matters](https://twitter.com/rsnous/status/1251863115022491653); I -want it to survive as long as a normal file would, unlike most browser -tabs today) - -(the combination of these last 3 TODOs may be a very powerful, open, -dynamic, flexible programming environment where you can bring whatever -external tools you want to bear, everything is live in your browser, -you never need to restart...) - -## Setup - -**disclaimer**: this extension is an experiment. I think it's cool and -useful and provocative, and I usually leave it on, but I make no -promises about functionality or, especially, security. applications -may freeze, your browser may freeze, there may be ways for Web pages -to use the extension to escape and hurt your computer ... In some -sense, the [whole -point](https://twitter.com/rsnous/status/1338932056743546880) of this -extension is to create a gigantic new surface area of communication -between stuff inside your browser and software on the rest of your -computer. - -(The installation process is pretty involved right now. I'd like to -simplify it, but I also don't want a seamless installation process -that does a bad job of managing people's expectations. And it's -important to me that users [feel -comfortable](https://twitter.com/rsnous/status/1345113873792126976) -looking at [how TabFS works](#design) -- it's pretty much just two -files! -- and that they can mess around with it; it shouldn't be a -black box.) - -Before doing anything, clone [this repository](https://github.com/osnr/TabFS): - -``` -$ git clone https://github.com/osnr/TabFS.git -``` - -First, install the browser extension. - -Then, install the C filesystem. - -### 1. Install the browser extension - -#### in Chrome, Chromium, and related browsers - -(including Brave and Vivaldi) - -Go to the [Chrome extensions page](chrome://extensions). Enable -Developer mode (top-right corner). - -Load-unpacked the `extension/` folder in this repo. - -**Make a note of the extension ID Chrome assigns.** Mine is -`jimpolemfaeckpjijgapgkmolankohgj`. We'll use this later. - -#### in Safari (WIP) - -See [the Safari -instructions](https://github.com/osnr/TabFS/tree/master/extension/safari). You -should compile the C filesystem (as below) before trying to run the extension. - -#### in Firefox - -You'll need to install as a "temporary extension", so it'll only last -in your current FF session. (If you want to install permanently, see -[this -issue](https://github.com/osnr/TabFS/issues/4#issuecomment-753447380).) - -Go to [about:debugging#/runtime/this-firefox](about:debugging#/runtime/this-firefox). - -Load Temporary Add-on... - -Choose manifest.json in the extension subfolder of this repo. - -### 2. Install the C filesystem - -First, make sure you have FUSE and FUSE headers. On Linux, for example, -`sudo apt install libfuse-dev` or equivalent. On macOS, get -[macFUSE](https://osxfuse.github.io/). (on macOS, also see [this --bug](https://github.com/osnr/TabFS/issues/11) -- TODO work out the -best path to explain here) - -Then compile the C filesystem: - -``` -$ cd fs -$ mkdir mnt -$ make -``` - -(GNU Make is required, so use gmake on FreeBSD) - -Now install the native messaging host into your browser, so the -extension can launch and talk to the filesystem: - -#### Chrome, Chromium, and related browsers - -Substitute the extension ID you copied earlier for -`jimpolemfaeckpjijgapgkmolankohgj` in the command below. - -``` -$ ./install.sh chrome jimpolemfaeckpjijgapgkmolankohgj -``` - -(For Chromium, say `chromium` instead of `chrome`. For Vivaldi, say -`vivaldi` instead. For Brave, say `chrome`. You can look at the -contents of -[install.sh](https://github.com/osnr/TabFS/blob/master/install.sh) for -the latest on browser and OS support.) - -#### Safari (WIP) - -See [the Safari -instructions](https://github.com/osnr/TabFS/tree/master/extension/safari). - -#### Firefox - -``` -$ ./install.sh firefox -``` - -### 3. Ready! - -Go back to `chrome://extensions` or -`about:debugging#/runtime/this-firefox` and reload the extension. - -Now your browser tabs should be mounted in `fs/mnt`! - -Open the background page inspector to see the filesystem operations -stream in. (in Chrome, click "background page" next to "Inspect views" -in the extension's entry in the Chrome extensions page; in Firefox, -click "Inspect") - -<div class="figure"> -<a href="doc/inspector.png"><img style="max-width: 90%; max-height: 1000px" src="doc/inspector.png"></a> -</div> - -This console is also incredibly helpful for debugging anything that -goes wrong, which probably will happen. (If you get a generic I/O -error at the shell when running a command on TabFS, that probably -means that an exception happened which you can check here.) - -(My OS and applications are pretty chatty. They do a lot of -operations, even when I don't feel like I'm actually doing -anything. My sense is that macOS is generally chattier than Linux.) - -## Design - -- `fs/`: Native FUSE filesystem, written in C - - [`tabfs.c`](https://github.com/osnr/TabFS/tree/master/fs/tabfs.c): - Talks to FUSE, implements fs operations, talks to extension. I - rarely have to change this file; it essentially is just a stub - that forwards everything to the browser extension. -- `extension/`: Browser extension, written in JS - - [`background.js`](https://github.com/osnr/TabFS/tree/master/extension/background.js): - **The most interesting file**. Defines all the synthetic files and - what browser operations they invoke behind the scenes.[^frustrates] - -[^frustrates]: it frustrates me that I can't show you, like, a table - of contents for this source file. because it does have a structure - to it! so I feel like the UI for looking at this one file should - be - [custom-tailored](https://twitter.com/rsnous/status/1262956983222591488) - to - [highlight](https://twitter.com/rsnous/status/1262957486262214657) - and exploit that structure. (I wonder what other cases like this - are out there, where ad hoc UI for one file would be useful. like - if you have tangled-but-regular business logic, or the giant - opcode switch statement of an emulator or interpreter.) - - I want to link you to a particular route and talk about it here - and also have some kind of - transclusion (without the horrifying mess of making a lot of tiny - separate files). I want to use typesetting and whitespace to set - each route in that file apart, and set them as a whole apart from the utility functions & - default implementations & networking. - -My understanding is that when you, for example, `cat -mnt/tabs/by-id/6377/title.txt` in the tab filesystem: - -1. `cat` on your computer does a system call `open()` down into macOS - or Linux, - -2. macOS/Linux sees that this path is part of a FUSE filesystem, so it - forwards the `open()` to the FUSE kernel module, - -3. FUSE forwards it to the `tabfs_open` implementation in our - userspace filesystem in `fs/tabfs.c`, - -4. then `tabfs_open` rephrases the request as a JSON string and - forwards it to our browser extension over stdout (['native - messaging'](https://developer.chrome.com/docs/apps/nativeMessaging/)), - -6. our browser extension in `extension/background.js` gets the - incoming message; it triggers the route for - `/tabs/by-id/*/title.txt`, which calls the browser extension API - `browser.tabs.get` to get the data about tab ID `6377`, including - its title, - -7. so when `cat` does `read()` later, the title can get sent back in - a JSON native message to `tabfs.c` and finally back to FUSE and the - kernel and `cat`. - -(very little actual work happened here, tbh. it's all just -marshalling) - -TODO: make diagrams? - -## License - -GPLv3 - -## Sponsors - -Thanks to [all the project sponsors](https://github.com/sponsors/osnr). Special -thanks to: - -<a href="https://oss.capital/"><img style="max-width: 50%" src="oss-capital.png"></a> - -## things that could/should be done - -(maybe you can do these? lots of people are [already pitching in on -GitHub](https://github.com/osnr/TabFS); I wish it was easier for me to -keep up listing them all here!) - -- [add more synthetic files!! (it's just - JavaScript)](https://twitter.com/rsnous/status/1345113873792126976) - view DOM nodes, snapshot current HTML of page, spelunk into living - objects. see what your code is doing. make more files writable also - -- build more (GUI and CLI) tools on top, on both sides - -- more persistence stuff. as I said earlier, it would also be cool if - you could put arbitrary files in the subtrees, so .git, Mac extended - attrs, editor temp files, etc all work. make it able to behave like - a 'real' filesystem. also as I said earlier, some weirdness in the - fact that tabs are so disposable; they have a very different - lifecycle from most parts of my real filesystem. how to nudge that? - -- why can't Preview open images? GUI programs often struggle with the - filesystem for some reason. CLI more reliable - -- ~~multithreading. the key constraint is that I pass `-s` to - `fuse_main` in `tabfs.c`, which makes everything - single-threaded. but I'm not clear on how much it would improve - performance? maybe a lot, but not sure. maybe workload-dependent?~~ - - ~~the extension itself (and the stdin/stdout comm between the fs - and the extension) would still be single-threaded, but you could - interleave requests since most of that stuff is async. like the - screenshot request that takes like half a second, you could do other - stuff while waiting for the browser to get back to you on that (?)~~ - *update: [we are - multithreaded](https://github.com/osnr/TabFS/pull/29) now, thanks to - [huglovefan](https://github.com/huglovefan)!* - - another issue is that _applications_ tend to hang if any - individual request hangs anyway; they're not expecting the - filesystem to be so slow (and to be fair to them, they really have - [no way](https://twitter.com/whitequark/status/1133905587819941888) - to). some of these problems may be inevitable for any FUSE - filesystem, even ones you'd assume are reasonably battle-tested and - well-engineered like sshfs? - -- other performance stuff -- remembering when we're already attached - to things, reference counting, minimizing browser roundtrips. not - sure impact of these - -- TypeScript (how to do with the minimum amount of build system and - package manager nonsense?) (now realizing that if I had gone with - TypeScript, I would then have to ask people to install npm and - webpack and the TS compiler and whatever just to get this - running. really, really glad I didn't.) maybe we can just do dynamic - type checking at the fs op call boundaries? - -- [look into support for Firefox / Windows / Safari / - etc.](https://github.com/osnr/TabFS/issues?q=is%3Aopen+is%3Aissue+label%3Aport) - best FUSE equiv for Windows? can you bridge to the remote debugging - APIs that all of them already have to get the augmented - functionality? or just implement it all with JS monkey patching? - -- window management. tab management where you can move tabs. 'merge - all windows'. [history management](https://anildash.com/2021/01/03/keeping-tabs-on-your-abstractions/) - -## hmm - -- [Processes as Files -(1984)](https://lucasvr.gobolinux.org/etc/Killian84-Procfs-USENIX.pdf), -[Julia Evans /proc comic](https://drawings.jvns.ca/proc/) lay out the -original `/proc` filesystem. it's very cool! very elegant in how it -reapplies the existing interface of files to the new domain of Unix -processes. but how much do I care about Unix processes now? most -[programs](https://twitter.com/rsnous/status/1176587656915849218) that -I care about running on my computer these days are Web pages, [not -Unix -processes](https://twitter.com/rsnous/status/1076229968017772544). so -I want to take the approach of `/proc` -- 'expose the stuff you care -about as a filesystem' -- and apply it to something -[modern](https://twitter.com/rsnous/status/1251342095698112512): the -inside of the browser. 'browser tabs as files' - -- there are two 'operating systems' on my computer, the browser and -Unix, and Unix is by far the more accessible and programmable and -cohesive as a computing environment (it has concepts that compose! -shell, processes, files), even though it's arguably the less important -to my daily life. [how can the browser take on more of the properties -of Unix?](https://twitter.com/jcreed/status/1344982366243213312) - -- it's [way too -hard](https://twitter.com/rsnous/status/1342236988938719232) to make a -browser extension. even 'make an extension' is a bad framing; it -suggests making an extension is a whole Thing, a whole Project. like, -why can't I just take a minute to ask my browser a question or tell it -to automate something? lightness - -- "files are a sort of approachable 'bridge' that everyone knows how - to interact with" / files are like one of the first things you learn - if you know any programming language / ["because of this fs thing any - beginner coding thing can make use of it now"](https://twitter.com/rsnous/status/1345490658836926464) - -- a lot of existing uses of these browser control APIs are in an - automation context: testing your code on a robotic browser as part - of some pipeline. I'm much more interested in an interactive, - end-user context. augmenting the way I use my everyday - browser. that's why this is an extension. it doesn't require your - browser to run in some weird remote debugging mode that you'd always - forget to turn on. it just [stays - running](https://twitter.com/rsnous/status/1340150818553561094) - -- [system call tracing](https://jvns.ca/strace-zine-v2.pdf) (dtruss or - strace) super useful when anything is going wrong. (need to disable - SIP on macOS, though.) the combination of dtruss (application side) - & console logging fs request/response (filesystem side) gives a huge - amount of insight into basically any problem, end to end - - - there is sort of this sequence that I learned to try with - anything. first, either simple shell commands or pure C calls -- - shell commands are more ergonomic, C calls have the clearest - mental model of what syscalls they actually invoke. only then do - you move to the text editor or the Mac Finder, which are a lot - fancier and throw a lot more stuff at the filesystem at once (so - more can go wrong) - -- for a lot of things in the extension API, the browser can notify you - of updates but there's no apparent way to query the full current - state. so we'd need to sit in a lot of these places from the - beginning and accumulate the incoming events to know, like, the last - time a tab was updated, or the list of scripts currently running on - a tab - -- async/await was absolutely vital to making this readable - -- filesystem as 'open input space' where there are things you can say - beyond what this particular filesystem cares about. (it reminds me - of my [Screenotate](https://screenotate.com) -- screenshots give you - this open field where you can [carry - through](https://twitter.com/rsnous/status/1221687986510680064) - stuff that the OCR doesn't necessarily recognize or care about. same - for the real world in Dynamicland; you can scribble notes or - whatever even if the computer doesn't see them) - -- now you have this whole 'language', this whole toolset, to control -and automate your browser. there's this built-up existing capital -where lots of people and lots of application software and lots of -programming languages ... already know the operations to work with -files - -- this project is cool bc i immediately get [a dataset i care - about](https://twitter.com/rsnous/status/1084166291793965056). I - found myself using it 'authentically' pretty quickly -- to clear out - my tabs, to help me develop other things in the browser so I'd have - actions I could trigger from my editor, ... - -- stuff that looks cool / is related: - - - [SQLite virtual tables](https://www.sqlite.org/vtablist.html) - have some of the same energy as FUSE synthetic filesystems to - me, except instead of 'file operations', 'SQL' is the well-known - interface / knowledge base / ecosystem that they - [piggyback](https://twitter.com/rsnous/status/1237986368812224513) - on. [osquery](https://osquery.readthedocs.io/en/stable/) seems - particularly cool - - - Plan 9. I think a lot about [extensibility in the Acme text - editor](https://mostlymaths.net/2013/03/extensibility-programming-acme-text-editor.html/), - where - [instead](https://twitter.com/geoffreylitt/status/1265384495542415360) - of a 'plugin API', the editor just provides a synthetic - filesystem - - - my [fake filesystems talk](https://www.youtube.com/watch?v=pfHpDDXJQVg) - - - [Witchcraft](https://luciopaiva.com/witchcraft/) has the right - idea for how to set up userscripts. just make files -- don't - make [your own weird UI to add and remove - them](https://twitter.com/rsnous/status/1196536798312140800). (I - guess there is a political or audience - [tradeoff](https://twitter.com/rsnous/status/1290031845363466242) - here, where [some - kinds](https://twitter.com/rsnous/status/1039036578427891713) of - users might be comfortable with managing files, but you might - alienate others. hmm) - -- [rmdir a non-empty - directory](https://twitter.com/rsnous/status/1107427906832089088) - -- when I was thinking if you should be able to `rm by-id/TABID` - even though `TABID` is a folder. I feel like a new OS, something - like Plan 9, should - [generalize](https://twitter.com/rsnous/status/1070830656005988352) - its file I/O APIs just enough to avoid problems like this. like - design them with the disk in mind but also a few concrete cases of - synthetic filesystems, very slow remote filesystems, etc - -do you like setting up sockets? I don't |