Skip to content

About

Welcome to the source code of my website!

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Repository files navigation

Edward Vaisman's Website

Interactive personal website built with Astro and hosted on Cloudflare Workers. Features a macOS-inspired terminal interface with integrated LLM capabilities for resume queries and interaction. Looking for my resume? Head on over to my resume repository

🚀 Project Structure

/
├── public/                   # Static assets served as-is
│   └── favicon.svg          # Browser favicon
├── src/
│   ├── assets/              # Project assets (images, fonts, etc.)
│   │   └── wallpapers/      # Background wallpaper images
│   ├── components/          # Reusable UI components
│   ├── hooks/              # React custom hooks
│   ├── icons/              # Custom SVG icons
│   ├── layouts/            # Page layout templates
│   ├── middleware/         # Request middleware (rate limiting, CORS)
│   ├── pages/             # Route components and API endpoints
│   │   └── api/           # API route handlers
│   │       └── llm/       # Language model integration endpoints
│   ├── styles/            # Global styles and Tailwind config
│   └── utils/             # Shared utility functions
└── package.json

🧞 Commands

All commands are run from the root of the project:

Command Action
bun install Installs dependencies
bun run dev Starts local dev server at localhost:4321
bun run build Build your production site
bun run preview Preview your build locally with Wrangler (run bun run build first)
bun run deploy Build and deploy to Cloudflare Workers
bun run test Run unit (Vitest) and e2e (Playwright) suites
bun run fix Format and auto-fix with Ultracite
bun run cf-typegen Generate Cloudflare types

Content management

Blog posts live in EmDash CMS (Cloudflare D1-backed, Portable Text). In local dev, miniflare simulates D1/R2 under .wrangler/state/. Start the dev server and visit /_emdash/api/setup/dev-bypass?redirect=/_emdash/admin once to seed the content from .emdash/seed.json and open the admin panel. To reset the local database: rm -rf .wrangler/state.

AI model configuration

The resume assistant defaults to stable gemini-3.5-flash-lite, which supports the existing PDF input and text output. Google's model lifecycle lists the previous gemini-3.1-flash-lite-preview as shut down on May 25, 2026.

To override the default locally, set GOOGLE_AI_MODEL_ID in your .env file:

GOOGLE_AI_MODEL_ID=gemini-3.5-flash-lite

An existing production Worker override may take precedence over the code default. If needed, update it with bunx wrangler secret put GOOGLE_AI_MODEL_ID for the intended Worker environment. This configuration refresh does not change production settings.

For rollback, explicitly override with a supported model such as stable gemini-3.1-flash-lite, after checking its lifecycle; reverting the code alone restores the retired preview default. When choosing a model, check current pricing: as of October 20, 2026, standard paid rates per million tokens are $0.30 input / $2.50 output for 3.5 Flash-Lite versus $0.25 input / $1.50 output for 3.1 Flash-Lite (text/image/video input).

Deploying

The site deploys as a Cloudflare Worker (wrangler deploy against the build-generated dist/server/wrangler.json). One-time setup for a new Worker environment:

bunx wrangler secret put GOOGLE_API_KEY   # required by /api/llm/gemini
bun run deploy

The SESSION KV namespace is auto-provisioned by the Cloudflare adapter on first deploy. Custom-domain routing is managed in the Cloudflare dashboard.

🛠️ Technologies

Demo

Desktop Example

Desktop

Mobile Example

Mobile

About

Welcome to the source code of my website!

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Used by

Contributors

Languages