Files
GearBox/.planning/phases/24-public-access-infrastructure/24-DISCUSSION-LOG.md

123 lines
5.8 KiB
Markdown

# Phase 24: Public Access & Infrastructure - Discussion Log
> **Audit trail only.** Do not use as input to planning, research, or execution agents.
> Decisions are captured in CONTEXT.md — this log preserves the alternatives considered.
**Date:** 2026-04-09
**Phase:** 24-public-access-infrastructure
**Areas discussed:** Auth boundary redesign, Client-side routing for anonymous users, Rate limiting strategy, Loading experience for visitors
---
## Auth Boundary Redesign
| Option | Description | Selected |
|--------|-------------|----------|
| Allowlist public routes | Keep requireAuth as default on /api/*, maintain explicit list of public GET routes that skip auth. Extends current pattern. | ✓ |
| Separate route registration | Register public routes BEFORE auth middleware, private routes AFTER. Route order determines auth. | |
| Per-route middleware | Remove blanket /api/* auth. Each route file applies requireAuth on its own write endpoints. | |
**User's choice:** Allowlist public routes (recommended)
**Notes:** None
| Option | Description | Selected |
|--------|-------------|----------|
| Yes, make categories public | Categories are structural data — needed for catalog browsing context. | |
| No, keep categories auth-gated | Only expose what's strictly required. | |
**User's choice:** Other — Categories are user-scoped. Unauthenticated users access global items which use tags, not categories. Categories stay private.
**Notes:** "the thing is currently all item categories are what the user defines them to be, so if the user isn't authenticated the items they are accessing shouldn't have a category in the first place, instead they have tags, for sorting searching etc"
| Option | Description | Selected |
|--------|-------------|----------|
| Show category names in public view | Include owner's category name as read-only display context in public setup view. | ✓ |
| Items without category context | Public setup view shows items with weight/price but no category labels. | |
**User's choice:** Show category names in public view (recommended)
**Notes:** None
---
## Client-Side Routing for Anonymous Users
| Option | Description | Selected |
|--------|-------------|----------|
| Expand public route list | Extend isPublicRoute check to include /global-items/*, /setups/*/public, /catalog, and /. Keep login redirect for private routes. | ✓ |
| Invert to private route list | List private routes instead; everything else accessible without auth. | |
| You decide | Claude picks cleanest approach. | |
**User's choice:** Expand public route list (recommended)
**Notes:** None
| Option | Description | Selected |
|--------|-------------|----------|
| Hide TotalsBar for anonymous | No TotalsBar when not authenticated. Public pages show their own header. | |
| Show a simplified public header | Replace TotalsBar with minimal header for anonymous visitors. | |
| Keep TotalsBar with login CTA | Replace stats with sign-in message. | |
**User's choice:** Other — TotalsBar is already only in collection views, not in the header. No changes needed.
**Notes:** "there should only be a totals bar in the collection views etc, we should have removed the one from the header already, so no need there"
| Option | Description | Selected |
|--------|-------------|----------|
| Redirect to /login with return URL | Standard redirect-based pattern. | |
| Show inline login prompt | Show modal/toast instead of navigating away. Keeps context visible. | ✓ |
| You decide | Claude picks best UX pattern. | |
**User's choice:** Show inline login prompt — but specifically with "sign in or sign up" messaging, not just login.
**Notes:** "we should show a popup saying to manage your own collection you need to sign in or sign up, because while a direct sending to signin might be a better flow for already signed up users it is terrible for new users, which i think matters more"
---
## Rate Limiting Strategy
| Option | Description | Selected |
|--------|-------------|----------|
| 100 req/min per IP | Generous for normal browsing, blocks scraping. Standard for public APIs. | |
| 60 req/min per IP | More conservative. | |
| You decide | Claude picks appropriate limits per endpoint type. | ✓ |
**User's choice:** You decide
**Notes:** None
| Option | Description | Selected |
|--------|-------------|----------|
| Exempt authenticated users | Authenticated users trusted, rate limiting for anonymous abuse. | |
| Higher limits for authenticated | Still rate-limit but at 5-10x anonymous limit. | |
| Same limits for everyone | Simplest, no distinction. | ✓ |
**User's choice:** Same limits for everyone
**Notes:** "i feel like there is no diff, authenticated users could still spam the api, we should find a good sweet spot for the amount of calls that are being made, i think this is something that will change with experience"
---
## Loading Experience for Visitors
| Option | Description | Selected |
|--------|-------------|----------|
| Fire-and-forget auth check | Render page immediately, check auth in background. Anonymous users see content right away. | ✓ |
| Fast auth with skeleton | Check auth first but show content skeleton instead of spinner. | |
| You decide | Claude picks best approach. | |
**User's choice:** Fire-and-forget auth check (recommended)
**Notes:** None
| Option | Description | Selected |
|--------|-------------|----------|
| Login button in top-right corner | Simple 'Sign in' link on all public pages. Disappears when authenticated. | ✓ |
| No persistent login link | Users find login through write-action popup only. | |
| You decide | Claude picks based on navigation patterns. | |
**User's choice:** Login button in top-right corner (recommended)
**Notes:** None
---
## Claude's Discretion
- Rate limit numbers per endpoint type (browse, search, detail)
## Deferred Ideas
None — discussion stayed within phase scope