Skip to content

feat: add side projects gallery with filtering - #14441

Open
andrewm4894 wants to merge 47 commits into
masterfrom
feature/side-projects-gallery
Open

feat: add side projects gallery with filtering#14441
andrewm4894 wants to merge 47 commits into
masterfrom
feature/side-projects-gallery

Conversation

@andrewm4894

@andrewm4894 andrewm4894 commented Jan 17, 2026

Copy link
Copy Markdown
Member

Context

i was wanting to add a demos page for llm analytics as we often have some apps useful for users to see different llma integrations or examples etc - eg currently working on agent using open ai agents sdk as example agent that can use llma for tracing (github-standup-agent) - over time we will have more and more of these and im sure others do too for different products

more context in longer slack thread here

Changes

Add a side projects gallery at /side-projects. Cards link straight to each project (live URL first, GitHub repo as fallback).

  • Projects live in the Squeak Strapi side-projects collection (companion PR: squeak-strapi#205) and are fetched client-side, matching how /events works. Team members add, edit, and delete projects in a side modal, gated by the same isModerator check; dev builds show the UI without sign-in so previews can exercise it
  • src/data/sideProjects.json is the bundled seed: it renders immediately, stays up if the API is unreachable, and scripts/seed-side-projects.mjs migrates it into Strapi after the backend deploys
  • Roadmap-style layout with a /slack-style rough highlight on the H1, a hiring pitch linking to the side gigs policy, and a small-print disclaimer
  • Findability: free-text search, tag pills ranked by usage with near-duplicate tags folded into a canonical set, and a creator filter limited to current team members; filters sync to the URL
  • Creator spotlight: community-profile avatar, name, and role on every card, linking to their profile; projects without an image get generated card art
  • Projects by former team members sit in a collapsed "PostHog Alums" section, auto-detected from community-profile team membership with an override flag
  • Link to LLM analytics side projects from docs (basics.mdx, demos.mdx) and add "Demos & examples" to LLM analytics navigation

After merge

  1. Deploy squeak-strapi#205, then grant public find/findOne and moderator create/update/delete on Side project in the Strapi admin.
  2. Run SQUEAK_JWT=<moderator jwt> node scripts/seed-side-projects.mjs once to migrate the seed entries.

URLs to test

  • /side-projects
  • /side-projects?tag=ai
  • /side-projects?creator=Andy%20Maguire

Checklist

  • Words are spelled using American English
  • Use relative URLs for internal links
  • I've checked the pages added or changed in the Vercel preview build
  • If I moved a page, I added a redirect in vercel.json (n/a)

Create a new /side-projects gallery page for PostHog team members to share
interesting side projects. Features include:

- Gallery page with dynamic tag filtering at /side-projects
- Individual project detail pages with author, GitHub, and live URL links
- Contribution guide for adding new projects
- Link from LLM analytics docs at /docs/llm-analytics/demos

Initial projects added:
- LLM Analytics Apps (multi-provider CLI demo)
- Andy's Daily Factoids (AI factoid generator)
- Repo Stalker (GitHub PR/Issue AI assistant)
- GitHub Standup Agent (AI standup summarizer)
- Anomstack (anomaly detection with LLM alerts)
- HogFlix / PostHog Demo 3000 (full PostHog demo)
- Plot Agent (AI data visualization)

Architecture follows existing Templates/Apps pattern with MDX content,
frontmatter-based filtering, and Gatsby page generation.
@vercel

vercel Bot commented Jan 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
posthog Ready Ready Preview Jan 19, 2026 2:19pm

Request Review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 55ac38556c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +41 to +48
useEffect(() => {
const params = new URLSearchParams(location?.search)
const filter = params.get('filter')
const value = params.get('value')

if (filter === 'tags' && value) {
filterProjects(value)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reset filters when URL query is cleared

The URL-driven filter state only updates when filter=tags and value are present, so if a user navigates from a filtered URL back to /side-projects without query params (e.g., browser back/forward or a link to the base page), the component keeps the old filteredProjects/currentFilter and shows filtered results even though the URL no longer requests a filter. Consider resetting the filter state when filter/value are missing to keep UI and URL in sync.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in the latest push – filter state re-syncs from location.search on every navigation and clears when the params are absent.

- Replace list view with responsive card grid (3/2/1 columns)
- Add projectThumbnail field to schema for string image URLs
- Rename author to projectAuthor to avoid schema conflict with blog posts
- Add side projects link to community nav menu
- Remove tag filter chips for cleaner UI
- Add screenshots for Repo Stalker and Anomstack
- Add HouseWatch (ClickHouse monitoring toolkit, 607 stars)
- Add DeskHog (ESP32 developer toy, 459 stars)
- Add PostHog Wizard (AI-powered integration CLI, 80 stars)
- Add MaxAI (AI support bot from Aruba hackathon)
- Add side projects link to "Things that spark joy" menu
- Replace code icon placeholder with random hedgehog characters
- Add thumbnail images for side projects gallery
- Add anomaly-agent project entry
- Remove guide and max-ai projects
- Add README with contribution instructions
- Add collapsible filter panel with tag and author filters
- URL-encoded filters for shareable links
- Use GitHub OpenGraph images as thumbnail fallback
- Add 18 new side projects: Pigeon Maps, Kea, FrameOS, Backname,
  G-Desktop-Suite, and more from top PostHog contributors
- Clean up existing projects by removing "Try it" sections
- Add custom thumbnails for backname, kea, pigeon-maps
- Update demos.mdx to use simpler ?tag= URL format
- Add "See it in action" section to basics.mdx with link to demos
@andrewm4894 andrewm4894 changed the title Add side projects gallery Side projects gallery with filtering and 29 projects Jan 18, 2026
Link to community profile /community/profiles/37401 for all 6 of Andy Maguire's side projects using the teamLink frontmatter field.
Prioritize teamLink frontmatter field over profile lookup for author links in the gallery cards.
- Change tagline to "Side projects are awesome, help us learn and make us better at building stuff"
- Remove thumbnails from SF Mono Powerline and PagerBot to use GitHub OpenGraph fallback
New side projects from PostHog/posthog.com contributors:
- whatsapp-mcp (lharries) - WhatsApp MCP server for Claude integration
- seegit (haacked) - Real-time Git repository visualizer
- django-subdomains (tkaemming) - Django subdomain URL routing
- aspnet-client-validation (haacked) - jQuery-free ASP.NET validation
- routemagic (haacked) - ASP.NET routing utility
- gutenberg-migration-guide (danielbachhuber) - WordPress migration docs
- one-time-login (danielbachhuber) - WordPress one-time login URLs
- pypi-assistant (Twixes) - VS Code PyPI package info extension
- comp-scraping (lucasheriques) - Brazil salary data scraper
- modulus-checker (pauldambra) - UK bank account validation
- somsiad (Twixes) - Polish Discord bot
- auth0-web-extension (pjhul) - Auth0 for browser extensions
- medium-markdown (neilkakkar) - Medium to Markdown converter
- metnopy (andehen) - Norwegian weather data API
- poabus (rafaeelaudibert) - Porto Alegre bus route visualization
- terraformation (benjackwhite) - Terraform state UI
- writeconcise (ivanagas) - Concise writing tool
- sheetstodashboard (alexkim205) - Spreadsheet to dashboard converter

Added thumbnails for 6 projects with visual UIs.
@andrewm4894 andrewm4894 self-assigned this Jan 19, 2026
@andrewm4894 andrewm4894 changed the title Side projects gallery with filtering and 29 projects feat: ass side projects gallery with filtering Jan 19, 2026
Deploy previews use GATSBY_MINIMAL, which skipped side project detail pages entirely, so reviewers could not click through to any project from the gallery in a PR preview.

Generated-By: PostHog Code
Task-Id: 7750396d-c811-4d3a-a521-dfc389676a3a
@andrewm4894 andrewm4894 added the reviewhog Prompts a review from the reviewhog bot label Aug 6, 2026
@andrewm4894

Copy link
Copy Markdown
Member Author

happy to help test etc - all should be fairly safe i think as a new path and part of site so might be easier to ship and make incremental prs on top or we can wait and do big one via previews etc - im easy either way @joethreepwood - feel free to do whatever approach and i can help if/where needed.

…upload

Restyle the gallery to match /roadmap (Editor layout with hero header), widen the grid to four columns with more spacing, replace GitHub OpenGraph thumbnail fallbacks with generated card art adapted from EventGraphic (project title, creator avatar, role, logo bar), and let the add-project form upload a featured image to the media library.

Generated-By: PostHog Code
Task-Id: 7750396d-c811-4d3a-a521-dfc389676a3a
Split projects by former team members into a collapsed "PostHog Alums" section (auto-detected from community-profile team membership, overridable via frontmatter), fold near-duplicate tags into a canonical set, order projects newest first via an added date, restrict the creator filter to current team members, highlight projects not made by engineers with a badge and filter, swap the hero for the brand coding-group illustration, drop the Live badge, add card-level edit shortcuts, show the team add/edit UI without sign-in on dev builds so previews can exercise it, update the header copy, add Atuin, remove HogFlix and the LLM analytics demo entry, and fix the FrameOS image by generating its card art.

Generated-By: PostHog Code
Task-Id: 7750396d-c811-4d3a-a521-dfc389676a3a
… remove HouseWatch

Generated-By: PostHog Code
Task-Id: 7750396d-c811-4d3a-a521-dfc389676a3a
Detail pages added little over the card itself, so cards now open the project directly (live URL first, GitHub repo as fallback) in a new tab. Removes the SideProject template, its page creation in full and minimal builds, and the form's body field.

Generated-By: PostHog Code
Task-Id: 7750396d-c811-4d3a-a521-dfc389676a3a
@joethreepwood joethreepwood self-assigned this Aug 6, 2026
@joethreepwood

Copy link
Copy Markdown
Contributor

I think good for reviews now!

Three check runs from the earlier Actions outage are wedged in queued
state and reject cancellation; this empty commit mints fresh check runs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QSyozUtvjmz3AreJbkaa47

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4b151066df

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@@ -0,0 +1,586 @@
import { Logo } from '@posthog/brand/logo'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Add the required component README

This commit creates a substantial new SideProjects component directory containing the gallery utilities and add/edit flow, but the directory has no README.md. Add comprehensive documentation covering the component's usage, data contract, and contribution flow as required for every new component.

AGENTS.md reference: AGENTS.md:L134-L135

Useful? React with 👍 / 👎.

Comment thread src/components/SideProjects/index.tsx Outdated
Comment on lines +461 to +462
const canSubmit =
Boolean(values.title.trim() && values.description.trim() && values.projectAuthor.trim()) && !submitting

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Require at least one project target URL

When a moderator leaves both URL inputs blank, this condition still enables submission. buildSideProjectMdx then omits both URLs, while ProjectCard derives its link solely from liveUrl || githubUrl, so merging the generated file creates an unclickable gallery card despite the contribution README requiring at least one target. Include the presence of either URL in this validation.

Useful? React with 👍 / 👎.

Comment thread src/components/SideProjects/index.tsx Outdated
Comment on lines +392 to +395
const lines = ['---', `title: ${values.title.trim()}`]
if (values.description.trim()) {
lines.push(`description: ${values.description.trim()}`)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Escape form values when generating frontmatter

Free-text form values are interpolated into YAML without quoting or serialization. A routine description such as Dashboard: visualizes usage makes the generated frontmatter invalid, while values such as true, [work], or a title beginning with # can be coerced or discarded, causing the generated PR to fail content parsing or publish incorrect metadata. Serialize these values as valid YAML scalars rather than concatenating them directly.

Useful? React with 👍 / 👎.

Comment on lines +278 to +280
if (search) {
const haystack = [title, description, projectAuthor, ...tags].filter(Boolean).join(' ').toLowerCase()
return haystack.includes(search)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep aliased source tags in the search index

For every tag present in TAG_ALIASES, normalizeTags discards the original value before the search haystack is built. As a result, searching for a technology such as dagster does not find Anomstack even though its frontmatter contains that tag, because the tag has become data and the original term occurs nowhere else; this contradicts the intended behavior that one-off tags remain searchable. Include the raw tags alongside their canonical forms in the search haystack.

Useful? React with 👍 / 👎.

Comment thread src/components/SideProjects/index.tsx Outdated
Comment on lines +473 to +477
if (featuredImage?.file) {
const uploaded = await uploadImage(featuredImage.file, await getJwt())
thumbnailUrl = uploaded?.url || thumbnailUrl
}
window.open(getNewProjectUrl({ ...values, projectThumbnail: thumbnailUrl }), '_blank', 'noopener')

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Open the GitHub tab before awaiting the image upload

When a featured image is selected, this window.open runs only after the JWT lookup and network upload have been awaited, so it is no longer reliably associated with the submit gesture and popup blockers can return null without opening GitHub, especially in Safari or after a slow upload. The code still sets submitted to true in that case, falsely telling the contributor that the tab opened. Open a blank tab synchronously during submission and navigate it after the upload, or use a same-tab redirect.

Useful? React with 👍 / 👎.

projectAuthor: Danilo Campos
authorGitHub: danilocampos
githubUrl: https://github.com/PostHog/DeskHog
liveUrl: https://posthog.com/deskhog

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Use a relative URL for the DeskHog project

Because cards prefer liveUrl and pass it through Link, this absolute PostHog URL is treated as external and opens DeskHog in a new browser tab instead of using the site's internal OS-style navigation. Change it to /deskhog, as required for internal links.

AGENTS.md reference: AGENTS.md:L115-L115

Useful? React with 👍 / 👎.

Comment thread src/pages/side-projects.tsx Outdated
Comment on lines +295 to +297
const hasActiveFilters = Boolean(searchQuery.trim() || tagFilter || creatorFilter)
const visibleTags = showAllTags ? rankedTags : rankedTags.slice(0, VISIBLE_TAG_COUNT)
const showAlumni = alumniExpanded || hasActiveFilters

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Let the alumni toggle work while filters are active

Whenever search, tag, or creator filtering is active, hasActiveFilters forces showAlumni to remain true regardless of alumniExpanded. The visible alumni header still presents itself as an expandable button and updates alumniExpanded when clicked, but its content and aria-expanded state cannot collapse, leaving users with a nonfunctional control during the exact state in which the section is automatically opened. Either allow the explicit toggle to override automatic expansion or stop presenting it as collapsible while filters are active.

Useful? React with 👍 / 👎.

- Add the required README for the SideProjects component directory
- Serialize generated frontmatter values as single-quoted YAML scalars so
  colons, hashes, and keyword-like values can't break or coerce the file
- Require at least one of repo/live URL in the add-project form (cards
  link to liveUrl || githubUrl, so neither means an unclickable card)
- Open the GitHub tab synchronously on submit before awaiting the image
  upload so popup blockers don't eat it; fall back to same-tab navigation
- Let the alumni toggle collapse while filters are active (auto-expand on
  filter activation instead of forcing the section open)
- Keep raw tags in the search haystack so aliased one-offs (e.g. dagster)
  stay findable
- Use a relative liveUrl for DeskHog so it opens with internal navigation

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QSyozUtvjmz3AreJbkaa47

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ce97ef6a17

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/components/SideProjects/index.tsx Outdated
label="Live URL"
name="liveUrl"
direction="column"
type="url"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Accept relative live URLs

For projects hosted on posthog.com, contributors should enter an internal path such as /deskhog, but the browser's native validation for type="url" rejects relative URLs and prevents the form's submit handler from running. This makes the documented add-project flow unusable for internal projects unless contributors violate the repository's internal-link convention; allow relative paths here or validate both relative and absolute URLs explicitly.

AGENTS.md reference: AGENTS.md:L109-L116

Useful? React with 👍 / 👎.

type="url" native validation rejected site-relative paths like /deskhog,
which the internal-link convention requires. Validate explicitly instead:
absolute http(s) URLs or paths starting with /.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QSyozUtvjmz3AreJbkaa47

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e91098c3fc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/pages/side-projects.tsx Outdated
setTagFilter(tag)
setCreatorFilter(creator)
}
}, [location?.search])

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Subscribe to the app window's query location

When a /side-projects window already exists and another window navigates to /side-projects?tag=...—including the new docs links—the app shell only refreshes the stored AppWindow.location (src/context/App.tsx:2158-2168) while continuing to render the original element (src/components/AppWindow/index.tsx:857). Consequently, this dependency remains unchanged and the effect neither applies nor clears the incoming filter. Fresh evidence after the prior fix is this existing-window path; read useWindow().appWindow.location.search and update the URL through the router instead.

AGENTS.md reference: AGENTS.md:L3-L5

Useful? React with 👍 / 👎.

Comment thread src/pages/side-projects.tsx Outdated
<IconPencil className="size-4" />
</Link>
)}
<Link to={projectUrl} externalNoIcon className="block">

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Open internal project targets in a new app window

When projectUrl is site-relative—currently DeskHog uses /deskhog—this link performs an in-place Gatsby navigation, so the app shell replaces the focused gallery window instead of opening the project separately. External project targets open browser tabs, and internal creator links already request newWindow, so pass state={{ newWindow: true }} for relative project targets to preserve the gallery window.

AGENTS.md reference: AGENTS.md:L3-L5

Useful? React with 👍 / 👎.

Comment thread src/components/SideProjects/index.tsx Outdated
Comment on lines +382 to +384
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '')

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject titles that produce an empty project slug

For a project name containing no ASCII letters or digits, such as a Chinese-only or emoji-only title, these replacements remove every character and return an empty slug. getNewProjectUrl consequently asks GitHub to create /index.mdx instead of <slug>/index.mdx, while canSubmit only checks that the original title is nonempty, so the handoff proceeds without a valid project directory. Validate that the generated slug is nonempty or use a Unicode-aware slugger.

Useful? React with 👍 / 👎.

Comment thread src/pages/side-projects.tsx Outdated
<Link
to={getEditProjectUrl(relativePath)}
externalNoIcon
className="absolute right-2 top-2 z-10 rounded-md border border-primary bg-primary p-1.5 text-secondary opacity-0 transition-opacity hover:text-primary group-hover:opacity-100"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reveal the edit link on keyboard focus

For a signed-in moderator navigating by keyboard, this edit anchor remains in the tab order but stays at opacity-0 because visibility is only enabled by group-hover. Focusing it therefore produces an invisible active control with no discoverable edit affordance; add a focus-visible:opacity-100 state (or reveal it when the card contains focus).

Useful? React with 👍 / 👎.

- Read filters from the app window's location so an existing /side-projects
  window picks up ?tag= links from other windows (matches the fm and
  community profile pages' pattern)
- Open site-relative project links in a new app window, preserving the
  gallery window like external links and creator links already do
- Reveal the moderator edit link on keyboard focus, not just hover
- Reject titles whose slug is empty (no ASCII letters/digits) so the
  GitHub handoff can't target /index.mdx

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QSyozUtvjmz3AreJbkaa47

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1fbe21326d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +320 to +322
className={`relative aspect-video w-full overflow-hidden bg-${background} ${
darkText ? 'text-black' : 'text-white'
}`}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Replace stock colors with project tokens

When generated artwork is shown for a project without a thumbnail, this component applies stock text-black/text-white classes, along with nearby border-white and bg-white, instead of the project's themed color tokens. Replace these with project tokens so the artwork follows the repository's theming conventions.

AGENTS.md reference: AGENTS.md:L153-L155

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keeping the literal colors here deliberately: SideProjectGraphic mirrors EventGraphic (src/components/EventGraphic/index.tsx), which uses the same text-black/text-white/border-white/bg-white values. The artwork renders over a fixed profile-color background, so it must not shift with the site theme – theme tokens would break contrast in dark mode. The lazy-loading comment from this review is fixed in the latest push.


Generated by Claude Code

Comment on lines +328 to +331
<img
src={avatarUrl || DEFAULT_HEDGEHOG}
alt=""
className="absolute bottom-0 left-1/2 w-[108%] max-w-none -translate-x-1/2"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Lazy-load generated-card avatars

For every project without projectThumbnail—currently a large portion of the gallery—the newer SideProjectGraphic path eagerly loads its creator avatar or fallback because this image has no loading="lazy". The unfiltered gallery therefore initiates dozens of below-the-fold avatar requests even though the explicit-thumbnail branch is lazy-loaded; apply the same loading behavior here.

Useful? React with 👍 / 👎.

claude and others added 3 commits August 6, 2026 21:28
The SideProjectGraphic avatar had no loading attribute, so every
below-the-fold generated card fetched its avatar on first paint.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QSyozUtvjmz3AreJbkaa47
@charlescook-ph

Copy link
Copy Markdown
Collaborator

this will need an @ianmatson or @smallbrownbike review, as style wise it's very different to the rest of the website so can't really go out as is.

couple of intermediate suggestions for you though @joethreepwood:

  • Opening text - you could make this more of a pitch for people who want to work at PostHog and link to our side gigs policy to show how we encourage this stuff. I'd also put a boring yet cheeky disclaimer that PostHog obv isn't responsible for any of this stuff if bricks your computer or whatever.
  • The filters can just be visible from the off, they don't need to hide under a dropdown
  • You don't need all these intermediate landing pages - just more pages to maintain. When you click on a tile, couldn't it just go straight to the project?
  • I would personally keep this to stuff that actually feels like a 'this is a project someone did on the side that is their thing' rather than PostHog work - I'd remove DeskHog, Hogflix, Housewatch, PostHog Wizard for this reason.
  • I can't tell where in the nav this sits on the redesigned site as preview is showing me the old website, but under 'Company' would prob make the most sense.

@joethreepwood

Copy link
Copy Markdown
Contributor

Think you may have been looking at an old deploy, as some of those things are already fixed (e.g. no DeskHog, no intermediate pages) on my end - but will update on the rest!

…projects

Address review feedback: pitch the page at prospective hires with a link to the side gigs policy plus a disclaimer that these are personal projects, move the nav entry from Community/Sparks joy to Company, and remove DeskHog and PostHog Wizard since they are PostHog work rather than personal side projects.

Generated-By: PostHog Code
Task-Id: 7750396d-c811-4d3a-a521-dfc389676a3a
Generated-By: PostHog Code
Task-Id: 7750396d-c811-4d3a-a521-dfc389676a3a

Copy link
Copy Markdown
Contributor

All of the suggestions from the review above are now in:

  • Opening text: the header now pitches prospective hires – it links to the side gigs policy and /careers, plus a boring-but-cheeky disclaimer that these are personal projects, not PostHog products.
  • Filters visible from the off: done in an earlier pass – search, tag pills, and the creator select all sit inline on the page now, no collapsed panel.
  • No intermediate landing pages: also done earlier – detail pages are deleted and each tile links straight to the project (live URL first, repo as fallback).
  • Only actual side projects: DeskHog and PostHog Wizard are now removed too (HogFlix and HouseWatch went in a previous pass).
  • Nav placement: moved from Community/Sparks joy to the Company menu in both the classic nav and the redesigned taskbar.

Still outstanding: the design review flagged at the top of the thread.

Replace the MDX-plus-pull-request flow with the events pattern: projects are fetched client-side from the Squeak Strapi side-projects collection (PostHog/squeak-strapi#205) and team members add, edit, and delete them in a closable side modal. The former MDX entries become a bundled seed that renders immediately, survives API outages, and migrates via scripts/seed-side-projects.mjs. Also highlight the H1 with the /slack-style rough annotation, shrink and stylize the small print with updated copy, and add Railcode by Yakko Majuri to the alumni set.

Generated-By: PostHog Code
Task-Id: 7750396d-c811-4d3a-a521-dfc389676a3a
@joethreepwood

Copy link
Copy Markdown
Contributor

Decided that, sod it, let's just fully refactor this around Squeak instead of clumsy .mdx files too. Those changes should be landing soon, though there's a dependency in the PR above.

@andrewm4894 want to take a look?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

reviewhog Prompts a review from the reviewhog bot

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

8 participants