Skip to content

Rewrite in Python with uv, zero external dependencies#11

Open
joeharris76 wants to merge 3 commits into
mokolabs:mainfrom
joeharris76:main
Open

Rewrite in Python with uv, zero external dependencies#11
joeharris76 wants to merge 3 commits into
mokolabs:mainfrom
joeharris76:main

Conversation

@joeharris76
Copy link
Copy Markdown

@joeharris76 joeharris76 commented Jan 23, 2026

We (Claude Code and I) replaced the Ruby implementation (sqlite3, markaby, htmlbeautifier gems) with a Python package using only stdlib modules and managed by uv.

We also added the ability to save the current tab groups into Safari's plist so you can interact with them directly in the browser, although sadly it usually requires restarting Safari to see the new bookmarks.

Works great for my use case so I'm sharing it here in case it's of interest.

joeharris76 and others added 3 commits January 23, 2026 09:15
Replace Ruby implementation (sqlite3, markaby, htmlbeautifier gems) with a
modern Python package using only stdlib modules. Managed by uv with hatchling
build backend.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Introduces a `save` subcommand that reads tab groups from SafariTabs.db
and writes them as bookmark folders into Safari's Bookmarks.plist. Creates
a top-level "Tabby" folder with profile subfolders. Idempotent on re-run,
with automatic backup and atomic writes. Refactors CLI to subcommands
while preserving backward compatibility (`tabby [path]` still works).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@joeharris76
Copy link
Copy Markdown
Author

Here's how it looks for me after saving my tab groups…
Screenshot 2026-01-23 at 10 28 53

@mokolabs
Copy link
Copy Markdown
Owner

Hey Joe — apologies for the slow response here. I wanted to give this the attention it deserves and it took me a while to get there. Thanks for your patience.

...

This is a substantial PR and I really appreciate the effort you've put into this.

I’ve been thinking about the best way to handle this, and I think I’d prefer not to merge it directly. Tabby (Ruby) is something I use personally and depend on for my own CLI automation, so I’d like to keep that as the canonical codebase rather than maintain two implementations in one repo.

That said, your Python port absolutely stands on its own (especially with the much simpler install and new import feature). It definitely shouldn't sit around in a closed PR. It deserves a more visible home where it can be maintained and improved independently.

Would you be open to publishing this in its own repo under your account — something like tabby-py?

If you’re open to that, here's how we could do it:

Python version:

  • Move your fork to a new repo named tabby-py (or something similar).
  • Update the README with a link back to the original Tabby repo.
  • Keep the existing MIT license text, but stack the copyright lines:
    Copyright (c) 2024 Patrick Crowley
    Copyright (c) 2026 Joe Harris
    

Ruby version:

  • Update the README with a link to your new tabby-py repo.
  • Close this PR but also add a link back to your new repo.

Let me know what you think, and thanks again for the thoughtful work here!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants