Serein
Rust로 만든 가볍고 성능 좋은 Discord 전용 네이티브 클라이언트
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A social universe. The landing page is an animated cosmic scene with login authentication; after signing in, members land on Life — their home in the universe.
Built with Next.js 16 (App Router) + TypeScript + Tailwind CSS v4, with authentication and data backed by Supabase.
Create a Supabase project at supabase.com.
Add your credentials. Copy the example env file and fill in the values from your Supabase dashboard (Project Settings → API):
cp .env.example .env.local
NEXT_PUBLIC_SUPABASE_URL=https://your-project-ref.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-public-key
Create the database tables. In the Supabase dashboard open
SQL Editor → New query and run each migration in supabase/migrations/:
0001_startups.sql — startups table0002_profiles.sql — profiles table0003_feed.sql — posts, comments, reactions tables, a public
post-images storage bucket, and read access to other members' profilesEach enables row-level security (members write only their own rows; the feed and profiles are readable by any signed-in member). Until a migration runs, its section shows a setup banner.
(Optional) Smooth out local signups. By default Supabase requires email confirmation, so a new account can't sign in until the link is clicked. For fast local testing, turn off Confirm email under Authentication → Providers → Email in the Supabase dashboard.
Install and run:
npm install
npm run dev
Open http://localhost:3000.
npm run dev — start the dev server (Turbopack)npm run build — production buildnpm run start — serve the production buildnpm run lint — run ESLintlib/supabase/{client,server}.ts — Supabase clients for browser and
server (Server Components / Actions) respectively.proxy.ts + lib/supabase/middleware.ts — refreshes the session on every
request and redirects unauthenticated visitors away from protected routes
(anything under /life).app/auth/actions.ts — server actions for login, signup, and signOut.app/page.tsx — the landing page (redirects to /life if already signed in).app/life/page.tsx — the protected Life home page.After signing in, members land on Life (/life), a shared social feed:
post text and images ("How is it going?"), comment on posts, and react to both
posts and comments with emojis (with like counts). The shared layout
(app/life/layout.tsx) provides the cosmic background, navigation, and
sign-out; everything under /life is auth-guarded.
Feed internals: Composer (new post + image upload), PostCard /
CommentForm (comments), and ReactionBar (emoji toggles — pure server-action
forms, no client JS). Server actions live in app/life/actions.ts; the page
assembles posts, comments, reactions, and author names in app/life/page.tsx.
The top nav also links to the member sections:
/life/startups) — register, list, and delete the companies you
create. Backed by the startups table (server actions in
app/life/startups/actions.ts)./life/profile) — edit how you appear across the universe
(display name, bio, location, website). Backed by the profiles table; the
save action upserts in app/life/profile/actions.ts./life/friends) and Family (/life/family) — posts are
seen by the author and their accepted friends / family./life/citizens) — search fellow citizens by name or @handle, follow
them, and send friend / family requests. Member profiles live at
/life/citizens/[id]. Backed by follows and connections
(supabase/migrations/0020_people.sql)./life/notifications, the header bell) — follows,
requests, and acceptances, with Follow back / Accept / Decline./life/messages, the header chat icon) — one-on-one direct
messages with live delivery (Supabase Realtime), images (private
message-images bucket, members-only signed URLs), and Send GLXY in
chat.
Friends, family, and mutual follows message directly; anyone else starts a
message request (accept, decline, or reply to accept). Members can block
each other. Messages are private to the two members (RLS) but not
end-to-end encrypted. See supabase/migrations/0021_messages.sql and
0022_message_images.sql./life/travel)/life/communities)The latter three are navigable, styled section shells ready to be built out.
Section metadata and icons are defined once in app/life/sections.tsx and shared
by the dashboard cards and the nav (app/components/LifeNav.tsx).