A Next.js portfolio where hiring teams and collaborators can inspect projects, try browser tools, and play an arcade game before getting in touch. Public work is available without signing in; a separate admin area manages imported tools and site content.
Visit the portfolio · Explore the projects · Read the résumé · View CI
| Project | What to explore |
|---|---|
| M-Local | Local Impact Grand Prize team project; my UI and QR redemption contribution. |
| MCP-to-COBOL bridge | Original contribution summary and a clearly synthetic illustration. |
| TravOS | Working prototype with simulated workers, artifact verification, and retained rejection evidence. |
| Pixel Workshop | A pixel editor implemented within this application. |
| Project collection | Release Signal, TableSense poker practice, The Cosmonaut’s Bar, Adventure, and the broader collection of tools and case studies. |
| Lumen Garden | An external browser demo linked from the portfolio. |
The site also includes a terminal, hidden discoveries, themes, and visitor progression. These support exploration; visitors can go directly to work, résumé, or contact.
This is my personal portfolio and project collection. The repository brings together public pages, browser demos, an admin tool system, and their supporting application code. Linked projects have their own scope and attribution; this repository is the site that presents them.
My strongest production experience is COBOL and VB.NET in manufacturing ERP. Over eight years at Global Shop Solutions, I worked on established business behavior, modernization, production support, and tools that help other teams understand the system. My C#/.NET experience supports that integration work. This site demonstrates my more recent TypeScript and React work; it is separate from employer software.
| Area | Implementation |
|---|---|
| Application | Next.js 15 App Router, React 19, TypeScript |
| Interface | Tailwind CSS 4, shadcn/ui, Radix UI, Lucide, Motion, Sonner, next-themes |
| Data and identity | Supabase PostgreSQL, row-level security, GitHub OAuth with PKCE |
| Interactive work | Canvas 2D game engine, Three.js demos, Web Audio |
| Forms and content | React Hook Form, Zod, React Markdown, remark-gfm |
| Hosting and email | Netlify configuration and a Resend contact endpoint |
| Checks | Vitest, React Testing Library, jsdom, ESLint, GitHub Actions |
Use Node.js 20 and npm, matching CI and Netlify configuration. Public pages can render without service credentials. Configure your own Supabase project for sign-in, saved progression, and admin tools.
git clone https://github.com/CosmonautJones/Portfolio.git
cd Portfolio
npm ci
cp .env.example .env.localOn PowerShell, use Copy-Item .env.example .env.local for the last command.
- Fill in the Supabase URL, anon key, service role key, and admin email in
.env.local. - Apply the SQL files in
supabase/migrations/in ascending version order to your own database. The setup guide covers migrations and existing-history reconciliation. - For sign-in, enable GitHub OAuth in Supabase, set the local site URL to
http://localhost:3000, and allowhttp://localhost:3000/auth/confirm. Set the GitHub OAuth app callback to your Supabase project’s/auth/v1/callbackURL. - Add Resend credentials to exercise email delivery. The contact endpoint returns
503when email is unconfigured.
npm run devOpen localhost:3000. See the local setup guide, auth guide, and deployment guide for full configuration.
.env.example is the configuration template. Keep server credentials out of browser code and source control.
| Variable | Needed for |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Supabase client initialization; safe to expose as a project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Browser and middleware clients; access depends on database policies |
SUPABASE_SERVICE_ROLE_KEY |
Server-side admin operations; bypasses RLS, so keep it server-only |
ADMIN_EMAIL |
Matching the authenticated GitHub email for /tools and /admin access |
RESEND_API_KEY |
Sending contact email from the server |
RESEND_FROM_EMAIL |
A verified Resend sender/domain |
CONTACT_TO_EMAIL |
Contact recipient; the endpoint falls back to the site’s configured email |
GITHUB_TOKEN |
Optional higher GitHub API rate limits for imports; unrelated to OAuth login |
- Separate the visitor path from administration. Home, work, about, résumé, contact, and public demos do not require sign-in. Both
/toolsand/adminrequire the configured admin identity; non-admin accounts are redirected to Adventure. See session middleware. - Keep tools flexible. External tools link out, internal tools load React components lazily, and embedded tools serve stored HTML through
/api/embed/[slug]in an iframe. Each has different integration and trust boundaries. See the tool system. - Keep simulation logic outside React. The Frogger-style engine in
src/lib/game/uses a fixed timestep; a React canvas component connects it to the page. Canvas sprite caching and procedural Web Audio keep the arcade implementation self-contained. See the game engine. - Verify privileged mutations on the server. Middleware checks session claims for routing; admin actions also verify the user before using the service-role client. Row-level security governs user-owned data. The contact form posts to
/api/contact, which validates the request and sends through Resend. See authentication and database design. - Make exploration optional. XP, achievements, terminal commands, and easter eggs sit alongside professional content. They do not gate the public collection. See progression and terminal behavior.
| Path | Purpose |
|---|---|
src/app/ |
Public, auth, protected, and adventure route groups; contact and embed endpoints |
src/components/ |
Portfolio, demo, tool, progression, terminal, and UI components |
src/actions/ |
Tool/project management, notes, profiles, scores, auth, and deploy hooks |
src/lib/constants.ts |
Site identity, projects, skills, navigation, and experience; also feeds terminal commands |
supabase/migrations/ |
Schema, triggers, and access policies for tools, notes, profiles, XP, achievements, scores, and events |
docs/README.md |
Documentation index: architecture, components, testing, deployment, and more |
- The live portfolio and Actions on
mainshow current public behavior and repository checks. Passing CI does not prove contact delivery, OAuth configuration, or every external project’s readiness. - Public access does not grant access to the admin tool hub. Local authentication, persisted progression, and admin workflows require configured Supabase services.
- Email delivery depends on Resend credentials and a verified domain. GitHub imports depend on the GitHub API; imported or external tools have their own requirements.
- This README does not represent employer code or certify the production readiness of linked experiments. See each project’s repository for its status and limitations.
- The mission and review log retain existing follow-ups, including previously reported dependency vulnerabilities and a React hook warning. Check current CI and dependency reports for their present state.
| Command | Purpose |
|---|---|
npm run dev |
Development server with Turbopack |
npm test |
Vitest suite |
npm run test:watch |
Interactive test watcher |
npm run lint |
ESLint |
npm run build |
Production build |
npm start |
Serve a completed production build |
See testing guidance for existing unit and component tests.
The current mission and product rubric guide further work:
- Keep the path from professional background to a useful artifact and contact clear.
- Improve demo loading/failure states, mobile readability, keyboard use, and reduced-motion behavior.
- Keep project access and résumé evidence current before expanding hidden features or admin tooling.
Hosting, DNS, and operational reference
The repository’s netlify.toml targets Node 20, builds with npm run build, publishes .next, and uses Netlify’s Next.js plugin. Existing deployment documentation describes deployment from main; Netlify PR checks provide deployment feedback.
Production configuration includes Supabase values and contact email credentials. The documented domain is travisjohnjones.com. Existing documentation describes Netlify DNS / NS1; confirm the authoritative zone before infrastructure changes.
For Resend verification, documented sending records are TXT at resend._domainkey, MX and TXT at send, and an optional _dmarc TXT record. Use values supplied by Resend for your own domain. If Netlify/NS1 is authoritative, records belong in that zone rather than only at the registrar.
Admin tools can store Netlify build-hook URLs and call the triggerDeploy server action. See deployment guidance for environment, OAuth, host, and build-hook details. Sharp supports Next.js image/build optimization.
Related projects and contributor guidance
Related repositories include AI Usage Overlays, Mission Control, and The Conductor. They are separate projects with separate requirements.
Before product work, read AGENTS.md, vision, core loop, taste bar, and anti-goals. Scope and acceptance live in tasks/current-mission.md, tasks/completed.md, and evals/product-rubric.md.