Commit Graph

241 Commits

Author SHA1 Message Date
27a07e0891 fix: page transition hides scrollbar, avoid scrollbar pop-in on load via fade-in 2026-01-15 13:51:38 -06:00
01489df25e chore: update frontend dependencies 2026-01-15 13:16:54 -06:00
6a09a871cc feat: add circular reveal animation to theme toggle using View Transitions API 2026-01-15 13:08:44 -06:00
8aa14a2cab refactor: replace SVG sprite with client-side icon fetching and Rust caching
Eliminates server-side batch rendering and IconSprite pattern in favor of:
- Rust handler with moka cache (10k icons, 24h TTL, immutable HTTP headers)
- Client Icon component fetches SVGs on-demand with shimmer loading states
- Removes renderIconsBatch, tag-icons collection logic, and page load icon preprocessing
- Reduces SSR complexity and data serialization overhead
2026-01-15 10:33:43 -06:00
935c5e6475 refactor: migrate icon rendering to SVG sprite pattern
Replace per-icon inline SVG rendering with a centralized sprite system. Icons are now collected once per page and rendered as <symbol> elements, referenced via <use> tags. Eliminates redundant icon fetching, reduces HTML size, and simplifies icon management across components.
2026-01-15 01:59:02 -06:00
95cb98b084 feat: implement per-project GitHub sync scheduler with dynamic intervals
Replaces fixed-interval polling with a priority queue scheduler that adjusts
check frequency based on activity recency (15min for active projects, up to
24hr for stale ones). Includes exponential backoff on errors and staggered
initial checks to prevent API rate limit issues.
2026-01-15 00:40:09 -06:00
231a7680ac feat: add tag deletion endpoint with CLI support 2026-01-15 00:01:09 -06:00
c4a08a1477 feat: add universal slug/UUID support for project and tag endpoints
All API routes now accept either UUID or slug as {ref} parameters. Routes auto-detect format and query accordingly, enabling human-readable URLs while maintaining stable UUID references.
2026-01-14 23:56:03 -06:00
6ad6da13ee feat: add admin button to main layout, improve projects UI with click navigation, native scrollbar styles, better timestamp format
- Add persistent admin dashboard button in header when authenticated
- Make project list rows clickable for navigation to edit page
- Move delete action to edit page with confirmation modal
- Add sessionStorage persistence for auth state across page loads
- Improve timestamp formatting with relative times
- Add native scrollbar styling for light/dark themes
2026-01-14 23:19:36 -06:00
89e1ab097d refactor: cleanup struct fields, resolve clippy lints, resolve/ignore svelte lints, checks error on warn 2026-01-14 22:56:57 -06:00
e83133cfcc feat: add media upload pipeline with multipart support, blurhash generation, and R2 storage
- Add project_media table with image/video variants, ordering, and metadata
- Implement multipart upload handlers with 50MB limit
- Generate blurhash placeholders and resize images to thumb/medium/full variants
- Update ProjectCard to use media carousel instead of mock gradients
- Add MediaManager component for drag-drop upload and reordering
2026-01-14 22:34:15 -06:00
39a4e702fd feat: add responsive tag overflow with dynamic video/image backgrounds
- TagList component with binary search overflow calculation and +N pill
- ProjectCard background media layer with gradient mask and hover effects
- Random video/image selection per card with play on hover
- Responsive tag wrapping with ResizeObserver
2026-01-14 21:13:26 -06:00
59b2f15df7 fix: use proper standard $pageview event for posthog, enable exception tracking 2026-01-14 19:13:25 -06:00
6d42e528b7 feat: serve SvelteKit env.js for dynamic environment variables 2026-01-14 18:29:35 -06:00
030680c897 refactor: simplify ISR cache invalidation to homepage only 2026-01-14 12:59:31 -06:00
d360f2284e feat: add PostHog telemetry with type-safe event tracking
Track page views, project interactions, theme changes, external links, PGP actions, and errors. Console logging in dev when PostHog not configured. Requires PUBLIC_POSTHOG_KEY and PUBLIC_POSTHOG_HOST env vars.
2026-01-14 12:25:10 -06:00
08c5dcda3b refactor: use common TagChip, switch to SSR for admin pages, better error & logger handling 2026-01-14 12:07:48 -06:00
cba0cbb704 refactor: better build recipe with serve flag, remove separate serve recipe 2026-01-14 12:07:48 -06:00
72f1129555 refactor: consolidate serde rename attributes using rename_all = camelCase 2026-01-14 10:38:27 -06:00
4299f65665 fix: normalize camelCase serialization for project API fields, request serialization casing 2026-01-14 09:51:06 -06:00
c78fd44ccd feat: add procedural cloud background with WebGL shaders
Add alternative animated background using multi-pass WebGL rendering with
simplex noise, FBM, and ASCII-style quantization. Randomly alternates with
existing dots background (50/50 chance). Supports light/dark themes with
different contrast and opacity settings.
2026-01-14 00:29:03 -06:00
c7dbd77b72 feat: add GitHub activity sync background job
Adds automatic syncing of repository activity for projects with github_repo set. Background task fetches latest activity from GitHub API (issues, PRs, default branch commits) and updates last_github_activity timestamp. Configurable sync interval (default: 15 minutes), requires GITHUB_TOKEN env var.
2026-01-13 22:54:48 -06:00
f79c7711f0 refactor: use GitHub activity for project sorting instead of update timestamp 2026-01-13 21:43:45 -06:00
bf1bcb736c fix: increase DB acquire timeout, add page padding, fix modal scaling on mobile 2026-01-13 21:30:33 -06:00
019cbe76f8 add tag colors to seed data and reverse tag order in project cards
- Add color parameter to seed tags (Rust red, Python blue, etc.)
- Reverse tag display order in ProjectCard (flex-row-reverse)
- Enable release binary stripping in Cargo.toml
- Increase Railway health check timeout to 120s
- Remove backup favicon/icon files
2026-01-13 21:07:51 -06:00
34f610cdd9 fix: improve slugify to handle periods and use filter_map 2026-01-13 20:23:09 -06:00
aa56d31067 feat: add comprehensive CLI with API client, session management, and data seeding
- Binary renamed from 'api' to 'xevion' with full CLI command structure
- Authentication: login/logout with session persistence to .xevion-session
- API commands: projects, tags, settings CRUD operations with JSON/table output
- Serve command: run production server with configurable listen addresses
- Seed command: moved from bin/ to CLI subcommand for database initialization
- HTTP client abstraction supporting both TCP and Unix socket connections
2026-01-13 19:55:45 -06:00
b6d377a143 feat: implement portal action for modal rendering and add SvelteKit page state
- Add portal action to render modals at document.body, escaping stacking context
- Switch Discord modal from bindable prop to SvelteKit page state management
- Add cursor-pointer utility to interactive elements for better UX
2026-01-13 19:12:02 -06:00
f881e03055 refactor: implement better transitions, better component layout organization, fixup prerender CSR asset ability
- Replace simple fade with shared-axis slide transitions (exit left,
enter right)
- Persist background/theme toggle across navigations using
view-transition-name
- Skip transitions for admin routes (separate layout system)
- Extend prerendered asset serving to support __data.json files with
MIME detection
- Extract TagChip component from ProjectCard for reusability
- Remove AppWrapper component in favor of direct page-main class usage
- Disable removeOptionalTags in HTML minifier to prevent invalid markup
2026-01-13 18:52:20 -06:00
a849f91264 fix: suppress progress updates when not in TTY
Prevents escape codes from polluting CI/non-interactive logs
2026-01-13 16:45:20 -06:00
a6cc0b8e66 feat: add request ID propagation from Rust to Bun with structured logging
- Forward x-request-id header through proxy and API calls
- Store RequestId in request extensions for downstream access
- Add AsyncLocalStorage context to correlate logs across async boundaries
- Improve migration logging to show pending changes before applying
- Reduce noise in logs (common OG images, health checks)
2026-01-13 16:42:14 -06:00
6d8766d3a6 refactor: standardize structured logging across Rust and TypeScript
Convert string interpolation to structured fields in tracing/LogTape calls. Add target prefixes (rust::, bun:) to differentiate processes in combined logs.
2026-01-13 15:33:08 -06:00
fe23967c5e feat: redirect .html extensions to clean URLs 2026-01-13 15:19:52 -06:00
ec6bb4ebfb refactor: replace shell entrypoint with TypeScript, add DB retry logic
- Migrate Docker entrypoint from inline shell script to TypeScript for better maintainability
- Add exponential backoff DB connection retry (prod only, dev fails fast)
- Increase healthcheck start-period to account for DB warmup
2026-01-13 15:08:38 -06:00
eabe866d31 feat: enforce canonical URLs by redirecting trailing slashes 2026-01-13 14:17:42 -06:00
99f9b5e303 feat: add View Transitions API with persistent backgrounds
- Add fade in/out page transitions using View Transitions API
- Move background/dots to root layout for persistence across routes
- Hide native scrollbar immediately to prevent FOUC
- Set body background in theme script to prevent flash
- Increase inline style threshold for better initial render
2026-01-12 13:27:14 -06:00
97bef535a3 feat: replace PGP modal with Discord profile modal
- Remove PGP key modal component in favor of dedicated /pgp page
- Add Discord profile modal with avatar, banner, and copy username
- Convert PGP key link to navigate to dedicated page instead of modal
- Add focus-visible styles for keyboard navigation accessibility
2026-01-12 04:10:45 -06:00
6f538b599f feat: add production API commands for login and authenticated requests 2026-01-12 03:52:19 -06:00
9d231e6fdc feat: add ISR cache with stale-while-revalidate pattern
Implements in-memory caching for SSR pages using moka with:
- Configurable fresh/stale TTLs (60s/300s defaults)
- Background refresh for stale entries
- Cache invalidation on project/tag mutations
- Pre-cached icon collections on startup
- Skips cache for authenticated requests
2026-01-12 03:41:06 -06:00
462b510e14 feat: add icon picker for tags with Iconify integration
- Add icon field to tag creation/update API and handlers
- Install @iconify packages (json, types, utils) as production deps
- Build IconPicker component for tag admin UI
- Fix apiFetch lazy initialization for build-time safety
- Update Docker to install production dependencies for SSR runtime
2026-01-07 20:57:12 -06:00
dd1ce186d2 refactor: consolidate HTTP client for TCP/Unix socket handling
Extract reqwest client creation into dedicated HttpClient abstraction that handles both TCP and Unix socket connections transparently. Simplifies proxy logic by removing duplicate URL construction and client selection throughout the codebase.
2026-01-07 14:34:32 -06:00
dcc496c979 chore: resolve eslint/svelte-check lints/warnings 2026-01-07 14:00:41 -06:00
cf599d09d6 refactor: reorganize Rust codebase into modular handlers and database layers
- Split monolithic src/db.rs (1122 lines) into domain modules: projects, tags, settings
- Extract API handlers from main.rs into separate handler modules by domain
- Add proxy module for ISR/SSR coordination with Bun process
- Introduce AppState for shared application context
- Add utility functions for asset serving and request classification
- Remove obsolete middleware/auth.rs in favor of session checks in handlers
2026-01-07 13:55:23 -06:00
4663b00942 feat: add site settings management with identity and social links
- Add site_identity and social_links database tables
- Implement GET/PUT /api/settings endpoints (GET public, PUT authenticated)
- Replace hardcoded homepage content with database-driven settings
- Add admin settings UI with identity and social links editing
2026-01-06 22:48:10 -06:00
9ab22ea234 feat: add prerendered page serving from embedded build artifacts
Adds support for serving SvelteKit prerendered pages (e.g., /pgp, /about) directly from embedded build artifacts in Rust, bypassing Bun proxy. Handles multiple path patterns (direct HTML, index.html, root).
2026-01-06 22:01:33 -06:00
80061aad7a feat: add PGP public key page with multiple access endpoints
- Add dedicated /pgp page with key viewer and download options
- Support CLI-friendly endpoints (/publickey.asc, /pgp.asc, /.well-known/pgpkey.asc)
- Detect user-agent to serve raw key to curl/wget or HTML to browsers
- Add modal component for quick key access from homepage
- Embed static key file in Rust assets for efficient serving
2026-01-06 21:35:41 -06:00
5c4d3b6efa feat: add light/dark theme toggle with system preference detection
- Implement theme store with localStorage persistence
- Add ThemeToggle component with animated icon transitions
- Update color system with semantic tokens for light/dark modes
- Add blocking script in app.html to prevent FOUC
- Apply theme-aware styling across all public and admin pages
2026-01-06 20:31:24 -06:00
0149dc1df9 refactor: remove unused public projects page 2026-01-06 20:31:11 -06:00
2251bd276c refactor: implement full projects CRUD, move icons onto tag schema
- Remove priority field and sorting, switch to updated_at DESC
- Add icon field to tags table
- Split project description into name and short_description
- Implement full CRUD for projects (create, update, delete)
- Add admin stats endpoint (project counts by status)
2026-01-06 19:40:09 -06:00
cacee9ba14 feat: add tag color customization with hex picker
- Add nullable color column to tags table with hex validation
- Build ColorPicker component with preset palette and custom hex input
- Apply tag colors to project cards via border styling
- Update all tag API endpoints to handle color field
2026-01-06 18:17:28 -06:00