Skip to content

Release v1.16.0#278

Merged
TemujinCalidius merged 4 commits into
mainfrom
dev
Jul 17, 2026
Merged

Release v1.16.0#278
TemujinCalidius merged 4 commits into
mainfrom
dev

Conversation

@TemujinCalidius

Copy link
Copy Markdown
Owner

Cuts v1.16.0devmain.

🎨 What's shipping

MINOR: backward-compatible features, no breaking changes. Default instances render identically.

Merge with a merge commit — not squash.

🤖 Generated with Claude Code

TemujinCalidius and others added 4 commits July 17, 2026 19:21
…row gaps (#257) (#273)

#258 normalized the handle at WRITE time (admin save + Test), but every
consumer reads credentials via getBlueskyCredentials(), which returned the
handle raw. All 12 call sites feed it straight into agent.login(), so a
`@`-prefixed handle still failed with a misleading InvalidEmail — and did so
silently, since crossposts, polls and DM sync run as background jobs.

Two paths were affected, not one:
- BLUESKY_HANDLE (env) is never normalized anywhere — nothing touches it.
- DB rows written before #258 were stored raw, and no migration backfills them.

Normalize both branches of getBlueskyCredentials()'s return instead: one choke
point, no call sites change, and it's robust to rows written by hand or by a
future migration. Also normalize getIntegrationStatus()'s handle so the admin
panel shows what we actually log in with, regardless of source.

Tests: env-fallback normalization, legacy raw DB row, and status reporting —
all three fail against the pre-fix code.

Docs: note the leading-@ tolerance in .env.example + docs/bluesky-integration.md.

Co-authored-by: Samuel Lison <samuel@slcolonies.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
….34.5 (#274)

- @atproto/api 0.20.29 → 0.20.30
- tailwindcss + @tailwindcss/postcss 4.3.2 → 4.3.3

Deliberately NOT bumping sharp 0.34.5 → 0.35.3, despite triage verifying it
green. Caret on a 0.x pins the minor, so our ^0.34.5 (>=0.34.5 <0.35.0) and
^0.35.3 are disjoint with next 16.2.10's optionalDependencies.sharp ^0.34.5 —
npm can't dedupe, so we'd get ours hoisted plus next's nested, i.e. two full
libvips native toolchains (~16MB each) in the standalone image, with next's
optimizer loading 0.34.5 while our code loads 0.35.3 in the same process.

tsc/vitest/next build all pass either way because none of them assert
dependency-tree shape — the duplicate is invisible to every gate we run. Only
`npm ls sharp --all` shows it. Revisit when next widens its optional pin.

Verified: npm ls sharp --all → exactly one, deduped under next.
Audit unchanged: 3 moderate, all the known postcss-inside-next chain (#12).

Co-authored-by: Samuel Lison <samuel@slcolonies.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
…icker (#250) (#275)

Ships the first alternative theme and the admin control to select it. These
land together on purpose: a picker with one theme is dead UI, and a theme with
no picker is unreachable.

Editorial is pure data — warm sepia surfaces, a terracotta accent, sage moss,
and an inverted type pairing (sans headlines over serif body). No new
machinery: buildThemeStyle already diffs a theme's tokens against the default
and injects the delta, and resolveLayout already honours its layout preset
(feed: "list"). Adding a theme is one file plus one registry line.

Constraint worth recording: every theme must be DARK for now. ~56 files and the
global body class hardcode Tailwind neutrals (text-white, text-gray-200) that
no theme token can reach, because @theme extends the palette rather than
replacing it — on a paper ground text-white is 1.07:1, i.e. an invisible site.
themes.test.ts now encodes this as a contrast invariant over every registered
theme, so it can't be violated by accident (verified: a light surface-950 fails
it). Light themes need those utilities migrated to tokens first.

Fonts only swap round because buildThemeStyle can't register @font-face and
only Inter + Source Serif 4 are self-hosted; mono is untouched so it diffs out.

Also fixes two things a second theme would otherwise have exposed:
- viewport.themeColor and the PWA manifest hardcoded the default's #0a0a0f, so
  the browser chrome and installed-app splash clashed with any other theme.
  Both now derive from the active theme's surface-950 (static `viewport` had to
  become `generateViewport` — Next forbids exporting both).
- The Site settings save wrote `layout.feed || "cards"`, pinning an explicit
  override on first save even if untouched, which would stop Editorial's list
  preset from ever applying. Feed layout now offers "Inherit from theme".

Verified: default injects nothing and still reports #0a0a0f (pixel-identical);
editorial injects all 18 tokens and reports #17120e; both eyeballed via
THEME=<id> next dev. 490 tests.

Co-authored-by: Samuel Lison <samuel@slcolonies.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Roll the Unreleased block into a dated 1.16.0 section and bump
package.json + lockfile 1.15.0 → 1.16.0.

MINOR: the "Editorial" second theme + theme picker (#250, #275), a dependency
refresh (#274), plus the Bluesky env-handle fix (#257, #273). No breaking
changes; default instances render identically.

Co-authored-by: Samuel Lison <samuel@slcolonies.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
@TemujinCalidius
TemujinCalidius merged commit 4fa08f3 into main Jul 17, 2026
9 checks passed
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.

1 participant