Modern photography portfolio built with Astro.
- Astro + Tailwind CSS
- File-based content collections (
src/content/photos) - Responsive optimized images (
src/assets/photos) - Static search index with Pagefind
- GitHub Pages deployment via Actions
- Bun 1.3+
If Bun is not installed:
curl -fsSL https://bun.sh/install | bashbun install
bun run devsrc/pages/- routes (/,/about,/photo/[slug], feeds/SEO endpoints)src/components/- gallery, lightbox, shared UIsrc/content/photos/- photo metadata markdownsrc/assets/photos/- optimized full/thumb images for Astropublic/images/- mirrored full/thumb images for legacy URL continuityscripts/add-photo.ts- ingestion pipeline for new photosscripts/import-legacy.ts- one-time migration from oldimages/folders
bun run add-photo -- \
--input /absolute/path/to/image.jpg \
--title "Golden Hour Street" \
--description "Late evening in Old Delhi" \
--tags "street,evening,city" \
--location "New Delhi" \
--featuredWhat this does:
- Reads EXIF metadata where available.
- Generates optimized full and thumb JPEGs.
- Copies images into Astro assets and legacy public image paths.
- Creates a content entry in
src/content/photos.
If you still have old files in images/fulls and images/thumbs:
bun run import-legacyThis creates metadata entries and copies assets into the new Astro structure.
bun run check
bun run build
bun run previewAfter build, generate/update search index:
bun run sync-pagefind- Production deployment is handled by
.github/workflows/deploy-astro.yml. - On push to
main, Actions builds and deploysdist/to GitHub Pages. - Current live URL:
https://shots.deveshsangwan.com/. - Custom domain is configured via
public/CNAME.
Manual ingestion from URL is available through .github/workflows/ingest-photo.yml (workflow_dispatch).
Design direction and token rules are documented in docs/design-system.md.