# benjaminpalko.ca Personal website and blog for Benjamin Palko, built with SvelteKit and deployed on Netlify. ## Stack - SvelteKit 5 / Svelte 5 - TypeScript (strict) - Tailwind CSS 4 + daisyUI - mdsvex markdown for blog posts - pino (server-side logging) - `@lucide/svelte` icons ## Prerequisites - [mise](https://mise.jdx.dev) (or Node + the pnpm version pinned in `mise.toml`) ## Setup ```bash pnpm install ``` ## Development ```bash pnpm dev # start dev server pnpm dev --open # start dev server and open the app in a browser ``` ## Scripts | Command | What it does | | ---------------- | ---------------------------------------------- | | `pnpm dev` | Start dev server | | `pnpm build` | Production build | | `pnpm preview` | Preview the production build | | `pnpm check` | `svelte-kit sync` + `svelte-check` (typecheck) | | `pnpm lint` | Prettier check + ESLint | | `pnpm format` | Prettier write | | `pnpm test:unit` | Vitest (watch mode) | | `pnpm test` | Vitest (single run) | ## Blog Posts live at `src/lib/posts/*.md` as mdsvex markdown. Follow `src/lib/posts/template.md.sample` for frontmatter (`title`, `description`, `image`, `date`, `categories`, `published`). Categories are one of `development`, `work`, `life`. The slug is the filename; only posts with `published: true` appear on the site. See `AGENTS.md` for the full authoring workflow. ## Deployment Netlify deploys the `main` branch automatically. The GitHub Actions PR gate (`.github/workflows/pr.yml`) runs lint, typecheck, tests, and build on every pull request using `pnpm`. Before shipping, verify locally with: ```bash pnpm lint && pnpm check && pnpm test && pnpm build ```