extension | ||
fs | ||
.gitignore | ||
.gitmodules | ||
install.sh | ||
README.md |
TabFS
Setup
First, install the browser extension.
Then, install the C filesystem.
Install the browser extension
(I think it will work on Edge or Opera or whatever, too. You'll need to change the native messaging path in install.sh in those cases.)
Chrome
Go to the Chrome extensions page. Enable Developer mode (top-right corner).
Load-unpacked the extension/
folder in this repo.
Get the extension ID.
Firefox
Install the C filesystem
First, make sure you git submodule update --init
to get the
fs/cJSON
and fs/base64
dependencies.
And make sure you have FUSE. On Linux, for example, sudo apt install libfuse-dev
. On macOS, get FUSE for macOS.
$ cd fs
$ mkdir mnt
$ make
Now install the native messaging host into your browser, so the extension can launch and talk to the filesystem:
$ ./install.sh [chrome | chromium | firefox]
Ready
Reload the extension in chrome://extensions
.
Now your browser tabs should be mounted in fs/mnt
!
Examples of stuff you can do
(assuming your shell is in the fs
subdirectory)
List the titles of all the tabs you have open
$ cat mnt/tabs/by-id/*/title
GitHub
Extensions
TabFS/install.sh at master · osnr/TabFS
Alternative Extension Distribution Options - Google Chrome
Web Store Hosting and Updating - Google Chrome
Home / Twitter
...
Close all Stack Overflow tabs
$ echo close | tee -a mnt/tabs/by-title/*Stack_Overflow*/control
Save text of all tabs to a file
(wip, FIXME)
$ cat mnt/tabs/by-id/*/text > text.txt
Design
extension/
: Browser extension, written in JSfs/
: Native FUSE filesystem, written in Ctabfs.c
: Talks to FUSE, implements fs operations, talks to browser.
When you, say, cat
a file in the tab filesystem:
-
cat
makes something like aread
syscall, -
which goes to the FUSE kernel module which backs that filesystem,
-
FUSE forwards it to the
tabfs_read
implementation in our userspace filesystem infs/tabfs.c
, -
then
tabfs_read
rephrases the request as a JSON string and forwards it to the browser extension over 'native messaging', -
our browser extension in
extension/background.js
handles the incoming message and calls the browser APIs to construct the data for that synthetic file; -
then the data gets sent back in a JSON native message to
tabfs.c
and and finally back to FUSE and the kernel andcat
.
(very little actual work happened here, tbh. it's all just marshalling)
TODO: make diagrams?
license
GPLv3
hmm
it's way too hard to make an extension. even 'make an extension' is a bad framing
open input space -- filesystem
now you have this whole 'language', this whole toolset, to control and automate your browser
OSQuery
fake filesystems talk
Screenotate
processes as files. the real process is the browser.
browser and Unix
rmdir a non-empty directory