Commit Graph

164 Commits

Author SHA1 Message Date
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
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
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
eca50ef319 feat: add Iconify-based icon system with search and picker UI
- Replace Font Awesome with Iconify (@iconify/json collections)
- Add IconPicker component with search, collection filtering, lazy loading
- Create authenticated icon API endpoints (search, collections, individual icons)
- Update projects page to render icons via Icon.svelte component
- Pre-cache common icon collections (Lucide, Simple Icons, etc.) on startup
2026-01-06 16:01:09 -06:00
be718976d6 feat: add favicons, support embedded assets properly
- Refactor asset serving to check embedded assets before proxying
2026-01-06 12:26:51 -06:00
c6dd1dffb0 feat: add cookie-based session authentication system
- Add admin user management with Argon2 password hashing
- Implement session management with ULID-based tokens and 7-day expiry
- Add authentication middleware for protected routes and API endpoints
- Forward validated session to SvelteKit via trusted X-Session-User header
- Refactor admin panel to use server-side authentication checks
2026-01-06 11:33:38 -06:00
16bf2b76f3 feat: add admin panel with project and tag management
- Full CRUD interface for projects with GitHub integration and tagging
- Real-time event log with expandable metadata viewer
- Reusable component library (Badge, Button, Input, Modal, Table,
TagPicker)
- Server-side API client with Unix socket and HTTP support
- JWT-based authentication with Svelte 5 reactive stores
- Settings management for social links and site identity
- Remove /admin path from tarpit to allow legitimate access
2026-01-06 10:07:59 -06:00
045781f7a5 feat: add comprehensive tagging system with cooccurrence tracking
- Add tags, project_tags, and tag_cooccurrence tables with proper indexes
- Implement full CRUD API endpoints for tag management
- Add tag association endpoints for projects with automatic cooccurrence updates
- Include related tags and project filtering by tag functionality
2026-01-06 03:18:23 -06:00
b4c708335b feat: add PostgreSQL database integration for projects
- Add SQLx with Postgres support and migration system
- Create projects table with status enum and auto-updated timestamps
- Implement database queries and API response conversion layer
- Add Justfile commands for database management and seeding
- Integrate health checks for both Bun and database connectivity
2026-01-06 02:07:42 -06:00
3c6f61c4e4 feat: add prerendered error pages with Rust integration
- Prerender 20+ HTTP error codes (4xx/5xx) at build time
- Embed error pages in binary and serve via Axum
- Intercept error responses for HTML requests
- Add transient flag for retry-worthy errors (502/503/504)
2026-01-06 00:43:00 -06:00
2a710d584e feat: add connection tarpit for malicious bot traffic
Implements slow-drip response handler for known bot paths (wp-admin, phpmyadmin, etc.) to waste attacker resources. Includes per-IP and global connection limits, configurable delays, and random chunking. Also applies clippy lint fixes across codebase.
2026-01-05 18:19:09 -06:00
553bae5a7f fix: properly handle binary proxied responses, enforce bun usage, proper mobile-friendly frontend 2026-01-05 15:15:08 -06:00
96595b073d refactor: replace sveltekit-og with native Satori implementation
- Remove @ethercorps/sveltekit-og and bits-ui dependencies
- Implement direct Satori + Resvg rendering pipeline
- Add OgImage.svelte component for template generation
- Create /internal/ogp preview page for development
- Load fonts from node_modules via fs for production compatibility
- Add 2s startup delay before OG image regeneration
2026-01-05 15:15:08 -06:00
81d9541b44 feat: add health checks, OG image generation, and R2 integration
- Implement health check system with caching and singleflight pattern
- Add OG image generation via Satori with R2 storage backend
- Configure Railway deployment with health check endpoint
- Add connection pooling and Unix socket support for Bun SSR
- Block external access to internal routes (/internal/*)
2026-01-05 03:16:55 -06:00
9de3c84f00 feat: add Docker containerization with multi-stage build
Includes .dockerignore, Dockerfile with cargo-chef caching, and Justfile commands for building/running containerized app. Updates console-logger to support both JSON and pretty-printed logs based on LOG_JSON env var.
2026-01-04 20:23:11 -06:00
edf271bcc6 feat: add request validation and HEAD method support
- Validate Content-Type for API requests (application/json only)
- Add HEAD method handlers for all routes
- Add 1MB request body limit
- Improve method not allowed responses with Allow header
2026-01-04 19:21:53 -06:00
32f1f88a90 feat: embed SvelteKit client assets in Rust binary
- Add include_dir for serving /_app static bundles from binary
- Add console-logger.js for structured JSON logs from Bun
- Fix API routing edge cases and add method restrictions
2026-01-04 19:16:08 -06:00
d86027d27a feat: add Rust reverse proxy with JSON logging
- Axum-based API server with Unix socket and TCP support
- Custom tracing formatters for Railway-compatible JSON logs
- SvelteKit hooks and Vite plugin for unified logging
- Justfile updated for concurrent dev workflow with hl log viewer
2026-01-04 18:21:00 -06:00
af81d8e048 refactor: large refactor around monorepo
Just a commit point while I'm testing stuff. Already decided at this
point to simplify and revert away from PayloadCMS.
2026-01-04 13:18:34 -06:00
31b1804fc9 refactor: redesign homepage navigation and social links
- Move navigation to top-right header
- Replace simple underline links with styled card-based social links
- Add RSS and GitHub icons to header
- Remove About section from top nav
2026-01-03 13:45:38 -06:00
ac7618f2fd feat: redesign homepage with Radix UI and add dev environment defaults
- Replace title/tagline homepage with social profile design
- Add Radix UI Themes + icon libraries for modern UI components
- Provide sensible dev defaults for DB/secrets (no .env required)
- Add production safety checks for critical env vars
- Make optional features (cron, healthcheck) gracefully skip when unconfigured
2026-01-01 23:41:35 -06:00
da366b9538 chore: migrate from Tailwind v3 to v4 and upgrade dependencies
Major changes:
- Upgrade Tailwind CSS from v3 to v4 with @tailwindcss/postcss
- Remove deprecated Tailwind v3 configuration and PostCSS plugins
- Upgrade Zod from v3 to v4
- Update React Markdown and other dependencies to latest versions
- Remove @plaiceholder, @headlessui, and other unused dependencies
- Replace SCSS with standard CSS globals
- Add font packages (@fontsource-variable) for better typography
- Consolidate Prettier configuration to .prettierrc
- Remove legacy contact page and custom Payload SCSS
- Add Mantine hooks and Lucide React for improved UI components
2025-10-26 01:38:22 -05:00
0dcf6f93ba feat: migrate from Next.js Pages Router to App Router with Payload CMS
Complete architectural overhaul migrating from Directus+tRPC to Payload CMS with Next.js App Router. This represents a fundamental shift in how the application is structured and how data is managed.

Major changes:
- Migrated from Pages Router (src/pages/) to App Router (src/app/)
- Replaced Directus CMS with Payload CMS as the content management system
- Removed tRPC in favor of Payload's built-in API routes
- Added PostgreSQL database via Docker Compose for local development
- Implemented separate route groups for frontend and Payload admin
- Updated all API routes to App Router conventions
- Added Payload collections for Projects, Technologies, Links, Media, and Users
- Configured ESLint for new project structure

Infrastructure:
- Added docker-compose.yml for PostgreSQL database
- Updated environment variables for Payload CMS configuration
- Integrated @payloadcms/next for seamless Next.js integration
- Added GraphQL API and playground routes

Dependencies:
- Upgraded React from 18.2.0 to 19.2.0
- Upgraded Next.js to 15.5.6
- Added Payload CMS 3.x packages (@payloadcms/db-postgres, @payloadcms/next, etc.)
- Removed Directus SDK and tRPC packages
- Updated Sharp to 0.34.x
- Migrated to @tanstack/react-query v5
2025-10-26 00:58:10 -05:00
6c043630df feat: add internal healthcheck api route for directus 2025-07-20 22:53:21 -05:00
129a59340a Switched /api/resume to /resume with ISR, added additional classic redirects 2025-04-05 22:10:03 -05:00
b768f5a40d Fix req.method comparison METHOD check 2025-03-21 12:28:39 -05:00
5a1ab61c65 Fix /resume redirect links, add /api/resume route 2025-03-21 12:26:34 -05:00
ee1e1cfdf6 Continue improving projects page layout 2025-01-01 03:02:07 -06:00
697a6a7a18 Format change, sort by date_updated descending 2024-12-31 20:08:50 -06:00
95acb1cafa Remove extra console.log 2024-12-31 19:55:54 -06:00
23c6b68179 Allow passing CRON_SECRET via query parameter, use production only, don't return response directly 2024-12-31 19:54:21 -06:00
07872bcfbf Extend index page to 60 second revalidate
Main reason is because the edge requests are kinda spending a lot more
bandwidth than I should be allowing. I assume due to updown.io
2024-12-31 19:40:45 -06:00
fbe2834a0a Allow CRON_SECRET to be optional 2024-12-31 19:38:38 -06:00
ef44d6c1ba automatic update cron implementation, vercel cron, type guards 2024-12-31 19:36:01 -06:00
c3997a1df5 setup CRON_SECRET, DIRECTUS_API_TOKEN, GITHUB_API_TOKEN, static directus token authentication 2024-12-31 16:58:09 -06:00
9b003a5640 Fix navbar hotbox issues via z-index 2024-12-30 15:24:40 -06:00
85fb7781fd Switch to .env, use multiple projects 2024-12-29 17:00:53 -06:00
4141af5406 Make text selectable, because why not 2024-12-29 16:55:12 -06:00
a280b61c5e Vercel does not support multiple environments for free, so we use a hack instead :) 2024-12-29 16:49:41 -06:00
6f13f7814c OVERRIDE_TITLE env 2024-12-29 16:43:54 -06:00
692df157a1 Fix select-none affecting surrounding elements of title 2024-12-29 16:34:07 -06:00
0945d706f4 Fix linting errors, title padding, add subtitle 2024-12-28 21:36:16 -06:00
d75925ba1f Tune icons, allow div/a element based on link availability, 'Projects' h1 2024-12-28 21:30:11 -06:00
55b491bd33 Use directus return types, fix project link nested type API response 2024-12-28 21:01:25 -06:00