Skip to content

feat(press): add native press & brand kit page - #2662

Merged
abalinda merged 4 commits into
devfrom
feat/press-page
Aug 11, 2026
Merged

feat(press): add native press & brand kit page#2662
abalinda merged 4 commits into
devfrom
feat/press-page

Conversation

@0xkkonrad

@0xkkonrad 0xkkonrad commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Summary

Replaces the Notion-hosted press kit with a native /press page. /presskit and /press-kit now redirect to /en/press instead of bouncing to Notion.

  • New route: src/app/[locale]/(marketing)/press/page.tsx, mirrors the /team page pattern (readSingletonContentLocalized), reusing content/team/en.md for founder cards so there's one source of truth for names/roles/bios.
  • Content lives in content/press/en.md (mono, already pushed to main — content task, no PR): boilerplate (short/medium/press tiers), tagline + secondary line + 5 context headlines, brand asset manifest, company facts, media contact. All copy pulled verbatim from mono/content/_system/context/messaging.md §2/§3/§12.
  • Brand assets migrated from Notion into public/press/assets/: logos (svg/eps/ai), icon (svg/eps — no .ai source exists), wordmark (svg/eps/ai), brand guidelines PDF, KNERD Bubble font (individual ttf/otf/woff/woff2 files), mascot webps, and 8 team photos (EXIF/GPS metadata stripped before committing).
  • redirects.json: /presskit, /press-kit/en/press (was → Notion).
  • i18n: pressTitle/pressSubtitle added to en/es-419/es-ar/pt-br, 'press' added to ROUTE_SLUGS for hreflang alternates.

Task

https://app.notion.com/p/3b983811757981f1bd40c4f43c66dd32

Risks / breaking changes

  • Low risk — purely additive marketing page, no shared component changes, no backend/API surface touched.
  • redirects.json change means anyone with the old /presskit link now lands on-site instead of Notion — intentional, per the task.
  • Design notes / accepted trade-offs:
    • Founder bios in content/team/en.md are placeholder text (pre-existing TODO in that file, not introduced by this PR) — same bios already live on /team today.
    • media_contact is support@peanut.me (proven, already used everywhere in legal/support copy) rather than press@peanut.me, which doesn't exist as an alias yet. Flip it via a one-line content edit (no redeploy) once provisioned.
    • The 8 migrated team photos are unlabeled by design — no attempt was made to guess which founder is which without visual confirmation from a human.

QA

  • pnpm prettier --check . — clean
  • npm run typecheck — clean
  • npm test — 228 suites, 2903 passed, 3 skipped
  • npm run lint — 64 pre-existing warnings (baseline), 0 new from this PR's files
  • npm run build — not completed locally (OOM under heavy concurrent sandbox load, unrelated to this change); CI is the authoritative build gate
  • Manually verified /en/press renders all sections (hero, company description, tagline/headlines, brand assets, team + photos, media contact) via local dev server + screenshots at 375×667

Screenshots

Mobile (375×667), /en/press. Assets branch pr-assets-2662 — delete after merge.

Hero Company description
hero company description
Brand assets Team + photos
brand assets team
Media contact + footer
media contact

Summary by CodeRabbit

  • New Features
    • Added a localized press page featuring company information, team details, brand assets, company facts, and media contact details.
    • Added downloadable Peanut logo and wordmark assets.
    • Added press page metadata and structured company information for improved sharing and discoverability.
  • Navigation
    • Updated /presskit and /press-kit links to permanently redirect to the new press page.
  • Localization
    • Added press page and brand-kit translations for English, Spanish, and Brazilian Portuguese.

Replaces the Notion-hosted press kit (peanut.me/presskit redirect)
with a native /press page reading from content/press/en.md.

- New route: src/app/[locale]/(marketing)/press/page.tsx, mirrors
  the /team page pattern (readSingletonContentLocalized)
- Brand assets (logos, brand guidelines PDF, fonts, mascot webp,
  team photos) migrated from Notion into public/press/assets/ as
  individual files, EXIF/GPS stripped from team photos
- redirects.json: /presskit and /press-kit now point to /en/press
  instead of the Notion page
- i18n: pressTitle/pressSubtitle strings across en/es-419/es-ar/pt-br,
  'press' added to ROUTE_SLUGS for hreflang alternates
@vercel

vercel Bot commented Aug 11, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
peanut-wallet Ready Ready Preview Aug 11, 2026 11:16am

Request Review

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 0aa54d25-68eb-4974-ac99-97c40315d2e9

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The PR adds a localized press page with singleton content loading, translated metadata, Organization JSON-LD, brand and team sections, company facts, media contacts, press-kit redirects, and two Peanut logo assets.

Changes

Press page

Layer / File(s) Summary
Route, localization, and press data flow
src/app/[locale]/(marketing)/press/page.tsx, src/i18n/config.ts, src/i18n/types.ts, src/i18n/*.json
Adds the localized /press route, locale handling, metadata, translations, press and team singleton reads, and Organization JSON-LD.
Press content rendering
src/app/[locale]/(marketing)/press/page.tsx
Renders company descriptions, taglines, headlines, brand assets, team information, company facts, and media contacts.
Press route publishing and assets
redirects.json, public/press/assets/*
Redirects /presskit and /press-kit to /en/press and adds the Peanut full logotype and wordmark assets.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

Suggested labels: enhancement

Suggested reviewers: hugo0, innolope-dev, kushagrasarathe

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the main change: adding a native press and brand kit page.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/press-page

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Code-analysis diff

Painscore total: 7157.18 → 7164.93 (+7.75)
Findings: +7 net (+15 new, -8 resolved)

🆕 New findings (15)

  • critical complexity — src/lib/content.ts — CC 58, MI 61.8, SLOC 239
  • high complexity — src/app/[locale]/(marketing)/press/page.tsx — CC 40, MI 61.93, SLOC 87
  • medium high-mdd — src/app/[locale]/(marketing)/press/page.tsx:101 — PressPage: MDD 56.9 (uses across many lines from declarations)
  • medium structural-dup — app/[locale]/(marketing)/press/page.tsx:1 — 29 duplicate lines / 118 tokens with app/[locale]/(marketing)/team/page.tsx:1
  • medium high-mdd — src/app/[locale]/(marketing)/team/page.tsx:67 — TeamPage: MDD 25.3 (uses across many lines from declarations)
  • medium complexity — src/app/[locale]/(marketing)/team/page.tsx — CC 22, MI 60.36, SLOC 75
  • medium structural-dup — app/[locale]/(marketing)/press/page.tsx:66 — 20 duplicate lines / 100 tokens with app/[locale]/(marketing)/team/page.tsx:32
  • medium method-complexity — src/app/[locale]/(marketing)/press/page.tsx:101 — PressPage CC 20 SLOC 30
  • low high-mdd — src/app/[locale]/(marketing)/team/page.tsx:99 — : MDD 19.5 (uses across many lines from declarations)
  • low high-mdd — src/lib/content.ts:347 — listAllContent: MDD 11.3 (uses across many lines from declarations)
  • low structural-dup — lib/content.ts:219 — 10 duplicate lines / 50 tokens with lib/content.ts:232
  • low missing-return-type — src/app/[locale]/(marketing)/press/page.tsx:72 — generateStaticParams: exported fn missing return type annotation
  • low missing-return-type — src/app/[locale]/(marketing)/press/page.tsx:101 — PressPage: exported fn missing return type annotation
  • low missing-return-type — src/app/[locale]/(marketing)/team/page.tsx:38 — generateStaticParams: exported fn missing return type annotation
  • low missing-return-type — src/app/[locale]/(marketing)/team/page.tsx:67 — TeamPage: exported fn missing return type annotation

✅ Resolved (8)

  • src/lib/content.ts — CC 58, MI 61.74, SLOC 239
  • src/app/[locale]/(marketing)/team/page.tsx:78 — TeamPage: MDD 25.3 (uses across many lines from declarations)
  • src/app/[locale]/(marketing)/team/page.tsx — CC 22, MI 60.17, SLOC 75
  • src/app/[locale]/(marketing)/team/page.tsx:110 — : MDD 19.5 (uses across many lines from declarations)
  • src/lib/content.ts:329 — listAllContent: MDD 11.3 (uses across many lines from declarations)
  • lib/content.ts:201 — 10 duplicate lines / 50 tokens with lib/content.ts:214
  • src/app/[locale]/(marketing)/team/page.tsx:49 — generateStaticParams: exported fn missing return type annotation
  • src/app/[locale]/(marketing)/team/page.tsx:78 — TeamPage: exported fn missing return type annotation

📈 Painscore deltas (top movers)

File Before After Δ
src/app/[locale]/(marketing)/press/page.tsx 0.0 7.2 +7.2

@github-actions

github-actions Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

🧪 UI test report — ✅ all green

Suites

  • unit: 2906 ran, 0 failed, 0 skipped, 53.2s

📊 Coverage (unit)

metric %
statements 66.1%
branches 50.9%
functions 56.2%
lines 66.9%
⏱ 10 slowest test cases
time test
4.1s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › never places two stickers in heavy overlap (broad seed sweep)
1.3s src/utils/__tests__/demo-api.test.ts › isDemoMode() is false when not running under Capacitor
0.4s src/utils/__tests__/auth-token.test.ts › ignores the guarded marker and falls back to the plain token
0.4s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › every sticker stays within canvas at any count
0.3s src/utils/__tests__/sentry.utils.test.ts › defaults to the client budget under a browser global
0.3s src/app/(mobile-ui)/withdraw/__tests__/withdraw-states.test.tsx › Bank withdrawal keeps the $1 minimum for sub-$1 amounts
0.3s src/utils/__tests__/sentry.utils.test.ts › still lets a per-call timeoutMs win over the default
0.3s src/utils/__tests__/auth-token.test.ts › is none — never guarded — when only the guarded marker is present
0.3s src/app/actions/__tests__/api-headers.test.ts › should include Content-Type in validateInviteCode
0.3s src/utils/__tests__/auth-token.test.ts › returns the token hydrated from Preferences after authReady
📍 Inline annotations are in the **Unit test report** check above. Coverage artifact: `coverage-unit`. Generated by `.github/workflows/tests.yml`.

@0xkkonrad

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@public/press/assets/Peanut_Full_Logotype.ai`:
- Line 112: Sanitize both public Illustrator assets to remove embedded author
identity and other Illustrator document metadata before release: update
public/press/assets/Peanut_Full_Logotype.ai at lines 112-112 and
public/press/assets/Peanut_Wordmark.ai at lines 123-123 by re-exporting or
cleaning their metadata while preserving the artwork.

In `@src/app/`[locale]/(marketing)/press/page.tsx:
- Around line 75-79: Update the metadataHelper call in the press page metadata
configuration to pass the validated locale value, ensuring localized pages
populate openGraph.locale and openGraph.alternateLocale while preserving the
existing title, description, and canonical metadata.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 26384ce4-30a0-47ee-bbe3-017608f7dd77

📥 Commits

Reviewing files that changed from the base of the PR and between d707166 and 6ded0d9.

⛔ Files ignored due to path filters (20)
  • public/press/assets/Peanut_Brand_Guidelines.pdf is excluded by !**/*.pdf
  • public/press/assets/Peanut_Full_Logotype.svg is excluded by !**/*.svg, !**/*.svg
  • public/press/assets/Peanut_Icon.svg is excluded by !**/*.svg, !**/*.svg
  • public/press/assets/Peanut_Wordmark.svg is excluded by !**/*.svg, !**/*.svg
  • public/press/assets/font/Fill.otf is excluded by !**/*.otf
  • public/press/assets/font/Fill.ttf is excluded by !**/*.ttf
  • public/press/assets/font/KNERDFilled-Regular.woff is excluded by !**/*.woff
  • public/press/assets/font/KNERDFilled-Regular.woff2 is excluded by !**/*.woff2
  • public/press/assets/font/KNERDOutline-Regular.woff is excluded by !**/*.woff
  • public/press/assets/font/KNERDOutline-Regular.woff2 is excluded by !**/*.woff2
  • public/press/assets/font/Outline.otf is excluded by !**/*.otf
  • public/press/assets/font/Outline.ttf is excluded by !**/*.ttf
  • public/press/assets/team-photos/founder-photo-1.jpg is excluded by !**/*.jpg
  • public/press/assets/team-photos/founder-photo-2.jpg is excluded by !**/*.jpg
  • public/press/assets/team-photos/founder-photo-3.jpg is excluded by !**/*.jpg
  • public/press/assets/team-photos/founder-photo-4.jpg is excluded by !**/*.jpg
  • public/press/assets/team-photos/founder-photo-5.png is excluded by !**/*.png
  • public/press/assets/team-photos/founder-photo-6.png is excluded by !**/*.png
  • public/press/assets/team-photos/founder-photo-7.png is excluded by !**/*.png
  • public/press/assets/team-photos/founder-photo-8.png is excluded by !**/*.png
📒 Files selected for processing (18)
  • public/press/assets/Peanut_Full_Logotype.ai
  • public/press/assets/Peanut_Full_Logotype.eps
  • public/press/assets/Peanut_Icon.eps
  • public/press/assets/Peanut_Wordmark.ai
  • public/press/assets/Peanut_Wordmark.eps
  • public/press/assets/mascots/peanut-angry.webp
  • public/press/assets/mascots/peanut-cool.webp
  • public/press/assets/mascots/peanut-pointing-down.webp
  • public/press/assets/mascots/peanut-walking.webp
  • public/press/assets/mascots/peanut-waving-hello.webp
  • redirects.json
  • src/app/[locale]/(marketing)/press/page.tsx
  • src/i18n/config.ts
  • src/i18n/en.json
  • src/i18n/es-419.json
  • src/i18n/es-ar.json
  • src/i18n/pt-br.json
  • src/i18n/types.ts

Comment thread public/press/assets/Peanut_Full_Logotype.ai
Comment thread src/app/[locale]/(marketing)/press/page.tsx
…otos

Addresses /code-review findings:
- canonical/hreflang now use singletonLocaleFor + availableSingletonLocales
  (only content/press/en.md exists today), matching the pricing.tsx pattern
  instead of always advertising all SUPPORTED_LOCALES
- pass locale to metadataHelper for og:locale tags
- brand_assets file.href and team_photos entries are author-editable
  content/press/en.md frontmatter pushed straight to mono main with no
  code review — guard with the same safeHttpUrl() protocol check team.tsx
  uses for member.social links, so a javascript:/data: value can't reach
  a rendered href
- team photos: next/image instead of raw <img> (same-origin static
  assets, some are multi-MB PNGs)
@0xkkonrad

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 11, 2026

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

…content

This PR's press page introduced a second, slightly-diverged copy of
team/page.tsx's TeamMember/TeamFrontmatter interfaces (missing
image/social). Moved the one real shape into src/lib/content.ts,
exported, both pages import from there now — one source of truth for
content/team/en.md's frontmatter shape instead of two that can drift.
@0xkkonrad
0xkkonrad marked this pull request as ready for review August 11, 2026 12:39
@0xkkonrad
0xkkonrad requested a review from Hugo0 August 11, 2026 12:40
@abalinda
abalinda merged commit fb31d70 into dev Aug 11, 2026
20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants