Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

393 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Personal Portfolio Website

Personal portfolio built with Next.js 16, React 19, TypeScript, Tailwind CSS 4, and shadcn-ui. The project now runs on the Bun toolchain.

Tech Highlights

  • Next.js 16 (pages router) with React 19
  • Tailwind CSS 4 with shadcn-ui + Radix UI primitives
  • React Hook Form, Zod validation, Resend mail API
  • Bun 1.3 for scripts, installs, and development workflow

Prerequisites

  • Bun v1.3 or newer

Install & Run

bun install
bun run dev   # starts Next.js and exposes it at https://lyra.tailb44a3.ts.net/

Useful Scripts

  • bun run dev – start the Next.js dev server and expose it through Tailscale Serve at https://lyra.tailb44a3.ts.net/
  • bun run dev:local – start the Next.js dev server without configuring Tailscale Serve
  • bun run dev:tailnet:status – show the active Tailscale Serve configuration
  • bun run dev:tailnet:off – disable the HTTPS proxy on port 443
  • bun run lint – lint the project with Oxlint
  • bun run test – run unit tests with Vitest
  • bun run test:run – run the unit test suite once for CI/local verification
  • bun run typecheck – run TypeScript without emitting build output
  • bun run check – run lint, typecheck, unit tests, and a production build
  • bun run build – create a production build
  • bun run start – serve the production build locally

Deployment Notes

  • Build command: bun run build
  • Output directory: .next
  • Required env: RESEND_API_KEY (and optional CONTACT_TO_EMAIL / CONTACT_FROM_EMAIL for contact form delivery)
  • Optional env: CONTACT_RATE_LIMIT_ENDPOINT and CONTACT_RATE_LIMIT_ENDPOINT_TOKEN to delegate contact-form rate limiting to a durable service. The endpoint receives { key, maxRequests, windowMs }, must return { allowed: boolean }, and must answer within 2 seconds or the request fails closed.
  • CONTACT_RATE_LIMIT_KEY_SECRET is required whenever CONTACT_RATE_LIMIT_ENDPOINT is set; without it the contact API fails closed instead of sending client-address hashes derived from a public fallback. See .env.example for the full variable list.

Releases

Packages

Contributors

Languages