Fujimod
브라우저에서 카메라 펌웨어를 시험하고 Fujimod SD 부팅 파일을 만든다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Grocery and Shopping List App for Couples
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Gracie is a minimal grocery/shopping list app designed to share a single House (UI term) backed by a Room (backend model). The repo includes the backend API in Go + MongoDB and a React/Vite frontend. Authentication supports API keys and email/password.
For now, Rooms are empty containers; the core flows implemented are user signup, room sharing via invite links (tokens), joining rooms, and room deletion by member votes.
Prereqs
.nvmrc) and pnpm 9 (for local frontend)Start MongoDB (single-node replica set), API, and frontend (Nginx) together:
docker compose up --build
URLs:
/api to API, no CORS)The compose file includes a one-shot init service to initiate the replica set rs0. The API waits until it completes, so transactions work locally.
Environment (compose)
The backend runs with:
DATA_STORE=mongoMONGODB_URI=mongodb://mongo:27017/?replicaSet=rs0&retryWrites=true&w=majorityMONGODB_DB=gracieENC_KEY_FILE=/app/secrets/enc.key (bind-mounted from ./.secrets/enc.key)Auth
Authorization: Bearer <api_key> on all endpoints except /users, /auth/*./auth/register and /auth/login supported; passwords are bcrypt‑hashed and encrypted-at-rest.Endpoints
/users (public): Create a user with name; also creates a solo room. Returns { user, api_key }./auth/register (public): { username(email), password, name? } → 201./auth/login (public): { username, password } → { user, api_key }./me: Get current user./me: Update name./rooms/me: Get current room view (sanitized; no internal IDs; includes display name, description, member names)./rooms: Create a solo room if user has none (409 if exists)./rooms/share: Return the House's current invite code { token }, minting one only if it has none (reading never replaces a code someone was given)./rooms/share: Replace the invite code and return the new { token }; the old one stops working. A code is single use: joining clears it./rooms/join: Body { token } to join a room using a 5‑char code (no room ID required)./rooms/settings: { display_name?, description? } update./rooms/deletion/vote: Record deletion vote; when all current members have voted, the room is deleted and all users’ room_id values are cleared./rooms/deletion/cancel: Remove caller’s vote.Example flow (abbreviated)
curl -s -X POST http://localhost:8080/users \
-H 'Content-Type: application/json' \
-d '{"name":"Alice"}'
Response includes api_key and user.room_id.
curl -s -X POST http://localhost:8080/rooms/share \
-H 'Authorization: Bearer <ALICE_API_KEY>'
Response: { "token": "ABCDE" }.
# Bob registers/logs in and receives <BOB_API_KEY>
curl -s -X POST http://localhost:8080/rooms/join \
-H 'Authorization: Bearer <BOB_API_KEY>' \
-H 'Content-Type: application/json' \
-d '{"token":"<ABCDE>"}'
# Alice votes
curl -s -X POST http://localhost:8080/rooms/deletion/vote \
-H 'Authorization: Bearer <ALICE_API_KEY>'
# Bob votes (this deletes the room)
curl -s -X POST http://localhost:8080/rooms/deletion/vote \
-H 'Authorization: Bearer <BOB_API_KEY>'
users.api_key_lookup so documents without an API key don’t collide on null.bson tags and store timestamps as time.Time to avoid decode issues.backend/cmd/gracie-server: HTTP server entrypointbackend/internal/...: Core packages (auth, config, http handlers/middleware/router, services, store/mongo)backend/pkg/ids: ID and token generation helpersfrontend/: React + Vite app (UI refers to “House”) served via Nginx in Dockerbackend/internal/....Run all tests
cd backend
go test ./...
Unit-only (no DDB)
cd backend
go test ./internal/config ./internal/auth ./internal/http/...
TBD for now (private/internal usage during development).