No description
  • Astro 47.5%
  • TypeScript 40.5%
  • CSS 5.2%
  • Shell 2.3%
  • Python 1.7%
  • Other 2.8%
Find a file
Philipp Moritz 66e5950838
All checks were successful
Deploy to Cloudflare Pages / deploy (push) Successful in 3m51s
design: adds instagram to social links
2026-06-10 15:30:01 +00:00
.devcontainer design: beginning changing design system 2026-06-10 09:24:52 +00:00
.forgejo/workflows ci: removes astro cache as no benefit 2026-06-09 11:22:44 +02:00
.vscode ci: initial commit 2026-06-08 11:00:40 +02:00
public design: beginning changing design system 2026-06-10 09:24:52 +00:00
src design: adds instagram to social links 2026-06-10 15:30:01 +00:00
.env.example ci: initial commit 2026-06-08 11:00:40 +02:00
.gitignore ci: initial commit 2026-06-08 11:00:40 +02:00
astro.config.mjs feat: enhance category page with eager loading for first image and lazy loading for others 2026-06-09 16:45:24 +02:00
CONTEXT.md docs: upload design docs 2026-06-10 09:32:22 +00:00
DESIGN.md design: updates layout of category still wip 2026-06-10 14:44:39 +00:00
package-lock.json design: beginning changing design system 2026-06-10 09:24:52 +00:00
package.json design: beginning changing design system 2026-06-10 09:24:52 +00:00
PLAN.md feat: adds photography galleries and media possibilites 2026-06-08 16:47:20 +02:00
README.md docs: update readme 2026-06-08 17:05:47 +02:00
sanity-typegen.json ci: initial commit 2026-06-08 11:00:40 +02:00
sanity.cli.ts ci: initial commit 2026-06-08 11:00:40 +02:00
sanity.config.ts ci: updates file picker to use media assets 2026-06-09 12:05:21 +02:00
schema.json sanity: removes logo from site settings 2026-06-10 15:11:31 +00:00
skills-lock.json ci: initial commit 2026-06-08 11:00:40 +02:00
tsconfig.json ci: initial commit 2026-06-08 11:00:40 +02:00

Philmori — Photography Portfolio

Astro (SSG) + Tailwind v4 + Sanity. Minimal, image-first photographer portfolio. Production: https://photo.philmori.com

See PLAN.md for the full design/decision record.

Stack

  • Astro static site (SSG). React kept only for the embedded Sanity Studio at /admin.
  • Tailwind v4 (light-only theme), self-hosted Inter via @fontsource-variable/inter (no Google Fonts CDN — GDPR).
  • Sanity content (f59mn4z8 / production, public read dataset).
  • Astro View Transitions for cross-page fades, @astrojs/sitemap for sitemap.

Content model

Type Purpose
category Field-driven nav sections (slug, order, description). Drives /[category].
work A photo series: categories[], client, year, cover, gallery, credits.
homepage Singleton: curated full-bleed image wall, images optionally link to a work.
siteSettings Singleton: name, tagline, bio, socials, contact, SEO description.

Adding a category/work in Studio requires a rebuild to regenerate static pages (see auto-rebuild webhook below).

Routes

  • / — full-bleed image wall (homepage singleton)
  • /[category] — grid of work covers (generated from category docs)
  • /work/[slug] — full-bleed vertical gallery + credits
  • /about, /contact, /imprint, /privacy

Commands

Command Action
npm run dev Dev server at localhost:4321
npm run build Build static site to ./dist/
npm run preview Preview the build locally
npm run typegen Extract Sanity schema + regenerate src/sanity/sanity.types.ts
npx astro check Type-check .astro files

After changing schema files: npm run typegen then npx sanity schema deploy.

Deployment

Forgejo Actions → Cloudflare Pages (wrangler CLI). See .forgejo/workflows/deploy.yml.

  • Production: push to master.
  • Preview: push any other branch (--branch=<branch> → CF preview deployment).
  • CI secrets required: CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID.

Auto-rebuild on content publish

Cloudflare Pages is not git-connected here (build runs from Forgejo via wrangler), so a CF deploy hook won't rebuild from source. Instead, trigger the Forgejo workflow:

  1. In Forgejo, create an access token with repo scope.
  2. In Sanity (manage.sanity.io → API → Webhooks), add a webhook:
    • URL: https://git.philmori.com/api/v1/repos/philmori/philmori-homepage/dispatches
    • Method: POST
    • Header: Authorization: token <FORGEJO_TOKEN>
    • Body: { "event_type": "sanity-publish" }
    • Trigger on: create / update / delete (published perspective)
  3. The repository_dispatch (type sanity-publish) handler in deploy.yml rebuilds and deploys production.