TabFS – a browser extension that mounts the browser tabs as a filesystem
omar.website
omar.website
(Background: I have RSI, so I've been developing some integrations between applications and Talon Voice (https://talonvoice.com/). AppleScript ends up being surprisingly valuable/fast/reliable for applications that support it. I also built an integration with iTerm2's Python API before noticing that everything I was trying to do was already supported by its AppleScript dictionary, and was faster. In Google Chrome, the "iterate through tabs and execute javascript in them" is very useful for automating Google Meet muting/unmuting.)
Nothing against this excellent project though; I'm a big fan of Omar's Twitter! And I suspect most here will appreciate the easier scriptability of the filesystem approach than dealing with the atrocious syntax of AppleScript.
1. Motorized standing desk - typing from varying postures keeps strain spread out
2. Kensington trackball mouse - less hand sweeping / temptation to drags wrist on table
3. Ortholinear "Planck" keyboard - modifier keys accessible via thumb and programmable layers more generally can completely eliminate painful hand poses and keep fingers on the home-row
For the dragging wrist problem, I really like the reloot or other similar gliding palm rests. I find upgrading them with ceramic lights makes a big difference.
Once I ended that one bad relationship in my life, my mind stopped messing up the most used part of my body to send me signals that I’m actually chewing on life’s gristle.
My wrists have been pain free for 15 years. Without surgery. Without therapy. Without a change in work hours.
Talon itself provides noise and speech recognition, and provides the framework that allows you to build automations with any program; Cursorless really helps make programming by voice feel comparable to typing.
For me, it's a combination of introducing alternate input methods (largely voice, but noises are also very additive -- they very well for fast/discreet actions, whereas voice is higher bandwidth but lower latency), as well as building higher-level and better integrations with applications. But I still have always to go personally.
I've been meaning to write up a blog post with everything that I've learned, but you know how it is :)
I recommend breaks and rest over strengthening exercises when dealing with hand pain. Learn preventative measures
Are there any good examples of doing this?
There are lots of examples just by googling. The script editor has a dictionary for every application you can natively script.
Been using this for about a decade now.
I annotate on screens all day and there are no useful shortcuts for moving between drawing and erasing. Also the drawing button requires 2 clicks. I’ve wired my wacom tablet so the two buttons fire off shortcuts, they run a service I’ve registered in the menus, they run the applescript, it fishes about for the right windows in zoom and clicks the buttons. It could not have worked but it just happens to because I can trigger a button and then focus moves to the next button (which I can’t otherwise target) and then I can push “space” to get the job done.
tell application "System Events"
repeat with theProcess in processes
if not background only of theProcess then
tell theProcess
set processName to name
set theWindows to windows
end tell
set windowsCount to count of theWindows
if processName is "zoom.us" then
repeat with theWindow in theWindows
tell theWindow
set theSize to size
set windowName to name
end tell
if windowName is "annotation panel" then
if item 1 of theSize is 776 then
tell theWindow to tell button 5 to click
key code 49
else
tell theWindow to tell button 4 to click
key code 49
end if
end if
end repeat
end if
end if
end repeat
end tell tell application "Safari" to do JavaScript "
(() => {
const loc = Array
.from(document.querySelectorAll('[rel=\"next\"], .next, [title=\"Next page\"]'))
.map(i => i.getAttribute('href')).filter(i => i)[0];
if (loc) {
document.location = loc;
}
})()
" in document 1
s/next/prev/g s/Next/Previous/ for the matching "previous page" script.Note that this requires Safari's "AllowJavaScriptFromAppleEvents" preference to be set, either via a "Develop" menu option or directly in its preferences file via, e.g., the
defaults write com.apple.Safari AllowJavaScriptFromAppleEvents -bool TRUE
shell command, and that this setting allows any program you authorize[1] to send Apple Events to Safari to potentially do Terrible Things. Given that the setting is both disabled and hidden by default, and additionally gated by an opt-in privacy preference, it's presumably an unlikely target for garden-variety malware, however.[1] Check the Automation group in the Privacy tab of the Security & Privacy preference pane for a list of programs so authorized.
See also https://chromedevtools.github.io/devtools-protocol/ with Playwright et al., even Excel VBA: https://github.com/PerditionC/VBAChromeDevProtocol
Many sites fight against automation, see https://github.com/ultrafunkamsterdam/undetected-chromedrive...
I've used them daily for 5+ years.
I use the following key-bindings ⌥⌘F or ⌥⌘S in Raycast [3] to activate a tab move to Arc from Firefox or Safari, respectively.
1: https://github.com/ayewo/raycast-script-commands/tree/main/b...
If your RSI is Carpal Tunnel or Cubital Tunnel Syndrome, a quick and easy surgery is the answer.
If your RSI is tendinitis (unlikely, for all the times I see people self-diagnose with it) rest is your best bet.
If your RSI is arthritis, there are medications and even surgeries out there to help with it, but that’s the easiest one to diagnose because it just requires looking at an x ray of your hand.
You may have carpal tunnel syndrome-like symptoms, but that likely just means you have nerve impingement somewhere between your cervical (neck area) spine and your hand.
I’m not a doctor, but through personal experience I can tell you, you probably have the power to get rid of your “RSI” without resorting to dictation software and so on.
https://www.amazon.com/Conquering-Carpal-Syndrome-Repetitive...
FWIW -- I know this isn't an RSI thread -- mine was 100% fixed by changing my desk. It was too high, and my classic 5-wheeled office chair was unstable. I lowered the desk to about 68cm (I'm 172cm) and bought a chair with wooden legs (Ikea, ~$80), started doing light stretches in the morning, and that fixed it for me.
I made the desk from Ikea cabinets and a $100 plain wooden door. So it's a) cheap, b) massive, and c) I can screw things in to the underside.
Now I use the very-average Microsoft Sculpt Ergonomic. Low keycaps, low travel. And of course a split layout.
Do not use the execrable MS mouse that comes with that keyboard. I love the MX Anywhere series, I currently use a 2 and a 3. They're light, so you can nudge them round with your fingers without having to move your arm too aggressively.
I find it really helps not having the number pad - it means my mouse can be closer to the keyboard so my wrists are straighter.
For a mouse I use a MX Master 3 which I'm very happy with.
The Anywhere is just smaller, lighter. More nimble.
I remember reading a Medium article a while ago about a software engineer who described how he addressed his "RSI", which I suspect was just TOS - he switched to an ergonomic keyboard and vertical mouse, which over a period of MANY MONTHS more or less resolved his RSI. He talked about how he still has to be careful and take breaks often. I really think, especially considering his age (20s), he could have kept the mouse and keyboard he had, if he just engaged in posture-correcting shoulder stretches and strength exercises.
This is solid advice! I had "RSI" for years (could barely type or write) and in the end what solved everything were exercises to improve my posture and strengthen my back, neck and shoulders.
Sounds about right. Nice to know there's a name for it!
Now they just need to bring back QuickDraw GX, OpenDoc and PowerTalk (please don’t for all that is holy)
/usr/bin/osascript -l JavaScript <<EndOfScript
var current_tab = Application('Google Chrome').windows[0].activeTab();
current_tab.execute({ javascript: 'alert(1)' })
EndOfScript
Once you figure it out it's not too tricky. For example, I have shell utils for converting all links on a page to "in current tab links" by removing the `target` attr on <a> tags: function chromeJS() {
INPUT="$1";
INPUT=${INPUT//\"/\\\"} ## escape quotes
INPUT=${INPUT//\'/\\\'}
/usr/bin/osascript -l JavaScript <<EndOfScript
var current_tab = Application('Google Chrome').windows[0].activeTab();
current_tab.execute({ javascript: '$INPUT' })
EndOfScript
}
...
$ chromeJS "document.querySelectorAll('a').forEach(a => a.removeAttribute('target')); alert('Made all links in-tab links!')"No esoteric attack vectors, no major new features or integrations, just a quick and easy way for any user regardless of technical ability to dump their tabs before they update firefox or reboot their system ...
... since everyone has been burned by a FF restart that, for unknown reasons, fails to restore tabs even when configured properly to do so.
As it stands, you need to dig several directories deep into /Library (or whatever, depending on your OS) and then use JSON tools to export ... I've already lost most people.
FWIW, rsync.net has an outstanding $1500 bounty for this feature[1]. Consider this an inflation adjusted bump to $2500.
[1] https://addons.mozilla.org/en-US/firefox/addon/session-boss/
I've actually had this several times with Chrome, but never with Firefox. The major point of me moving to FF actually was when Chrome lost 50 Tabs once again.
Once decompressed you have json lists of windows of tabs, including recently closed; for every tab, urls and titles of each entry in per-tab history, base64ed favicon, last selected time, and various less useful data (some still incomprehensible -- binary serialized or cache keys?). Cookies and data from extensions like treestyletabs are in there too.
OTOH... is there a currently working deserializer for Chrome's session files?
The scripts I use to do this can be found here:
Maybe I'll finish the updated version and release it soon.
feel free to check it out: https://github.com/fiveNinePlusR/tabist
https://addons.mozilla.org/en-US/firefox/addon/tabist/
https://chrome.google.com/webstore/detail/tabist/hdjegjggiog...
Makes it simple to select all tabs and copy paste as url or url + title
It's also snappy for filtering and jumping to tabs especially when using the hotkey, I've used it for years with regularly over 5k tabs.
My work laptop has around 30MB of old Tree Tabs exports I haven't gotten around to deleting.
Tablist[1] does this
[1]: https://addons.mozilla.org/en-US/firefox/addon/tablist/
1. Rewrite the backend in Go (I'm nkt qualified to audit the C version, and having Web Stuff™ interact directly with an unaudited C filesystem daemon makes my skin crawl)
2. Modularize it quite a bit to make it easier to add endpoints like...
3. Rudimentary Tree-Style Tabs support
4. Desperately try to improve the performance enough to navigate a sizable session (I have not yet succeeded)
Even after all this, I've come to the conclusion that the relationship is backwards: the filesystem representation needs to drive the browser, not the other way around.
It's my considered opinion that some hero needs to step up and build a browser that exists to render one tab and nothing else, shelling out for everything more complex than scrolling. Then the power users cwn supply their own tab/bookmark/window/filesystem schemes using whatever glue they prefer, be it python, node, shell scripts, Windows Explorer...
It's an interesting idea to pull bits of the browser back into the system, or alternatively to write a desktop environment that's also a web browser (ChromeOS?).
A former coworker used Plan9 at a previous job, and he said it was cool how you could draw a rectangle on part of a terminal, and pipe that text (as it changes) to another process. Maybe rethinking GUI (and web in particular) from a unixy/plan9y perspective is a worthwhile exercise.
I grew up on Windows, and then there was the browser, and now everything is just the browser.
Care to share your fork? Go works better for me.
Caveat _extremely_ emptor: This code works on my machine, and I have no recollection of how it came to be that way. There are undoubtedly bugs, both obvious and subtle, in both halves. The Go side is a pile of garbage (in no small part because of the countless interfaces it has to implement).
It is EXTREMELY unlikely that either the server or extension is compatible with its original counterpart. The filesystem layout itself has been reorganized more along the lines of /sys conventions.
I started using Obsidian recently, so I am moving my bookmark archive into there. It's neat because you can right-click>copy a bookmark folder, then paste into Obsidian as markdown links, with the page title as the link text (I think it's Firefox doing this, but not sure. I had to get a "copy as markdown" extension for Chrome). I also use the multi-select "bookmark tabs" feature, and Firefox Sync to move tabs between devices. These three things in combination enable me to make closing tabs a regular, routine thing, because I now know that I can find them again when I need them. Instead of going into the black hole of my bookmark toolbar, they go into an Obsidian vault, a single folder full of markdown files. This means I can use my normal CLI tools and text editor (keyboard instead of mouse is a big part of the appeal here) to search, sort, and organize things.
The detailed organizational principles vary based on the purpose of the bookmarks, and I think that's mostly a personal thing. I don't have some sort of well-defined technique, but for example I now put the "project research link dump" into the "project notes file" (where it obviously belongs, but I was too lazy to do this previously). I have a few different "optimistic learning links" lists, like one for productivity software tools, which I might randomly browse when I have some down time at work. Another for interesting-but-not-important-for-work videos on math, physics, CS.
Now, instead of thousands of links and hundreds of folders, my bookmark toolbar can be used for just a handful of "webpages that I use frequently" - the intended purpose of the bookmark toolbar, as far as I can tell.
Well, now I want to expand on this a bit in a blog post, but I'll have to come back to that.
That's basically uzbl. The core version has no tabs, no bookmarks, no history, and is extensible in whatever language. Seems it's been abandoned, though.
Is that not what your OS's 'native' web view API is?
I fear the current web is too complicated for that. All hope is lost, the web cannot be salvaged.
>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-75344738...)
They hate their users so much they're perfectly willing to compromise their security. "This extension is not actively monitored by Mozilla". But you can't do the responsible thing and build it from source yourself.
Even installing the "Developer Edition" didn't enable to me to install self-built extensions (yes, with that secret flag). And it doesn't even tell you that it doesn't accept unsigned extensions, they claim that the extension is "broken".
The fuck?! This is Apple-level user hostility. Meanwhile Mozilla execs are getting Apple exec-style compensation while driving it further into the ground.
What is the situation surrounding Manifest V3 in Chromium? Won't that throw a wrench into power user's workflows with its own arbitrary limitations?
But of course I'm worried about Chromium going the way of the third E, which makes it quite possible I'll continue the toxic relationship with Mozilla for even longer.
...this one?
>>Even installing the "Developer Edition" didn't enable to me to install self-built extensions (yes, with that secret flag).
I would guess that they are trying to install is actually broken.
And Mozilla still doesn't scan or do any due diligence on whatever it is you are installing.
It's likely you forgot to include the browser_specific_settings with a some arbitrary id in the manifest.json.
Permanently installing unsigned extensions definitely works in the Developer Edition after setting the pref in about:config.
I understand the frustration and would also like improved control, but I understand firefox preventing this in the "normal" edition as it's very common for trojans to install unwanted extensions manually by fiddling with the profile files, I've had to remove them manually from family computers in the past.
Host a web server, kill the web-server, try to visit the URL, open inspector and look chrome.
Examples:
"<script xmlns="http://www.w3.org/1999/xhtml" src="chrome://global/content/neterror/aboutNetErrorCodes.js"></script>"
Visit chrome://global/content/aboutNetError.mjs in your firefox browser. Why is Firefox accepting chrome:// URI's?
You can even browse: chrome://global/skin/icons/
Visit: jar:file:///usr/local/lib/firefox/omni.ja!/chrome/
(i'm on freebsd, so if linux: /usr/lib/firefox/omni.ja!/chrome or something) too drunk to care. The internet is fucked.
Firefox version: 109.0 (64-bit)
root@cuddles:/usr/crystal/doublerabbit/ # pkg install chromium Updating FreeBSD repository catalogue... FreeBSD repository is up to date. All repositories are up to date. The following 3 package(s) will be affected (of 0 checked):
New packages to be INSTALLED: chromium: 109.0.5414.119 noto-basic: 2.0_1 sndio: 1.9.0
Call me skeptical, what a coincidence. Convince me.
https://developer.mozilla.org/en-US/docs/Glossary/Chrome
https://www.nngroup.com/articles/browser-and-gui-chrome/
> 'Chrome' is the user interface overhead that surrounds user data and web page content.
Browser/GUI's "chrome" terminology existed before google "chrome" browser. That's why you use "userChrome.css" to modify the visual look by yourself.
For a different perspective, I’ve successfully done this on both Windows and Linux. In both cases it was pretty straightforward. (My extension was admittedly very simple, though… maybe it’s different with more complex ones.)
However, we shouldn't forget the reduced security of the situation. This opens entirely new attack vectors by introducing the otherwise fantastic ability of local programs to consume network input.
With the flexibility and utility of local information comes additional remote attacks. In doing so, this extension blurs the lines between the greater difficulty of remote attacks vs local attacks. Many programs never considered in their threat models that input would come over the network. There are many developers who never try to protect past a certain point, saying, "if the person gets this far, there is nothing we can do anyway", then they ship.
I mean, any script on my machine can use these tools to interact with network input and execute untrustworthy code...
I do not per se see a problem with "network input" but I think you're referring to input from untrusted sources, i.e. input that is not controlled or approved by the user of the tools.
I think that a modern operating system must definitely have access controls that can flag and signal when input is untrusted, wherever the source may be, network, keyboard, USB stick, camera, whatever. If the input is from a network source such as el rando website, then an AAA-layer service can block, flag, log, and handle an exception, rather than forcing every tool and every application to track the provenance of every byte of input. Don't you think?
The hyperbole isn't needed. Risk can be avoided, mitigated, transferred, or accepted. This extension, which otherwise looks fantastic by the way, moves the risks between those categories for various local tools, the data in the DOM, and even for remote accounts of the other current websites. That is what is happening here.
> I do not per se see a problem with "network input" but I think you're referring to input from untrusted sources, i.e. input that is not controlled or approved by the user of the tools.
That is the implication of saying network input, since that input is uncontrolled and from a third party.
Hey, it is easier to authenticate and authorize network input than keyboard input, considering what sort of USB devices are floating around.
(Fantastic extension, btw.)
This reminds me of a blog post [1] I read before. Pertinent quote:
> Unbeknownst to me, even with --dry-run pip will execute arbitrary code found in the package's setup.py. In fact, merely asking pip to download a package can execute arbitrary code (see pip issues 7325 [2] and 1884 [3] for more details)!
Also seen on Twitter [4].
[1] https://moyix.blogspot.com/2022/09/someones-been-messing-wit...
[2] https://github.com/pypa/pip/issues/7325
your cookie jar is somewhere in ~ (eg ~/.firefox)
If a service has been compromised such that it can exfiltrate /mnt/blah/tab/blah/, it can also exfiltrate ~/.firefox/blah
You're shuffling deck chairs on the titanic.
In this particular scenario, the article describes the use of FUSE for mounting the files. FUSE stands for "Filesystem in Userspace". This, thankfully, doesn't force running a web browser as root, which would be required in your scenario.
It would not in any way shape or form be required in my scenario. Please re-read the basics of file permissions on POSIX.
We are asking the question: "Does this expose additional potential security vulnerabilities not exposed with the cookies existing purely in the normal cookie store?"
Our possible vectors of attack are a compromised root owned service and a compromised user owned service. Both of those vectors would allow the cookie store to be exfiltrated regardless of whether this extension is used.
Ergo, this extension does not create any additional security vulnerabilities in that regard.
Sideberry allows selecting arbitrary groups of tabs and copying them to the clipboard as an indented list of tabs. The site I put up will reopen those tabs, preserving the order and parent-child relationships between pages. It also uses `rel=noopener` to avoid a security risk I've noticed with similar sites in the past with parent-child page references. And it has no advertising and absolutely zero user tracking (aside from Netflify serverside logs that I can't turn off), since it's a project I made for myself and costs me nothing to run.
Also, the entire source (minus the favicon) is in one page, so if you want to self-host it yourself for extra protection, just view-source and copy and paste. It'll work on any static web host.
I've found this to be a hugely beneficial replacement for bookmarking. Bookmarks are too slow and cumbersome for me, so I end up not really using them. It's also annoying to enter descriptions for bookmarks, and I don't like that all of my bookmarks need to be in the browser at the same time. This allows me to copy tabs out to separate files (I use org-mode to sort everything). And then I just keep this site pinned and use it to reopen tabs later if I context-switch. It's the closest I've ever come to being able to actually manage my browser sessions and stop my tabs from growing out of control into the thousands.
I was going to wait to Open Source it and write up a better explanation of the workflow I use before sharing it, but it's appropriate to share it here. It's not nearly as powerful as what TabFS is talking about (and I'm very interested to look into TabFS more, since I've been thinking about roughly the same problem, and this looks like a potentially quite powerful setup), but it's a small system that has made a big impact for me over the past week or so, and since I was already using Sideberry it doesn't require me to install anything new or open any additional attack vectors.
Yes and no. While it simplifies things to an extent, it's also confusing, especially with extension-less files.
Example: Tell me, is this a file or directory?
~/hn/today-posts
It could be a file that curls todays posts, or it could be a folder (directory) that contains them./dev/readme.dev
To know what this is, a `stat(2)` is required.
It gets worse when you deal with sysfs or procfs and similar. It all becomes obscure magic, like what values can be written into what file, why some files aren't readable, or the contents of files being just a bunch of numbers which you have no way of interpreting.
Another problem is that there's way too many of different file types and they aren't organized into any kind of hierarchy or any other meaningful order. This makes tools like rsync extremely complicated, with loads of footguns and still not solving the problem well. It feels especially bitter because in exceeding majority of cases you don't want tools like rsync to deal with named FIFO or device files or sockets etc. but you get accidentally but painfully bitten by them every now and then.
A directory is a file (and IIRC e.g. Plan 9 decided they should be readable just like normal files and there shouldn't be any special readdir syscalls). You can see its attributes to figure out the rest.
If not for strong Linux limitations (because of alleged hardlink knot-tying problem) and belief that it just cannot be both, transparent archive access through a filesystem would be a thing. As well as metadata access (`play ./file.mp3` vs `edit ./file.mp3/id3v2`). People of the past seemed to have paid great attention to interoperability and effort to make common interfaces; folks of the modern age ('00s and later) love unique and completely incompatible solutions to the same problem.
This was possible in the beginning. But then came the moral police and deprived us of this freedom, because they deemed it to be "confusing".
See, for example, The Unix Programming Environment, by Kernighan and Pike, page 51 [0]:
Despite their fundamental properties inside the kernel, directories sit in the file system as ordinary files. They can be read as ordinary files. (...) The time has come to look at the bytes in a directory:
$ od -cb .
[0] https://archive.org/details/UnixProgrammingEnviornment/page/...stat(1) will provide additional information on a file.
file(1) will not only distinguish between filesystem=level distinctions, but will make a remarkably good guess as to what the file contents of a normal file are, based on magic(5).
cat /mnt/imdb/movies/tt0103064/director/details.json
cat /mnt/imdb/actors/by_contains_name/arnold/roles.csv
Or any graphql sourceI've also been considering some sort of filesystem for MQTT, which combined with an appropriate bridge would allow for reading and control of assorted smart devices as a filesystem.
A data type aware interface like AppleScript or COM, if universally supported, would be more expedient.
And so? The mantra says "everything is a file", not "everything is only a file". You can provide stream access to everything, and then more advanced access to some particular resources.
Providing just a generic interface cuts two ways: On the one hand, you can represent anything, but on the other hand, you don’t know what anything represents without additional information (metadata).
Four fake file systems! (9 mins) https://www.youtube.com/watch?v=pfHpDDXJQVg
i.e. screenshots, torrents, youtube, git.
1. I couldn't get this working on my M1 Mac due to MacFUSE issues.
2. I wish there was a version for Firefox.
I think this is such a cool project, and I want this to work really badly. I have many workflows where I'd like to log data for certain sites I visit it plain text for further analysis. And long term storage.
The suggestion in the thread is to use the developer edition which is, in lineage, essentially aurora/alpha version (in the past naming scheme) and contains bugs and security holes.
With modern Firefox if you want software freedoms you have to give up safety... or use the unbranded version which has no auto update and manually re-install the browser for every update.
[0] https://extensionworkshop.com/documentation/publish/submitti...
I regrettably don't know the guts of NFS enough to know how much of FUSE can be ported, but my guess would be "perfect is the enemy of good" for folks who otherwise can't even run this right now
Design doc: https://github.com/buildbarn/bb-adrs/blob/master/0009-nfsv4.... Code: https://github.com/buildbarn/go-xdr
Endless fun meditations & musings on code & processes & computing. It's the most live, most inove stream of computing out there.
:)
lz4jsoncat ~/.mozilla/firefox/YOUR_PROFILE.default/sessionstore-backups/recovery.jsonlz4 | jq '.windows[].tabs[] | .index as $a | .entries[$a-1] | .title,.url'
So often I want to automate parts of my web experience, and I think ugh I need a browser extension, or user script, or puppeteer. All of which feel clunky for trying to do something simple.
Seems like this will get me 90% of the way for most things, then when I need to click a button or automatically respond to an automatic email, that's just a few lines of code and a cron job away.
It's really good, and use it a lot of times. Doesn't seem to be an active project anymore though but it still works
If this can identify the window (PID or better WindowID like wmctrl -l lists) it will be perfect!
I have dozens of windows, each with thousands tabs and this is something I would have dreamed of if I knew that it was possible.
Really kudo to this guy for that!
https://github.com/atomontage/osa-chrome https://melpa.org/#/osa-chrome
The author directly mentions Emacs twice and one of their liked tweets says "in practice most of my logical 'windows' are actually browser tabs or Emacs buffers": https://twitter.com/rsnous/status/1176587656915849218
I have 168 tabs open and regardless of how hard i organize them, it's still a mess. I will give this a try today.
Is there an API contract defined and documented anywhere?
I'm specifically hoping to use this with Qutebrowser
It has been one of my favorite things about this browser as you can quickly write up easily maintainable user scripts in Python compared to whatever unmaintainable magic greasemonkey scripts end up being.
Fuse does not support windows. If it did the extension could probably be easy to port..
Your best bet is probably running the browser under some wsl layer.
Not saying it shouldn't support windows, but choosing Linux and MacOS as initial support is a sensible choice...
Usually when you have that many tabs open, it's not because you read/work on the pages.