Summary
Started as the UI polish pass (#7) and grew into the feature round from #5/#6. Six areas, in commit order:
UI polish (#7)
Consistent page headers, mobile nav (sidebar no longer swallows the viewport below lg), working 1–7 keyboard shortcuts, status-colored pills, dead buttons removed, hover/focus states everywhere, favicon.
Fixes
@ts-charts/chartswas alink:to a nonexistent target breakingbun install; the chart helpers are now vendored (~30 lines) because the published @ts-charts packages declare abunexport condition pointing at unshippedsrc/and can never bundle under Bun (this is also why the analytics chart never rendered).- dtsx emits unparseable d.ts for module augmentations (
interface Xextends); router build repairs it post-build. Upstream: stacksjs/dtsx#3103.
Real queue (#5)
Composer drafts and a schedule picker persist posts/post_targets rows; the Queue page lists real posts with publish-now/delete/view actions; a PublishScheduledPosts job sweeps due posts every minute. Includes a workaround for a query-builder bug (where in mis-compiles on DELETE).
Bluesky threads (#5)
Thread mode now publishes in one request and reply-chains segments via ATProto root/parent refs, so they render as an actual thread. Segments share a thread_key post group.
Live analytics (#7)
GET /postline/analytics computes weekly counts, channel mix, best posting windows, and a 30-day series from real rows; the page renders that instead of hardcoded mocks.
Blog target (#6)
"Blog" is now a crosspost provider: publishing writes markdown to content/blog/, which the framework's BunPress blog serves at /blog/<slug> with RSS. Also fixes the post_targets provider CHECK constraint that was silently rejecting Threads inserts (it predated that driver).
Verification
bunx --bun pickier .clean;bun run typecheckexit 0;bun test11 pass- Driver-level tests cover plain records, reply chains, link cards, char limit, missing token
- Exercised live against the dev servers: queue save/list/delete/publish-now, due-post sweep, thread post rows, analytics payload, blog publish → rendered page (screenshots in session)
- No real social credentials were present, so provider failure paths were exercised end-to-end; actual Bluesky delivery is covered by the mocked driver tests