Grain#
The next version of Grain, a photo sharing app built on the AT Protocol.
Development#
npm install
npm run dev
Build#
npm run build
npm run preview
Copyright 漏 2025 Grain Social. All rights reserved.
https://tangled.org/grain.social/grain-pwa
git@tangled.org:grain.social/grain-pwa
For self-hosted knots, clone URLs may differ based on your setup.
Add left/right navigation arrows to the image carousel for desktop users:
- Arrows appear on multi-image galleries only
- Left arrow hidden on first image, right hidden on last
- White semi-transparent background with muted brown chevron icons
- Uses grain-icon component for consistent iconography
- Click events don't propagate to parent (prevents gallery navigation)
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Protected routes now redirect to timeline when not authenticated:
settings, edit-profile, create-gallery, notifications
- Moved terms, privacy, and copyright pages from /settings/* to /legal/*
so they remain publicly accessible
- Fixed logout to navigate before calling auth.logout()
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
On iOS PWA, tapping the close button inside the fixed sheet would cause
iOS to lose track of the scroll context, freezing page scroll. Fixed by:
- Adding touch-action: manipulation to prevent gesture tracking issues
- Blurring active element before close to release iOS focus
- Using requestAnimationFrame to let iOS finish touch processing
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Browser back/forward gestures provide their own visual transition,
so wrapping popstate navigation in View Transitions caused a brief
flash of the previous page on iOS Safari and Chrome.
馃 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>