Releases: emichaud/smallstack-tabler
Release list
v0.10.3: Fix dropdown/modal transparency regression
Hotfix for a regression introduced in v0.10.2. If you pulled v0.10.2 and noticed the apps-grid dropdown, modal panels, or list groups rendering transparent over content — this is the fix.
What broke
v0.10.2 cleaned up our tabler_overrides.css to stop shadowing Tabler 1.4's cool dark palette. Part of that cleanup removed our explicit --tblr-card-bg assignment from the body.theme-dark block, expecting Tabler 1.4's defaults to take over.
But Tabler 1.4 only defines --tblr-card-bg scoped to .card elements themselves (.card { --tblr-card-bg: var(--tblr-bg-surface); }) — not at the root. On non-.card elements that our overrides target (.dropdown-menu, .modal-content, .list-group-item, plus the ported SmallStack components), var(--tblr-card-bg) resolved to empty/transparent.
Visible symptom: clicking the apps-grid dropdown (top-right square icon) opened a transparent panel; the dashboard content bled through every menu item.
What's fixed
A one-line addition to the dark-mode root block: re-expose --tblr-card-bg pointing at Tabler's globally-defined --tblr-bg-surface. Both resolve to #1f2937 (Tailwind slate-800) so visuals on .card elements are unchanged. Off-card elements now get the proper opaque slate-800 surface instead of falling through to transparent.
Also updated our SmallStack --card-bg alias to point at var(--tblr-bg-surface) directly for the same reason.
Verified
Debug overlay reading computed CSS-var values on document.documentElement in dark mode:
--tblr-card-bg: #1f2937(was empty in v0.10.2)--card-bg: #1f2937(was empty in v0.10.2)--tblr-bg-surface: #1f2937(always was, unchanged)
Visually: apps-grid dropdown renders as a solid slate-800 panel. No bleed-through.
Upgrade
git pull origin main
# One-line CSS change. No tests/migrations/dependencies affected.If you're already on v0.10.2 and seeing transparent dropdowns/modals: this is your fix.
🤖 Co-Authored-By: Claude Opus 4.7 (1M context)
v0.10.2: Tabler 1.4 dark-mode vibrancy restoration
Patch release — restores Tabler 1.4.0's native cool slate dark palette. No feature changes; the dark theme just looks the way Tabler 1.4 intended.
Why
When we bumped to Tabler 1.4.0 in v0.10.1, the upgrade spec called out a deferred "judgment pass" on our --tblr-* overrides — visual smoke would expose anything actively wrong. It did. Side-by-side vs preview.tabler.io, our dark mode read as dim, warm, slightly brown-tinted; Tabler's preview reads as crisp, cool, modern slate.
Root cause: our tabler_overrides.css still shipped beta20-era warm-gray defaults (#1a1c23 body, #212329 card, #2c2e34 border) that explicitly shadowed Tabler 1.4.0's cool Tailwind slate scale (#111827, #1f2937, #374151).
What changed
A single ~30-line deletion in apps/tabler/static/tabler/css/tabler_overrides.css:
- Dropped the
[data-bs-theme='dark']11-step warm gray scale that shadowed Tabler 1.4's Tailwind slate scale - Dropped the explicit
--tblr-body-bg/--tblr-card-bg/--tblr-border-color/ etc. assignments inside the dark-mode aliases block - Dropped the redundant
background-color/colorself-set on body (Tabler 1.4 already does it via[data-bs-theme=dark])
Kept all SmallStack-var aliases (--body-bg, --card-bg, --body-fg, --border-color, --hairline-color, --input-border, --muted-fg, --body-quiet-color, --code-bg), all .theme-dark / [data-bs-theme="dark"] component selectors below, the accent color, all ported SmallStack layout classes, and every other component override. Aliases reference var(--tblr-*) so they auto-pick-up Tabler 1.4's new cool values.
Verified
Pixel-sampled the rendered home dashboard:
| OLD | NEW | |
|---|---|---|
| body bg | #1a1c23 (warm near-black) |
#111827 (Tailwind slate-900) |
| card bg | #212329 (warm) |
#1f2937 (Tailwind slate-800) |
| border | #2c2e34 (warm gray) |
#374151 (slate-700, cool blue-gray) |
- 749 tests pass, 26 starter_content tests deselected (intentional)
- Smoke
/,/accounts/login/,/smallstack/explorer/,/smallstack/api/health/,/smallstack/mcp/health/,/smallstack/tokens/all render correctly - Tabler 1.4's modern dark mode now propagates through every component without being shadowed by our beta20-era values
- The visible win: cards have proper lift off the page (slate-800 on slate-900), borders read as cool blue-gray instead of olive-brown, chart sparklines POP against the new card backgrounds
Downstream impact
Most projects (those that extend our tabler/base.html) get the visual fix for free on git pull origin main. They'll see the dark mode shift from warm-bunker to cool-slate immediately.
Projects with a forked tabler_overrides.css should compare their fork to this commit (ad12020) and re-apply the deletion to get the same visual upgrade.
Upgrade
git pull origin main
# No migrations, no new dependencies, no template changes.🤖 Co-Authored-By: Claude Opus 4.7 (1M context)
v0.10.1: Tabler 1.0.0-beta20 → 1.4.0 alignment
Patch release — brings the bundled Tabler version in line with preview.tabler.io. No feature changes; the chrome just renders the way it's supposed to.
Why
The project was pinned at @tabler/core@1.0.0-beta20 — a year-old beta — and the rendering drifted from preview.tabler.io (which ships 1.4.0). Symptoms:
- Subtle shadow / border-color mismatches on dropdowns, popovers, focus rings
- Accent color changes left fragments of the previous accent behind in places that only
tabler-themes.min.csswould catch - Glyph differences (italic
g, numerals) because Inter was loaded from Google Fonts (static weights 300–700) instead of the rsms.me variable build Tabler was designed against
What changed
Three template touchpoints, each getting the same four edits:
apps/tabler/templates/tabler/base.htmlapps/tabler/templates/registration/tabler_auth_base.html(auth scaffold — was also on the old CDN)apps/preview/templates/preview/base_preview.html(was on1.2.0, a different mid-version drift point — also aligned to 1.4.0)
Each one now loads:
<!-- Inter (variable font, matches preview.tabler.io exactly) -->
<link rel="preconnect" href="https://rsms.me">
<link rel="stylesheet" href="https://rsms.me/inter/inter.css">
<!-- Tabler core -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/core@1.4.0/dist/css/tabler.min.css">
<!-- Tabler color-palette + theme variations (required for accent-color switching to fully cascade) -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/core@1.4.0/dist/css/tabler-themes.min.css">
<script src="https://cdn.jsdelivr.net/npm/@tabler/core@1.4.0/dist/js/tabler.min.js"></script>Plus a mechanical CSS edit: 55 .theme-dark selectors in apps/tabler/static/tabler/css/tabler_overrides.css paired with [data-bs-theme="dark"] for forward compat with Tabler 1.4 (which targets the [data-bs-theme] attribute on <html>). Body class still applied by our blocking theme script, so both selectors stay valid; the paired form just keeps us cascade-clean on either signal. body:not(.theme-dark) light-mode selectors left untouched.
Theme-JS vocabulary (data-bs-theme-base|font|radius values) verified against Tabler 1.4 — all match. Our custom comic font value is owned by tabler_overrides.css and not in conflict with 1.4.
Downstream impact
- Most downstream projects (those that extend our
tabler/base.htmlandtabler_auth_base.htmlrather than forking) get the upgrade for free ongit pull origin main. Re-runmake test+ visual smoke and you're done. - Downstream projects with a forked base.html or tabler_auth_base.html need to re-apply the four URL changes manually. The new "Upgrade history" section at the bottom of
docs/skills/tabler/troubleshooting.mddocuments exactly what to change. - The 20+ Tabler skill files under
docs/skills/tabler/(the canonical vibe-coding reference) were updated in lockstep — they no longer point at the old CDN.
Stats
- 749 tests passing, 26 starter_content deselected (intentional), 74% coverage
- Django check clean
- All 4 new CDN URLs return 200 (verified pre-push)
- Visual smoke clean on
/,/accounts/login/,/smallstack/explorer/,/smallstack/api/health/,/smallstack/mcp/health/
Upgrade
git pull origin main
# No migrations needed. uv sync --all-extras if you want the dev extras.Reference
Full upgrade spec lives at ai_cowork/tabler-1.4-upgrade-spec.md.
🤖 Co-Authored-By: Claude Opus 4.7 (1M context)
v0.10.0: Merge upstream (API admin, modern-dark theme, AI docs)
Merges 25 commits from django-smallstack v0.10.0 into the Tabler-themed downstream, with theme integration so the new pages render cleanly inside the Tabler chrome.
What's New from Upstream
API admin module — apps/api/
/smallstack/api/health/— schema validity, endpoint registry, Swagger / ReDoc shell checks, OpenAPI 3.0.3 validation. Same checks asmanage.py api_doctor— refresh to re-run./smallstack/api/activity/— per-endpoint operational view: top endpoints over 24h with hits / avg latency / error rate, recent/apirequests with filters (method, status, IP, user, scanner-UA-only), threat-signals panel surfacing axes lockouts, auth-failure bursts, path scanning, request bursts, scanner user-agents, revoked-token useapi_doctormanagement command — health checks + self-test (schema · openapi · sample)- Dashboard widget on
/smallstack/ - Nav entry "API Health" in the staff sidebar
Modern-dark theme overhaul (upstream base)
Upstream rebuilt the SmallStack default palette system: cool-biased near-black surfaces (#161b22 cards), vibrant Tailwind-style accents (django→emerald, blue, purple, orange, high-contrast). Introduces the --accent-band-bg variable as a single-point band override.
This downstream uses Tabler, so the modern-dark theme is not in use here — but the new SmallStack templates still work because tabler_overrides.css aliases the SmallStack variable names (--primary, --card-bg, --body-fg, etc.) to their --tblr-* equivalents. No template rewrites needed.
AI docs (upstream)
docs/skills/cli-tools.md— task → tool / failure → tool decision treedocs/skills/modern-dark-theme.md— upstream base theme patterns (NOT in use in this downstream)docs/skills/modify-palettes.md— upstream palette guidedocs/skills/api-doctor.md— API admin pages reference- Project-level
CLAUDE.mdat the repo root
Tabler Integration
Two Tabler-specific adjustments sit on top of the merge:
docs/skills/README.md— the conflict in the "before X, read Y" section was resolved by keepingtabler-ui.mdas the read-first for any page work in this downstream, surfacingcli-tools.mdfor operational tasks, and explicitly noting thatmodern-dark-theme.md/modify-palettes.mddescribe the upstream base theme that does NOT apply here- Root
CLAUDE.mdrewrite — replaces upstream's modern-dark-theme-centric guidance with a Tabler-aware version that routes AI agents todocs/skills/tabler/*.md, documents theapps/tabler/structure (bridge templates, CSS overrides, theme engine), and explains the SmallStack-var aliasing strategy. Includes Tabler-specific anti-patterns ("don't follow modern-dark-theme.md", "don't forget to re-init Bootstrap JS after htmx swaps", etc.)
No CSS work was needed for the new /smallstack/api/health/ and /smallstack/api/activity/ pages — they use the same SmallStack classes/vars (.page-header-bleed, .page-header-with-actions, .crud-form, var(--primary), var(--card-bg), var(--body-fg), var(--body-quiet-color), var(--success-fg)) that were already aliased and ported into tabler_overrides.css during the v0.9.2 merge. Verified visually with shot-scraper.
Stats
- 749 tests passing, 26 starter_content tests deselected (intentional), 74% coverage
- 1 new Django app registered (
apps.api); existingapps.preview/apps.mcp/apps.tokenmgrretained - No new migrations needed
openapi-spec-validator(dev extras) required to run the new OpenAPI validity test —uv sync --all-extrashandles it
Upgrade
git pull origin main
make setup # uv sync + migrate + create_dev_superuser
uv sync --all-extras # for the new openapi-spec-validator dev dep🤖 Co-Authored-By: Claude Opus 4.7 (1M context)
v0.9.2: Merge upstream (MCP, token manager, home redesign)
Merges 54 commits from django-smallstack v0.9.2 into the Tabler-themed downstream, with theme integration so the new pages render cleanly inside the Tabler chrome.
What's New from Upstream
Model Context Protocol (MCP) server — apps/mcp/
- Full JSON-RPC dispatch with OAuth 2.0 (PKCE, Dynamic Client Registration, authorize / token / revoke endpoints, metadata discovery)
@tooldecorator + auto-discovery (autodiscoversviews.pyandmcp_tools.pyin every app)- CRUDView factory —
enable_mcp = Trueon a CRUDView derives list/get/create/update/delete tools automatically - Per-action and per-model description maps,
mcp_singular/mcp_pluralfor consistent tool naming mcp_doctordiagnostics command andmcp_smokeend-to-end test command/smallstack/mcp/admin dashboard with Health, Tools registry browser, Activity (RequestLog filtered by/mcppath), self-test runner- 55-test suite covering dispatch, factory, OAuth, PKCE, tenancy, X-Forwarded-Proto, session-login rejection
- Dashboard widget on
/smallstack/
Token Manager — apps/tokenmgr/
- Self-service UI for the existing
APITokenmodel. Any user can mint a read-only token; staff can mint at any access level for any user - List page with search + filter dropdowns (active/user/token type/access level) and inline revoke
- Mint and "reveal once" pages
- Dashboard widget with active/revoked counts
- 37 tests covering the permissions matrix
- MCP OAuth consent page deep-links to tokenmgr for self-service management of granted tokens
Other
- Home page redesigned as an editorial product page (
templates/website/home.htmlrewritten; content extracted toapps/smallstack/templates/smallstack/pages/home_content.html) - Pagination fix —
page_range_displayattached on every list-pagination path - OpenAPI 3.0.3 spec validated on every test run
api-smokeandmcp-smokeend-to-end commands- Heartbeat migration 0006 adjusting epoch options
apps/smallstack/api.pyexposesserialize/search/filterhelpers as public APIusermanager.viewscleaned up:@staff_member_requiredreplaces@login_required + @user_passes_test
Tabler Integration
Two Tabler-specific commits sit on top of the merge to make the new pages render cleanly in the Tabler chrome:
- CSS variable aliases — Map SmallStack-style
var(--primary),var(--card-bg),var(--body-fg),var(--body-quiet-color),var(--body-bg),var(--border),var(--hairline-color),var(--input-border),var(--code-bg),var(--message-warning-bg),var(--delete-button-bg),var(--font-monospace),var(--radius-sm),var(--control-height)to their--tblr-*equivalents in both light and dark modes. Upstream templates render correctly without per-template rewrites. - Ported SmallStack layout + form classes that the new MCP and tokenmgr pages depend on:
.page-header-bleed,.page-header-with-actions,.page-header-content,.page-subtitle(the tinted bleed header).crud-form .crud-field/label/help/error/actions,.has-error(form-rendering scaffolding).list-toolbar,.list-toolbar-search,.list-toolbar-filter,.list-toolbar-overflow-toggle/-panel,.list-toolbar-count,.list-toolbar-clear(search + filter dropdown toolbar)
pyproject.toml— skip@pytest.mark.starter_contenttests by default (the marker is documented as "safe to skip in downstream projects" — they assert upstream home-page copy that doesn't apply to our Tabler dashboard home)
Verified visually at /smallstack/mcp/health/, /smallstack/mcp/tools/, /smallstack/tokens/, and /smallstack/tokens/create/ in both light and dark themes with the amber accent.
Stats
- 708 tests passing, 26 starter_content tests deselected (intentional), 73% coverage
- 2 new Django apps registered (
apps.mcp,apps.tokenmgr);apps.previewretained alongside - 2 new migrations applied (
heartbeat.0006,mcp_server.0001)
Upgrade
git pull origin main
make setup # uv sync + migrate + create_dev_superuser🤖 Co-Authored-By: Claude Opus 4.7 (1M context)
v0.8.35: Comprehensive Tabler UI Skill Set
What's New
This release reorganizes and dramatically expands the Tabler UI documentation that AI agents (and humans) use when building pages in this project.
Comprehensive Tabler skill set
The previous single tabler-ui.md (1,105 lines, flat reference) is now a routing index pointing to 20 specialized skill files under docs/skills/tabler/:
Foundations — foundations.md, theming.md, layouts.md
Components — components.md, icons-typography.md
Forms & data — forms.md (Flatpickr, Choices, tom-select, Imask, Dropzone, Signature Pad, Star Rating, NoUiSlider, wizards), tables.md, charts.md, maps-calendar.md (jsVectorMap, FullCalendar, Sortable.js)
Interactivity — htmx-patterns.md
Page recipes — page-dashboards.md, page-landing.md, page-content.md, page-api-explorer.md, page-auth.md, page-utility.md (kanban, todos, calendar, file manager, inbox)
Meta — customization.md, troubleshooting.md
Every skill cites real in-repo files, links to preview.tabler.io and docs.tabler.io, and includes copy-pasteable Django + Tabler snippets with SmallStack-specific gotchas.
Other changes
- Adds 20 new Tabler skill entries to
docs/skills/index.json(including the previously-unindexedtabler-ui.md) - Refreshes
docs/skills/README.mdwith a dedicated Tabler section pointing to the new router - Slimmed
tabler-ui.mdfrom 1,105 → 92 lines (now a router + project rules)
Stats
- 19 new files, ~8,300 lines of comprehensive Tabler documentation
- 544 tests passing, 69% coverage
- All Tabler skills now discoverable via
index.json
Upgrade
Pull the latest:
git pull origin mainNo code or migration changes — documentation-only release.
🤖 Co-Authored-By: Claude Opus 4.7 (1M context)
v0.8.34
What's new
- Add upstream workflow skill documenting how smallstack-tabler relates to django-smallstack
- Configure git remotes:
origin→ smallstack-tabler,upstream→ django-smallstack - Merged upstream through v0.8.33 (inline worker, help content relocation, Django 6.0.5)
- 544 tests passing