Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
fa4c70d
feat(home): Rebuild the homepage from the redesign
traksaw Jul 31, 2026
a1cd5a8
feat(home): Fill the skyline band with artwork cut from the poster
traksaw Aug 1, 2026
bbcc752
ref(styles): Drop three animation utilities no component uses
traksaw Aug 1, 2026
6307c0a
ref(home): Make the stat line a component so its numbers can animate
traksaw Aug 1, 2026
4dc5aa5
ref(home): Move homepage motion into a module and refresh after fonts…
traksaw Aug 1, 2026
c565f5f
feat(home): Give GSAP work that justifies carrying it
traksaw Aug 1, 2026
bdbe90c
feat(home): Grow the skyline as you scroll instead of panning it side…
traksaw Aug 2, 2026
be96f73
feat(home): Scale the city inside a fixed band instead of growing the…
traksaw Aug 2, 2026
f1ba32a
feat(home): Remove the skyline band
traksaw Aug 2, 2026
8cc45dd
docs(spec): Design the five-page site redesign around The Room
traksaw Aug 2, 2026
de52793
docs(plan): Plan the motion system foundation (slices 1-2)
traksaw Aug 2, 2026
65a94e3
docs(perf): Record the Lighthouse baseline before the motion system
traksaw Aug 2, 2026
6ffe694
ref(motion): Move the homepage choreography into a declarative motion…
traksaw Aug 2, 2026
c87ecab
test(motion): Assert the stagger is uneven, deterministic and per-sec…
traksaw Aug 2, 2026
2524059
feat(sections): Add Section.astro and adopt it on the homepage
traksaw Aug 2, 2026
dbbe88f
test(no-js): Assert the site degrades flat rather than blank
traksaw Aug 2, 2026
144dfe7
fix(motion): Confine the count-up to the gate the pin already had
traksaw Aug 2, 2026
9d09368
fix(motion): Bound the stagger delay and let a group share one trigger
traksaw Aug 2, 2026
89c9cb8
ref(sections): Rename Section's `role` prop to `band` and spread the …
traksaw Aug 2, 2026
15634cb
test(motion): Run the desktop-only gates at a phone viewport
traksaw Aug 2, 2026
bcd2ceb
docs(perf): Disclose the run-to-run spread behind the baseline numbers
traksaw Aug 2, 2026
5539ab0
docs(plan): Carry the review's deferred observations into slice 4
traksaw Aug 2, 2026
ada82f4
docs(plan): Settle the door colour at yellow
traksaw Aug 2, 2026
9e76d13
fix(motion): Slow the entrance until its character is legible
traksaw Aug 2, 2026
49e0ac8
feat(motion): Put the hero on the motion system and let it argue for …
traksaw Aug 2, 2026
de2d85f
feat(home): Dark header, real event photos, and responsive mosaic ima…
traksaw Aug 3, 2026
cf8cbfe
Merge branch 'main' into waskar/site-redesign
traksaw Aug 5, 2026
e220ddc
Merge branch 'main' into waskar/site-redesign
traksaw Aug 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -159,3 +159,10 @@ playwright/.cache/
# `astro check` (and therefore `npm run build`) runs first, so nothing needs it
# committed — tracked, it just produced a dirty tree on every dev server start.
.astro/

# Superpowers brainstorm scratch (visual companion)
.superpowers/

# macOS Finder metadata. Browsing public/ in Finder drops these into the
# deploy directory, where they would be served as real files.
.DS_Store
52 changes: 52 additions & 0 deletions docs/adding-content.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,58 @@ The card on `/blog` will link directly to your content. PhilaCon Valley amplifie

Same as above but without `externalUrl` and `platform`. Write the full content in the Markdown body and it will be hosted on the site.

## Adding Event Photos

The homepage's "The room" section renders a five-photo mosaic under the headline
"Every photo is a real Thursday." Until there are photos, the section renders no
mosaic at all and the headline reads "Come see the room." instead — the claim and
the evidence ship together or not at all.

Two steps. Put the image file in `public/images/gallery/`:

```
public/images/gallery/patch-002-pairing.webp
```

Then add one JSON file per photo in `src/content/gallery/`:

```json
// src/content/gallery/patch-002-pairing.json
{
"image": "/images/gallery/patch-002-pairing.webp",
"alt": "Two people pairing on a laptop at a long table",
"event": "PATCH 002: Tap In NFC Lab",
"date": "2026-07-30"
}
```

### Field reference

| Field | Required | Notes |
| --------- | -------- | ------------------------------------------------------------------------------- |
| `image` | Yes | Site-absolute path into `public/`, starting with `/images/`. Not a file import. |
| `alt` | Yes | What is happening in the photo, for screen readers. Not "event photo". |
| `event` | Yes | Which night it was taken at. |
| `date` | Yes | `YYYY-MM-DD`. The five most recent photos are the ones the homepage shows. |
| `caption` | No | Optional visible caption. |

The homepage takes the five newest by `date`, so adding a sixth retires the
oldest rather than growing the grid. YAML (`.yaml` / `.yml`) works too if you
prefer it — the collection accepts both.

**The first photo gets a double-height cell.** The mosaic's leftmost tile spans
two rows, so whichever entry sorts first should be a **portrait** photo. A
landscape shot there gets cropped to a tall slot, which cuts people off at both
edges — a wide group photo is the worst thing to put in it. Give the group shot
one of the four wide cells instead.

Sorting is newest `date` first; entries sharing a date fall back to filename
order. So among photos from the same night, `patch-001-pairing.json` comes
before `patch-001-together.json`.

**Before you add a photo:** make sure the people in it are okay with being on a
public homepage. There is no way to un-publish a face someone finds later.

## What About GitHub Repos?

The `/projects` page automatically displays all repositories from the [philaconvalley GitHub organization](https://github.com/philaconvalley). If your project is in the org, it shows up with no file needed.
Expand Down
45 changes: 45 additions & 0 deletions docs/perf-baseline.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Performance baseline

Captured on `waskar/site-redesign` at commit `de52793`, immediately
before the motion system landed. Spec §5.5 gates the redesign on staying within 3 performance
points of these numbers.

Command: `npx --yes @lhci/cli@0.15.x autorun --config=.lighthouserc.json --collect.numberOfRuns=3` (resolved to `@lhci/cli@0.15.1`)
Machine: local dev (numbers are not comparable to CI — re-baseline there if CI is ever the gate).

| URL | Performance | Accessibility | Best practices | SEO |
| ------------ | ----------- | ------------- | -------------- | ----- |
| `/` | `79` | `95` | `93` | `100` |
| `/about/` | `84` | `95` | `93` | `100` |
| `/events/` | `92` | `96` | `75` | `100` |
| `/projects/` | `81` | `93` | `96` | `100` |

## Read the performance column as a median, not a measurement

The table records the median of three runs. The runs were not tight. `/about/` scored
`0.77 / 0.84 / 0.95` — an 18-point spread on one machine, in one sitting, against one build.
The other pages were sampled the same way and there is no reason to think they are steadier.

That matters because spec §5.5's gate is ±3 points, and the noise here is six times the gate.
Three local runs cannot resolve a 3-point change: a page that genuinely regressed by 3 points
will often score _higher_ than this table, and an unchanged page will often score lower. Taken
at face value, `84` sends the next implementer chasing a regression that does not exist, or
waving through one that does.

So evaluate the gate like this:

1. **CI is the enforcement surface.** If the numbers here are ever used to block a change, they
must first be re-taken in CI, where the machine is at least consistent between runs. The
figures above are local and indicative — useful for spotting a page that halved, not for
adjudicating three points.
2. **Locally, compare medians of at least 5 runs, taken back-to-back in one sitting**, with the
same command and nothing else running. Compare median against median, never a single run
against this table.
3. **Record the spread, not just the median**, whenever this file is updated. A median with no
spread beside it reads as precision the measurement does not have.
4. **Treat a sub-5-point local move as no signal at all.** Investigate the trace (LCP, TBT, the
actual bytes shipped) rather than the score, because those are stable where the composite
score is not.

If any page later drops more than 3 performance points against this table, measured that way,
spec §5.5 applies: depth drops to two planes site-wide before anything else is cut.
Loading
Loading