Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

fix: MVP-readiness fixes — restore lost UI feedback, register safety, analytics error state, mobile + a11y#31

Open
glennmichael123 wants to merge 3 commits into
mainstacksjs/postline:mainfrom
fix/readiness-batch-1-feedback-timingstacksjs/postline:fix/readiness-batch-1-feedback-timingCopy head branch name to clipboard
Open

fix: MVP-readiness fixes — restore lost UI feedback, register safety, analytics error state, mobile + a11y#31
glennmichael123 wants to merge 3 commits into
mainstacksjs/postline:mainfrom
fix/readiness-batch-1-feedback-timingstacksjs/postline:fix/readiness-batch-1-feedback-timingCopy head branch name to clipboard

Conversation

@glennmichael123

@glennmichael123 glennmichael123 commented Jul 24, 2026

Copy link
Copy Markdown
Member

Fixes from an MVP-readiness audit (three independent reviewers across composer/queue, accounts/login, and shell/analytics/actions). Grouped into reviewable commits.

Batch 1 — the root-cause feedback bug (highest impact)

Provider + toast helper scripts load as deferred type="module" after the page content, but inline scripts captured window.postlineToast / window.postlineBluesky eagerly at parse timeundefined on every full page load / refresh / OAuth-redirect-back. Composer + Queue silently dropped all feedback to console.log; Accounts showed a connected Bluesky as "Not connected". Fixed by resolving the helpers at call time + gating Bluesky's initial fetch on DOMContentLoaded (mirroring the LinkedIn/Twitter cards). Plus: Queue delete confirmation, and removed the dead /blog keyboard shortcut (404'd).

Batch 2a — register safety + mobile + small wins

  • login: Confirm-password field (register mode only) so a first-run typo can't create the sole-owner account with no recovery; name required in register.
  • accounts: provider cards stack on mobile instead of crushing the text column; aria-labels on the placeholder-only Mastodon inputs.
  • queue: "View" resolves any stored http(s) permalink (not just Bluesky); item action row wraps on mobile; calendar scrolls horizontally instead of squishing.

Batch 2b — analytics no longer hangs

A failed metrics fetch used to leave the dashboard stuck on "Loading…" forever. Now renders an inline error banner + Retry; Retry re-fetches and restores on success.

Verification

  • pickier clean · bun run typecheck exit 0 · bun test 74/0
  • ⚠️ Not browser-exercised — Postline's own dev server wasn't running locally (another app occupied its ports), so these are lint-and-read verified. A click-through on the next buddy dev is recommended before merge.

Still queued (safe wins, next batch)

Client-side validation gates (over-limit / past-schedule / IG-needs-image) · OAuth callback toasts (defer the post-redirect confirmation) · aria-pressed/aria-current on mode/view/theme toggles.

🤖 Generated with Claude Code

glennmichael123 and others added 2 commits July 25, 2026 00:16
…le timing

The provider + toast helper scripts load as deferred `type="module"` after the
page content, but the inline page scripts captured window.postlineToast /
window.postlineBluesky eagerly at parse time — undefined on every full page
load, refresh, or OAuth-redirect-back. Symptoms: the composer and queue dropped
all success/error/validation feedback to the console, and Accounts rendered a
genuinely-connected Bluesky as "Not connected". It only looked fine when
SPA-navigating between already-loaded pages.

Resolve the helpers at call time (and gate Bluesky's initial status fetch on
DOMContentLoaded, mirroring the LinkedIn/Twitter cards that already do this).
Also:
- Queue: confirm before the irreversible Delete.
- Remove the dead `/blog` keyboard shortcut (key 6) — no blog page exists, so it
  404'd; settings moves to key 6.

Found via an MVP-readiness audit. Verified by lint + reading; the app's own dev
server wasn't running locally (another app occupied the ports), so this wasn't
browser-exercised — worth a click-through on the next run.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… small wins

More MVP-readiness fixes:
- login: add a Confirm-password field (shown/required only in register mode) so a
  first-run typo can't create the sole owner account with no recovery path; make
  name required in register too.
- accounts: provider cards stack on mobile (flex-col → sm:flex-row) instead of
  crushing the text column; add aria-labels to the placeholder-only Mastodon
  instance/token inputs.
- queue: the "View" link now resolves any stored http(s) permalink (not just
  Bluesky at:// URIs); the item action row wraps on narrow screens; the calendar
  scrolls horizontally (min-width + overflow-x-auto) instead of squishing to
  unreadable columns.

Lint-and-read verified (Postline's dev server wasn't running locally).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@pkg-pr-new

pkg-pr-new Bot commented Jul 24, 2026

Copy link
Copy Markdown

Open in StackBlitz

@stacksjs/actions

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/actions@31

@stacksjs/ai

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/ai@31

@stacksjs/alias

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/alias@31

@stacksjs/analytics

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/analytics@31

@stacksjs/api

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/api@31

@stacksjs/arrays

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/arrays@31

@stacksjs/audio

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/audio@31

@stacksjs/auth

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/auth@31

@stacksjs/browser

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/browser@31

@stacksjs/browser-extension

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/browser-extension@31

@stacksjs/buddy

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/buddy@31

@stacksjs/build

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/build@31

@stacksjs/cache

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/cache@31

@stacksjs/calendar-api

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/calendar-api@31

@stacksjs/charts

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/charts@31

@stacksjs/chat

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/chat@31

@stacksjs/cli

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/cli@31

@stacksjs/cloud

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/cloud@31

@stacksjs/cms

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/cms@31

@stacksjs/collections

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/collections@31

@stacksjs/commerce

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/commerce@31

@stacksjs/composables

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/composables@31

@stacksjs/config

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/config@31

@stacksjs/cron

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/cron@31

@stacksjs/database

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/database@31

@stacksjs/datetime

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/datetime@31

@stacksjs/defaults

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/defaults@31

@stacksjs/desktop

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/desktop@31

@stacksjs/dns

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/dns@31

@stacksjs/docs

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/docs@31

@stacksjs/email

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/email@31

@stacksjs/enums

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/enums@31

@stacksjs/env

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/env@31

@stacksjs/error-handling

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/error-handling@31

@stacksjs/events

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/events@31

@stacksjs/faker

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/faker@31

@stacksjs/feature-flags

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/feature-flags@31

@stacksjs/git

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/git@31

@stacksjs/github

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/github@31

@stacksjs/health

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/health@31

@stacksjs/http

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/http@31

@stacksjs/i18n

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/i18n@31

@stacksjs/image

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/image@31

@stacksjs/lint

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/lint@31

@stacksjs/logging

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/logging@31

@stacksjs/newsletter

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/newsletter@31

@stacksjs/notifications

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/notifications@31

@stacksjs/objects

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/objects@31

@stacksjs/orm

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/orm@31

@stacksjs/path

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/path@31

@stacksjs/payments

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/payments@31

@stacksjs/push

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/push@31

@stacksjs/query-builder

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/query-builder@31

@stacksjs/queue

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/queue@31

@stacksjs/realtime

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/realtime@31

@stacksjs/registry

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/registry@31

@stacksjs/repl

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/repl@31

@stacksjs/router

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/router@31

@stacksjs/scheduler

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/scheduler@31

@stacksjs/search-engine

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/search-engine@31

@stacksjs/security

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/security@31

@stacksjs/server

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/server@31

@stacksjs/shell

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/shell@31

@stacksjs/skills

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/skills@31

@stacksjs/slug

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/slug@31

@stacksjs/slugs

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/slugs@31

@stacksjs/sms

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/sms@31

@stacksjs/socials

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/socials@31

@stacksjs/storage

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/storage@31

@stacksjs/strings

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/strings@31

@stacksjs/testing

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/testing@31

@stacksjs/tinker

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/tinker@31

@stacksjs/tunnel

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/tunnel@31

@stacksjs/types

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/types@31

@stacksjs/ui

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/ui@31

@stacksjs/utils

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/utils@31

@stacksjs/validation

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/validation@31

@stacksjs/video

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/video@31

@stacksjs/whois

npm i https://pkg.pr.new/stacksjs/postline/@stacksjs/whois@31

commit: 71cd235

…failure

A failed metrics fetch used to return silently, leaving the dashboard's stat
values on "—" and every trend on "Loading…" forever with no explanation.
loadAnalytics now renders an inline error banner with a Retry button and flips
the stat trends to "Unavailable", instead of swallowing the error. Retry
re-fetches and restores the dashboard on success.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@glennmichael123 glennmichael123 changed the title fix: readiness batch 1 — restore lost UI feedback (deferred-module timing) + delete confirm fix: MVP-readiness fixes — restore lost UI feedback, register safety, analytics error state, mobile + a11y Jul 24, 2026
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

Morty Proxy This is a proxified and sanitized view of the page, visit original site.