- Lock viewport: position:fixed on html/body prevents iOS bounce scroll
- No zoom on input focus: maximum-scale=1, user-scalable=no
- Keyboard-responsive chat: visualViewport API detects keyboard, hides
tab bar, scrolls chat to bottom, scrollIntoView on input focus
- iOS HIG tab bar: 49pt height, vertical icon+label, safe-area-inset-bottom
- PWA fix: manifest start_url/scope/id changed from '/' to './' for
subpath deployment compatibility
- PlayerBar: variant prop (fixed/inline), inline on mobile above tab bar,
fixed on desktop. No more overlap with tab bar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The from-black/60 gradient overlay was making SVG text fallbacks appear
completely black. Now the gradient only renders when there's an actual
image, letting the designed SVG fallbacks show through properly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All 8 SVG generators (song, podcast, news, image, film, TV, book, place)
had backgrounds at 9-10% lightness which appeared black under grid gradient
overlays. Bumped to 18% with proportionally brighter text and icons.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Songs: 19/21 now have iTunes album art URLs (2 niche Bitcoin artists use fallback)
- Podcasts: 21/21 now have iTunes artwork URLs
- News: 21/21 now have Unsplash topic images
- Books: Fixed The Network State cover URL
- Places: 21/21 now have photos (Unsplash + Wikimedia)
- Added generateNewsFallback() and generateImageFallback() SVG generators
- Updated NewsCard, NewsGrid, ImageCard to use SVG text fallback instead of emoji
- Added error handling to PlaceCard and PlaceGrid for failed photo loads
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The news tab was missing because hasNews evaluated to false when web
search results hadn't arrived yet. Now shows the tab eagerly for news
queries — results populate when they arrive via the deep watcher.
Also fixes RSS late-insertion to place before the Prompt tab.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Prompt tab now renders the full AI response using magazine extraction
(extractMagazineSections) to create nicely formatted tiles. The user's
query appears as the hero headline, and the response is broken into
styled sections — same as the Brief tab but always available.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds a 'Prompt' tab that is always present as the rightmost tab in the
content panel. Shows the user's original query as a single magazine-style
tile using the existing MagazineGrid component.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All 15 seed prompts now load as one conversation ("Content Showcase")
instead of 15 separate ones. /seed collapses chat to show PromptIndex
so users can quickly pick any prompt to see its content surface.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Chat aside has z-[100], PlayerBar had z-50 so it rendered underneath.
Bumped to z-[999] to ensure the player always floats above all panels.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add responsive glass-button-sm: 44px min-height on mobile (≤768px)
- Replace !h-7 !min-h-0 overrides with responsive min-h-[44px] md:min-h-0
- Add .touch-target utility class (44px min, inline-flex centered)
- Refactor 21 icon buttons to use .touch-target class
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- ContentPanel: tab gap-1→gap-2, tab buttons min-h-[44px], close button 44px
- Audited all gap-0.5/gap-1: all remaining are between non-interactive elements
- Audited all grid card buttons: no undersized action buttons found
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Replace all text-[10px] (308 instances) with text-xs (12px)
- Replace all text-[9px] and text-[8px] (133 instances) with text-xs
- Replace all text-[11px] (76 instances) with text-xs
- Bump all input/textarea font sizes to text-base (16px) to prevent iOS auto-zoom
- No visual design changes — only sizing minimums enforced
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Use import.meta.env.BASE_URL for router history (Archy /aiui/ deployments)
- Capture embedded flag from URL params before router init
- Add panelSlideIn animation with prefers-reduced-motion support
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Escape key exits code mode on desktop (T14)
- Show active project name pill near chat input when in code mode (T15)
- Inject selected design tokens, files, and open file content into AI
system prompt when in code mode (T16)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
20 tests covering postMessage protocol, composable API shape,
buildArchyContext format, archy-apps data integrity, and base-aware paths.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add wallet (Lightning balance, channels) and files (Nextcloud) context
categories to useArchy composable with AI prompt injection
- Create archy-apps.ts data file mapping all 18 Archy services
- Build ArchyAppsGrid component with live status from bridge
- Wire ArchyAppsGrid into ContentPanel when embedded in Archy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add missing content type wiring so images and places render properly
in the content panel with full grid → detail navigation flow.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Create useArchy composable wrapping archyBridge with reactive Vue state
- Initialize bridge in App.vue when ?embedded=true detected
- Inject Archy node context (apps, system, network) into AI system prompt
- Make API paths base-aware (import.meta.env.BASE_URL) for /aiui/ deployment
- Add nginx-archy.conf for production Anthropic API proxy with SSE support
- Fix archyBridge.ts typecheck error, export ActionResponse type
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Relax isBookLikeResponse threshold (>=2 to >=1)
- Widen book patterns: inline prose, verb-preceded, numbered bold, em-dash
- Remove overly aggressive film/song gating on book extraction
- Allow songs to coexist with film/book tags (explicit tags always returned)
- Strengthen TV patterns: seasons, created by, standalone "tv" query match
- Fix TV_EXT_RE to handle both Title|Year|Creator and Title|Creator|Year
- Widen place patterns: type word search in descriptions, bold fallback
- Add "pizza" to isPlaceQuery and preferredFirstTab
- Add Code tab: isCodeQuery, isCodeLikeResponse, extractCodeBlocks, wiring
- Fix image threshold: single image with meaningful alt text shown
- Refactor filterTabsByContext: specialized paths now append remaining content
- Add code mode UI: orange input styling, design system selection, file selection
- DesignSystemGrid: selection toggle only on checkmark, card click opens detail
- Add 64-test extraction quality test suite
- Update overnight plan.md and prompt.md for hardening run
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Allows the proxy to spawn claude CLI even when the dev server was
started from within a Claude Code session.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reverts all proxy changes back to the last known working version.
The proxy uses Claude CLI for all requests and only uses the Anthropic
API for web search tool calling when a credential is available.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Removes all OpenRouter proxy code from claude-proxy.ts. The fallback
chain is now just: Anthropic API (key/OAuth) → Claude CLI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When no Anthropic API credential is available, the proxy now falls back
to OpenRouter before trying the Claude CLI. The new streamViaOpenRouterFallback
function converts OpenRouter's OpenAI-format SSE to Anthropic-format SSE
(content_block_delta with text_delta) so the frontend's Claude provider
can parse it correctly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Slash commands (/code, /nostr, /design, /search) now appear in the
prompt palette with descriptions, auto-send on select
- Chat message hover actions wrapped in a proper glass container with
backdrop blur, divider between actions and feedback thumbs
- Palette has 8px side margins, no scroll limit
- Fix app extraction: queries mentioning known app names (e.g. "start9")
now surface the Apps tab even without explicit app/nostr query patterns
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Share conversations as Nostr kind:30023 articles with NIP-44 encryption
- Read-only conversation viewer page at /view/:nostrAddr
- Collaborative playlists via NIP-51 kind:30004 lists
- Conversation templates (6 built-in + custom)
- Audio podcast export via Web Speech API
- Community content packs with registry and import
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Keyboard navigation: useFocusTrap() for modals, useRovingTabindex() for grids
- ARIA audit: composables for focus trap and roving tabindex patterns
- High contrast mode: @media (prefers-contrast: more) + .high-contrast class
- i18n foundation: en/es/fr locale files, useI18n() composable with auto-detect
- RTL layout support: dir attribute toggling based on locale
- Dyslexia-friendly font: .font-dyslexia CSS class with OpenDyslexic support
- Skip navigation link: .skip-nav CSS with focus-visible positioning
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Accent colour picker: 8 presets + custom colour picker, live CSS var update
- Glass intensity slider: Subtle/Default/Strong blur and opacity presets
- Font size settings: Compact 13px / Default 15px / Large 17px
- Content type visibility: toggle each of 11 content tabs
- Keyboard shortcut map: view and rebind all shortcuts, conflict detection
- Browser push notifications: opt-in for generation complete events
- Auto-archive: 7/30/90/never day threshold for old conversations
- Full data export: JSON archive of all localStorage aiui-* keys
- Data wipe: two-step confirm, optional API key vault clearing
- Default conversation settings: model, web search, token counts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- For You feed: frequency map from favorites, sorted by most-favorited type
- Content tagging: user tags on any item, tag cloud, filter by tag
- Smart playlists: recently played, most played, by genre, by decade
- Similar content: background AI call for 3 suggestions, cached 7 days
- Recently viewed history: last 50 items with time-ago display
- Content collections: user-curated mixed-type lists with mosaic grid
- Trending: most-referenced items across 30 days with badge
- Share to Nostr: compose preview, sign via NIP-07, broadcast to relays
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
M12.2: Fedimint ecash card with Fedi deep-link
M12.3: BOLT12 offer card with QR and wallet deep-link
M12.4: Nostr Wallet Connect (NWC) composable with NIP-47 scaffolding
M12.5: LNURL-auth login composable with challenge generation
M12.6: Live sat/fiat price from mempool.space/api/v1/prices (60s refresh)
M12.7: Mempool.space tx viewer with confirmations, fee rate, block height
M12.8: BOLT11 invoice decoder card with amount, expiry countdown, pay link
All Bitcoin patterns auto-detected in chat messages via useBitcoinDetector.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Detect bech32, bech32m, P2PKH, P2SH addresses in chat messages.
Show address card with type badge, QR code, copy button, and
mempool.space link. Bitcoin detector utility for all BTC patterns.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Articles sub-tab fetches kind:30023 events, shows title/summary/date.
Clicking opens full article in ArticleReader (M10.1). Discovery from
relay.nostr.band with 30 most recent articles.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
View and manage follow (kind:3), mute (kind:10000), pin (kind:10001),
and bookmark (kind:10003) lists. Add/remove items, publish via NIP-07.
Lists sub-tab in Nostr section.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Clicking a note opens thread view fetching root + replies via #e tag.
Renders as threaded tree with indentation (max 5 levels). Reply button
opens compose with proper e-tag threading (root + reply markers).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Search input sends REQ with search field to NIP-50 supporting relays.
Results shown as note cards with author, content, timestamp. Filter
by content type. NIP-50 button triggers relay search on Enter.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Verify NIP-05 identifiers by fetching .well-known/nostr.json from
the domain. Results cached in localStorage for 24 hours. Green
checkmark badge shown next to verified NIP-05 on note cards.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Zap button on notes opens dialog with amount presets, optional message,
LNURL-pay resolution from Lightning address, invoice display with
copy and wallet deep-link. Never holds funds.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Configurable relay list persisted to localStorage. Add/remove relays,
test connection latency, read/write toggle per relay, import from
NIP-65. Relays sub-tab in Nostr section.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
NIP-04 encrypted DMs with IDB persistence. DM inbox tab in Nostr
section with contact list, message threads, and new conversation
initiation. Added decodeNpub utility. Sub-tab switcher (Feed/Messages).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Compose panel in Nostr tab, sign via NIP-07, broadcast to configured
relays with per-relay send status. Character counter (soft 280 limit).
Removed isDark conditionals from NostrGrid (dark-only app).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>