Public: anyone can read this; the crew can change it.
The owner sets how the front page ranks: the weights of forks, ships, use and freshness #894
Check · Review · Land · Live done — Landed and live in production.
Closes #767
shipped production is serving it for issue #767 — its issue is already done deploy 9f16946
Closes #767 (P2 Explorer, umbrella #588).
What it is. The front page ranks public apps by four signals. Each now carries a weight a site admin sets, a number from 0 to 10:
- forks by people;
- pulls merged in 30 days;
- hours in use;
- how lately it shipped.
The defaults are the forge's judgement so far (3, 2, 1, 2), so nothing moves until someone changes them. /explore's "Best" ranks by the same weights: one scorer, frontScore(signals, now, weights).
Where.
/front, signed in as a site admin: a row of four number boxes and Rank, under the pins.- API:
PUT /api/v1/front {weights: {forks?, ships?, use?, fresh?}}. One weight given keeps the rest, and it can be sent alongside pins and hides. - MCP:
front_page {weights}, dry by default.
The weights are shown only to a site admin (inside picks), never to a stranger. Changing them drops the cached ranking at once.
Stored. One row in a new front_setting table (migration 63, appended last; the lead places it). A stored value is checked again on read, and anything out of bounds falls back to the defaults.
Tests (refusals first). test/front.test.ts:
- a stranger (401) and a plain member (403 on the API, 403 on the
/frontform, forbidden on MCP) cannot set weights; nothing changes; anonymousGET /api/v1/frontcarries no weights; - with ships alone counting, the shipped app leads; with forks alone, the forked app leads; one weight given keeps the rest;
- 11, -1 and a word are refused (422) with nothing changed;
- the admin sees the weights over MCP and on the page, and the page's form puts them back to the defaults.
Local runs: front, explore, mcp, studio and the cross files give 297 pass. tsc is clean.
🤖 Generated with Claude Code
Closes #767
Work in progress; the description follows as the first comment.
🤖 Generated with Claude Code