Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A social network for The City — a LARP prop that works. Everything you say costs mana: a post is 5, an image is 3 more, a like is 1, a whisper is 2, a vote is 3, an op-ed is 6. The well refills only when you bring it proof you did something real away from the screen. Run out and the feed doesn't lock — it decays, visibly, until you can barely read it.
Built from the Claude Design prototype (Crystr.dc.html), against Next.js 14,
Supabase and Vercel.
| Route | What it is |
|---|---|
/ | The timeline. Posts, plus published Ball dispatches interleaved at positions 2, 5 and 8 with a ◉ BALL tag. Decays with your balance. |
/post | Compose, with a live cost preview and an image toggle. Reached from the NEW POST button at the top of the feed, not a tab. |
/thread/[id] | A post and the replies under it, oldest first, with the reply box. Five mana a reply, same as a post. |
/well, /well/[slug] | The five quests and their proof screens. |
/whispers, /whispers/[id], /whispers/new | DMs at 2 mana a message. A conversation with something new in it shows as unread, and the WHISPER tab wears a small bubble with how many such conversations there are; opening one reads it (dm_reads, cr_mark_thread_read, cr_unread_whispers; migration 20261105010000_whisper_reads.sql). |
/thread/[id]/send | Send a post to someone in a whisper, with a note if you like, for the price of a whisper (2 mana). Reached from SEND IN A WHISPER in the three-dot menu on a post, beside REPORT (which opens the detailed form in place). The post arrives in the whisper as a quoted card (dm_messages.post_id, cr_send_post; the migration is 20261105000000_send_post_in_whisper.sql). Unsending drops the post from the message. |
/welcome | The registry: a face, your info (your own name, username, character name), birthday, district and species codes. Until it is done the tab bar is REGISTRY and WIKI, nothing else. |
/me, /me/edit, /me/avatar, /me/top-six | MySpace-shaped profile: a plain banner with the thought and a bigger portrait, the username in the pixel font, a blank ? tile for your token beside About Me (tap it to open the token), Top 5 on one line (picked on its own page), the badge collection as tight icons, WORKING ON, max mana, the mana ledger, and the portrait builder. |
/me/token, /me/trades, /u/[handle]/trade | Badges: design your token, see offers waiting, offer someone a trade. |
/me/override, /override/[code], /breach | The override (witches only on the first): a witch's key as a QR code, the address it points at, and the break-in that lets someone past the registry. See below. |
/ball?tab=motions, /vote/new | The motion board (open / decided) is the MOTIONS tab of the Ball, beside CITY NEWS and OP-EDS; /vote redirects there. /vote/new is the witch-only two-step composer. |
/ball, /ball/[id], /ball/new, /ball/[id]/edit | Crystr Ball, in two tabs: CITY NEWS (dispatches, with NEW DISPATCH for witches) and OP-EDS (citizens' pieces, with SUBMIT AN OP-ED for players and the review queue for witches). Witches get a VIEWING THE BALL AS switch (witch or player) in the three-dot menu at the top right; it keeps the tab they were on. The editor's "Published by" and "Highlight" fields are the byline and the one-line summary. ATTACH IMAGE picks a picture for the article from everything we have (the 69 token icons, the 8 achievement and 48 tradable badges, and the 299 badges of the uploaded set, now served from public/badges/set/; lib/article-icons.ts lists them with their sizes and what a saved name such as set-120 or tradable-bat-banner means) (articles.banner_icon, set by cr_set_article_icon; migration 20261106000000_article_icon.sql): on the article it comes first, below the highlight, half the width and on the left, with the body starting level with its top and wrapping round it; on the Ball list and the feed it shows as a small tile. The header no longer carries a line about how much mana you have; the number and the potion say it. |
profiles.is_witch is the whole permission model.
VIEWING AS WITCH / PLAYER switch so
they can see what a player sees; a player has no switch.pending and reach the
City only when a witch approves them./me/override) that lets
someone the registry cannot take into the City, and sees who came in that
way. See "The override" below.To make someone a witch:
do $$ begin
perform set_config('crystr.economy', 'on', true);
update public.profiles set is_witch = true where handle = 'their-handle';
end $$;
The set_config line is required — see below.
The client never moves mana. Every charge and every credit happens inside a
SECURITY DEFINER function (cr_create_post, cr_like_post,
cr_submit_quest, cr_send_whisper, cr_cast_vote, cr_submit_oped,
cr_table_motion, cr_set_top_friends, cr_offer_trade, cr_answer_trade),
each of which locks the caller's profile row before reading the balance, so two
tabs can't spend the same mana twice.
Three things hold the line:
여기까지가 README 앞부분입니다. 나머지는 원문에서 읽을 수 있습니다. README 전문 보기 ↗