Beautitab → Tab Candy Rebrand & Refactor #3
lvnacy
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Beautitab → Tab Candy Rebrand & Refactor
Summary
This PR is a ground-up rebuild of Tab Candy (forked from the abandoned Beautitab) into a modern, mobile-safe, tested Obsidian plugin. Every layer of the project — toolchain, data model, runtime APIs, UI architecture, file layout, and CI — was rebuilt from first principles rather than patched incrementally. Nothing user-facing about the plugin's purpose changed; nearly everything about how it's built and maintained did.
What changed
Toolchain & branding — Migrated to pnpm, a modern ESLint flat config, and a unified ES2020 build target. Rebranded as a genuinely new plugin (
tabcandy, not an upgrade path from Beautitab) with consistent naming throughout.Settings & data — Settings are now versioned and validated at load time, so malformed or legacy data can't corrupt state. A typed
SettingsStorereplaced an untyped, actually-broken pub/sub implementation.Mobile support — This was the core motivator. All
fs/path/Electron-dependent features (background sync, image loading) were rebuilt on vault-relative APIs, making the plugin fully functional on mobile for the first time. Manually verified working on-device.Obsidian API compliance — Migrated to
ItemView, replaced blanket "hijack every new tab" behavior with an explicit command plus an opt-in convenience toggle, and isolated all private/internal API access (bookmarks, commands, internal plugins) behind guarded adapters that fail closed instead of throwing.UI architecture — The React layer was restructured into hooks and presentational components with a real separation of concerns, and the whole source tree was consolidated from a scattered set of folders into a single coherent
src/.Type safety — A dedicated hardening pass eliminated remaining
any/unknownusage and consolidated all types into one source of truth.Testing & CI — Added a Vitest suite (~200+ tests) covering settings normalization, backgrounds, bookmarks, commands, and view lifecycle, with a coverage ratchet that prevents regression. PR-gated CI and a release workflow were built from scratch.
Feature changes — Two long-broken integrations (Unsplash-based seasonal backgrounds, the Quotable quotes API) were removed outright rather than left silently non-functional, since neither had a working, maintainable replacement.
Bugs fixed along the way
Several real, pre-existing bugs surfaced during the rebuild: a broken
Observableunsubscribe, mistyped settings callbacks, a bookmarks-render crash on folder bookmarks, a stale Sass import silently blocking every production build, and a tab-focus bug where hijacked tabs misdirected file navigation.Verification
typecheck,lint,test, andbuildare all clean. Manual mobile verification is complete. Remaining pre-publish items (community plugin listing requirements, final README polish) are tracked separately and are not blockers for this PR.This discussion was created from the release Beautitab → Tab Candy Rebrand & Refactor.
All reactions