Personal site for Ethan Lew. A retro-Mac-styled portfolio built with Astro. Live at ethanlew.dev.
- Astro 7 (static output,
./dist/) - Tailwind CSS v4 via
@tailwindcss/vite - TypeScript (strict,
astro check) - oxfmt + Prettier (
.astrofiles only) for formatting - oxlint for linting
- Cloudflare serves
./distperwrangler.jsonc, so no deploy workflow is needed
/
├── public/ # static assets
├── src/
│ ├── components/macos/ # retro-Mac UI (Window, Titlebar, MenuBar, …)
│ ├── layouts/ # MacDesktop layout
│ ├── pages/ # index, about-site, projects, contact, resume
│ ├── styles/ # global Tailwind CSS
│ └── site.ts # shared site constants (links, URLs)
├── astro.config.mjs
├── wrangler.jsonc # Cloudflare assets: ./dist
└── .github/workflows/ # CI checks (format/lint)
Requires pnpm (see packageManager in package.json).
| Command | Action |
|---|---|
pnpm install |
Install dependencies |
pnpm dev |
Start local dev server at localhost:4321 |
pnpm build |
Typecheck (astro check) + build to ./dist/ |
pnpm preview |
Preview the production build locally |
pnpm lint |
Lint and autofix with oxlint |
pnpm format |
Format (oxfmt + Prettier for *.astro) |
pnpm format:check |
Check formatting without writing (same as CI) |
oxfmtformats everything except*.astro(see.oxfmtrc.json).prettier-plugin-astroformats*.astrofiles.oxlintlints (seeoxlint.config.ts).- Husky + lint-staged run the same tools on commit.
CI (.github/workflows/check.yml) runs on every push and PR: oxfmt --check, prettier --check '**/*.astro', oxlint, and astro check.