Verification:
- Add Playwright harness (e2e/) covering Chromium, Firefox, and WebKit plus
Android/iOS mobile emulations. Smoke tests assert: default flyer renders
with no JS/console errors, @media print hides app chrome and keeps the
flyer, anonymous npub generation (WebCrypto), legacy /nostr/ redirect
preserves query+hash, and event-lookup URLs show the loading state instead
of the default flyer. All six projects pass.
- package.json/playwright.config.js wire up the projects and a managed static
server; .gitignore excludes node_modules and Playwright output.
Docs:
- docs/flyer-field-limits.md: per-script character cheat sheet for each flyer
field (single-line caps + multi-line guidance), measured by rendering each
script at print size.
- README: add a Features section matching the shipping client and a
cross-browser verification section; link the cheat sheet.
- AGENTS.md: document the e2e suite and the one-time WebKit Linux dep.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
A viewer arriving via an event-lookup URL (naddr/nevent/note/hex in the
query or #fragment) previously saw the default placeholder flyer flash
before the real event resolved. Now it renders a localized "Loading
content..." state, and a "Could not load this flyer." state on fetch
failure. Default flyer content now appears only on the bare main URL.
- Add loading_content and load_failed labels for all 14 languages
- Add renderStatusPreview() rendering a minimal flyer sheet with a single
centered, direction-aware message (no tear-offs, no QR)
- Render loading state synchronously before fetch in the URL-event path,
failed state in the catch handler
- Add .flyer-status-message CSS
Co-Authored-By: Claude Opus 4.8 <[email protected]>
The /nostr/ path was a leftover from when the site also hosted a Tor
client. The app is Nostr-only now, so move the client to the site root
and shorten poster URLs to https://voxvera.org/#naddr1... (drops both
/nostr/ and the ?addr= query key, for a cleaner/smaller tear-off QR).
- Move site/nostr/{nostr-client.js,css,locales.js,vendor} to site/.
- site/index.html is now the client; site/nostr/index.html is a redirect
stub that forwards /nostr/ to / while preserving the query string and
#naddr fragment, so older poster URLs and printed QR codes still
resolve.
- Carry the naddr in the URL fragment (#) instead of ?addr=; the viewer
reads query, fragment, or the full URL, so old links keep working.
- Update README, AGENTS.md, and the spec to the new paths.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
The Load Event field requires 64 contiguous hex chars, but the event ID
printed on a tear-off tab wraps across two lines, so copying it back in
pastes as two 32-char halves separated by a newline/space and failed to
match. Strip inner whitespace before matching the raw hex id, which also
tolerates a pasted "Event ID:" label prefix. naddr/note/nevent inputs are
unaffected.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
- Tear-off tabs: single hyperlinked statement (no printed URL), with
"Share and reprint." on its own line; localize "Click to open this
poster." across all 14 languages.
- Show the full event ID, bottom-anchored on each tab, split into two
32-char lines at max readable monospace size.
- Shorten the poster URL by encoding the naddr with a single relay hint
instead of the full relay list (~233 -> ~171 chars) for an easier-to-
scan QR; still a standard naddr, older URLs resolve unchanged.
- Add per-script letter-spacing policy (ls-full/ls-cjk/ls-none) to fit
more text per line where safe, and turn tracking off for Arabic,
Persian, and Hindi (fixes broken cursive joins / combining marks).
- Move the "field too long" warning inline under the offending field
instead of a single bottom status line.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
Install script now removes index.html, QR codes, and download bundles
from existing site directories before rebuild-all regenerates them.
Preserves config.json, .onionshare-session, server.pid, and logs.
Also auto-rebuilds on serve if index.html is missing.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Existing sites kept stale index.html from old templates after upgrades.
New `voxvera rebuild-all` regenerates HTML for all sites from the
current master template while preserving keys, config, and content.
The install script now calls rebuild-all automatically after install.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
These files are not read by the build pipeline (which always generates
from index-master.html), but keeping them in sync avoids confusion.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Allows users to export onion service session keys as base64 and import
them on another instance, enabling domain migration without re-hosting.
Bump version to 0.3.3.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Switch content panel from space-between to flex-start so header
elements (title, subtitle, headline) pack tightly instead of
spreading across the full height
- Message area uses flex:1 to fill remaining space and keep footer
at the bottom
- Body editor now preserves user text when re-editing after exceeding
the 1000 character limit (previously reset to default)
- Show a yellow warning when user proceeds with over-limit body text
- Add body_over_limit_warning locale key across all 14 languages
Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Add bundled preset templates under voxvera/templates/presets/ (moved
from imports/, normalized field names to match config schema)
- New "Create From Template" option in the manage menu lets users pick
a preset (aosp, bitcoin, jesus, meshtastic, nostr, voxvera) and
customize it before publishing
- Template content is fully translated across all 14 supported languages;
the displayed content matches the user's selected language
- Rebuild HTML files with updated locale data
Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Bump version to 0.3.1 for new release with all content fixes
- Reorder install strategies: tarball first (always current with main),
pre-built binary last (can lag behind)
- Translate the "name" field across all 14 locale files
- Rebuild HTML files with updated locales
Co-Authored-By: Claude Opus 4.6 <[email protected]>
- Stop deleting pip/pipx Python entry points by narrowing the stale
binary check to ELF/Mach-O only (not generic "executable")
- Clean up stale pip wheel cache, /tmp leftovers, ~/config.json and
~/imports/ from older VoxVera versions (preserves ~/host tor sites)
- Run hash -r after install and prompt user to do the same if command
is not found (curl|bash runs in a subshell)
Co-Authored-By: Claude Opus 4.6 <[email protected]>
The build_site() path was missing the _newlines_to_br() call when
embedding user content into the locales JSON, causing literal \n to
appear in the generated index.html files. Fixed and rebuilt both
site/index.html and voxvera/host/voxvera/index.html.
Co-Authored-By: Claude Opus 4.6 <[email protected]>
Convert <br> to real newlines before opening the editor so users see
proper paragraph breaks instead of raw markup. Ensure user-typed newlines
are converted back to <br> when embedded in the locales JSON for JS
rendering. Replace remaining \n with <br> in all import configs and
site/config.json for consistency.
Co-Authored-By: Claude Opus 4.6 <[email protected]>