Milestone cards show tracking data only (status, payout, dates, reviewer, deliverables, links). Review discussion happens on the proposal issue on GitHub; the app no longer fetches comments or posts reviews — drops ReviewComposer, postReviewComment, fetchMilestoneReviews, and the MilestoneReview comment-parsing conventions. The PAT is now only needed for filing feedback. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
4.0 KiB
DevRel Station
The developer relations hub for Logos. Home (/) is the station overview;
each DevRel responsibility gets its own tab, added one at a time. Live today:
- RFPs (
/rfps) — delivery tracking for accepted logos-co/rfp proposals: milestone progress, engineering reviews, and finance payouts. - Content Factory (
/content-factory) — collections of published resources (e.g. a tutorial series on X), one markdown file per collection listing its links. Seedata/CONTENT_FACTORY_TEMPLATE.md. - Feedback (
/feedback) — every GitHub issue labeledfeedbackacross the logos-co org, fetched live. The on-page form (needs the Connect GitHub token, scoped to include this repo) files new feedback as afeedback-labeled issue in this repository (defaultlogos-co/devrel-station, override withNEXT_PUBLIC_FEEDBACK_REPO) — the station gathers its own feedback. Triage happens on GitHub — comment, relabel, close; the issue is the record.
Every area follows the same pattern: one markdown file per tracked item
in data/<area>/, with structured YAML frontmatter the dashboard reads.
Editing a status field updates the boards; git history is the audit trail.
npm install
npm run dev # http://localhost:3000
Optionally set GITHUB_TOKEN in the environment to raise the GitHub API rate
limit (everything works unauthenticated too).
RFP tracking — how it works
data/rfps/*.md is the source of truth for delivery tracking.
One file per accepted proposal, with structured milestones in YAML
frontmatter. Proposal issues on GitHub are free-form and inconsistent, so we
normalise each accepted proposal into this format once, at acceptance time.
See data/RFP_TEMPLATE.md for the template and the status
workflow.
Pages
- RFPs board (
/rfps) — stat tiles (active deliveries, milestones awaiting engineering review, approved-but-unpaid amounts, paid vs committed) and a table of all tracked deliveries. - Delivery detail (
/rfps/<slug>) — per-milestone cards with status, payout, dates, allocated reviewer, deliverables, and links.
Review discussion itself happens on the proposal issue on GitHub (linked from
the detail page header); when engineering approves a milestone there, update
its status in the tracking file.
The Connect GitHub token (used by the Feedback page) is stored only in your
browser's localStorage and is sent only to api.github.com — the dashboard
has no backend and never sees it. Use a short expiry and revoke it any time;
disconnect removes it from the browser.
The workflow (who does what)
| milestone status | meaning | next step is on |
|---|---|---|
not_started / in_progress |
applicant working | applicant |
delivered |
deliverables submitted | engineering — start review |
in_review |
review running | engineering — approve / feedback |
approved |
engineering signed off | DevRel — request payout from finance |
payout_requested |
finance asked to pay | finance |
paid |
payout done | — |
blocked |
stuck (explain in notes) |
DevRel |
Day-to-day, tracking an engagement means editing one YAML field: when
engineering approves M2, change its status: in_review to approved (and fill
approved_date); the board's action queue then reminds you to ask finance.
Adding a new delivery
- A proposal gets the
acceptedlabel in logos-co/rfp. - Copy the template from
data/RFP_TEMPLATE.mdintodata/rfps/RFP-0XX-short-name.md. - Transcribe the milestones from the proposal (title, payout, completion criteria), agree due dates with the applicant, and fill them in.
- Commit. The file is the audit trail — status changes are git history.
Adding a new station area
Follow the existing pattern: a data/<area>/ directory + *_TEMPLATE.md, a
loader in lib/<area>.ts, a page under pages/<area>/, an entry in NAV in
components/Layout.tsx, and a summary card in pages/index.tsx.