pawelcislo.com
April 27, 2026 Β· View on GitHub
Personal website and blog of PaweΕ CisΕo.
Migrated from WordPress to Astro Starlight and hosted on Cloudflare Pages.
π Project Structure
Inside of your Astro + Starlight project, you'll see the following folders and files:
.
βββ .github/workflows/ # GitHub Actions (yearly rebuild)
βββ plugins/ # Custom remark/rehype plugins
βββ public/ # Static assets served as-is (favicon, linked images, etc.)
βββ scripts/ # Utility scripts (sync recommendations, link checker, etc.)
βββ src/
β βββ assets/ # Optimised assets (processed by Astro)
β βββ components/ # Custom Astro components (Footer, PageTitle, ThemeSelect, etc.)
β βββ content/
β β βββ docs/
β β βββ knowledge/ # Knowledge base pages (Obsidian, Espanso, etc.)
β β βββ pages/ # Legacy subfolder (images only)
β β βββ posts/ # Blog posts with images
β βββ content.config.ts # Content collection schema
β βββ pages/ # Custom Astro pages (404, RSS, tags)
β β βββ tags/ # Tag index and individual tag pages
β βββ styles/ # Custom CSS overrides
βββ .editorconfig # Editor formatting rules
βββ .gitattributes # Enforces LF line endings & marks binary files
βββ .nvmrc # Pins the Node.js version
βββ astro.config.mjs # Site configuration
βββ COPYRIGHT # Content copyright notice
βββ package.json # Dependencies and scripts
βββ README.md # This file
βββ tsconfig.json # TypeScript configuration
Content organization:
- Starlight looks for
.mdor.mdxfiles in thesrc/content/docs/directory - Each file is exposed as a route based on its file name
- Blog posts are in
src/content/docs/posts/(auto-generated in sidebar) - Top-level pages (Portfolio, FAQ, Uses, etc.) live directly in
src/content/docs/ - Images are in
src/content/docs/posts/images/andsrc/content/docs/pages/images/
π¨π»βπ» Getting Started
- Install Node.js from nodejs.org (includes npm)
- Install dependencies:
npm install - Start development server:
npm run dev
πΎ Commands
All commands are run from the root of the project, from a terminal:
| Command | Action |
|---|---|
npm install | Installs dependencies |
npm run dev | Starts local dev server at localhost:4321 |
npm run build | Build your production site to ./dist/ (auto-syncs recommendations page) |
npm run preview | Preview your build locally, before deploying |
npm run sync:recommendations | Sync recommendations page from GitHub |
npm run check:links | Audit all content pages for broken/outdated external links (pass a path to limit, e.g. npm run check:links -- posts/) |
npm run check:editorconfig | Check files against .editorconfig rules (trailing whitespace, final newline, line endings) |
npm run typecheck | Run astro check to validate Astro/TS/MDX types and content frontmatter |
npm run verify | Run all pre-push checks: typecheck + check:editorconfig + build |
npm update | Updates packages within semver ranges |
npm outdated | Shows which packages have newer versions |
npm run astro ... | Run CLI commands like astro add, check |
npm run astro -- --help | Get help using the Astro CLI |
π Deployment
This site is deployed on Cloudflare Pages with automatic deployments from GitHub.
βββββββββββ git push βββββββββββ webhook ββββββββββββββββββββ
β VS Code β ββββββββββββββββΊ β GitHub β βββββββββββββββΊ β Cloudflare Pages β
βββββββββββ βββββββββββ ββββββββββ¬ββββββββββ
β
npm run build
β
βΌ
ββββββββββββ CDN ββββββββββββββββ static βββββββββββββββββββ
β Visitors β βββββββββββββββ β Edge Network β ββββββββββ β Astro SSG β
ββββββββββββ ββββββββββββββββ βββββββββββββββββββ
Deployment flow:
- Push changes to the
mainbranch - Cloudflare Pages automatically builds and deploys
- Preview the
mainbranch build at pawelcislo.pages.dev - Changes are live at pawelcislo.com
Before pushing, run the combined verification script:
npm run verify
This runs, in order:
npm run typecheckβ validates Astro/TS/MDX types and content frontmatter (fast fail)npm run check:editorconfigβ checks trailing whitespace, final newlines, line endingsnpm run buildβ the same pipeline Cloudflare runs (including the recommendations sync)
If all three pass, the push should deploy cleanly.
Additionally, a GitHub Actions scheduled workflow triggers a Cloudflare rebuild on January 1st each year to update the copyright year in the footer.