Synaplan
기업을 위한 오픈소스 AI 플랫폼
저장소 정보는 아직 수집하지 않았습니다.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Sắp xếp thứ tự các điểm giao sao cho tổng quãng đường ngắn nhất, rồi mở tuyến đã tối ưu trên Google Maps.
Next.js (App Router) · TypeScript · Tailwind CSS v4 · shadcn/ui · Supabase
npm install
cp .env.example .env.local # rồi điền giá trị, xem bên dưới
npm run dev
Mở http://localhost:3000 — chưa đăng nhập sẽ tự chuyển về /login.
| Lệnh | Việc |
|---|---|
npm run dev | Dev server |
npm run build | Build production |
npm start | Chạy bản đã build |
npm run lint | ESLint |
npm run format | Prettier, ghi đè file |
npm run format:check | Prettier, chỉ kiểm tra |
npm run check:contrast | Kiểm tra tương phản màu đạt WCAG |
Không có
.env.localthì app sẽ báo lỗi ngay. Đó là cố ý — thà hỏng lúc khởi động còn hơn chạy được rồi mới lặng lẽ sai khi gọi database.
Làm một lần. Khoảng 10 phút.
.env.localProject Settings → API, chép hai giá trị:
NEXT_PUBLIC_SUPABASE_URL=https://<project-ref>.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=<anon public key>
Chỉ cần hai biến này. App không gọi dịch vụ bản đồ nào khác — vị trí lấy từ link Google Maps bạn dán vào.
Chỉ dùng key anon public. Key service_role bỏ qua mọi quy tắc RLS, không
bao giờ đưa vào file có tiền tố NEXT_PUBLIC_ (Next sẽ nhúng thẳng vào
JavaScript gửi xuống trình duyệt).
Cách nhanh: SQL Editor → New query, dán toàn bộ nội dung
supabase/migrations/20261018000001_init.sql rồi Run.
Cách dùng CLI (nếu sau này muốn quản lý migration tử tế hơn):
npx supabase link --project-ref <project-ref>
npx supabase db push
Kiểm tra: Table Editor phải thấy 3 bảng profiles, companies,
company_contacts, và cột RLS enabled đều bật.
Migration 20261025000002_delivery_photos_bucket.sql tạo bucket delivery-photos và
các policy. Vào Storage xem bucket đã có và đang ở chế độ private chưa.
Nếu migration báo lỗi quyền ở phần create policy ... on storage.objects — bảng đó
thuộc supabase_storage_admin, một số project không cho đụng từ SQL thường — thì tạo
tay 4 policy trong Storage → Policies cho bucket delivery-photos, mỗi policy một
thao tác (select/insert/update/delete), cùng một điều kiện:
bucket_id = 'delivery-photos'
and (storage.foldername(name))[1] = auth.uid()::text
a) Google Cloud Console — https://console.cloud.google.com
Tạo project (hoặc chọn project có sẵn).
APIs & Services → OAuth consent screen: chọn External, điền tên app và email. Ở phần Test users, thêm email Gmail của bạn — nếu không, app ở chế độ Testing sẽ từ chối đăng nhập.
Credentials → Create credentials → OAuth client ID, loại Web application.
Authorized redirect URIs — thêm đúng URI này:
https://<project-ref>.supabase.co/auth/v1/callback
Đây là callback của Supabase, không phải của app. Người ta hay nhầm chỗ này.
Chép Client ID và Client secret.
b) Supabase Dashboard
http://localhost:3000 (khi deploy thì đổi thành domain thật)http://localhost:3000/**
https://<domain-khi-deploy>/**
npm run dev
Vào http://localhost:3000 → bị đẩy về /login → bấm Đăng nhập bằng Google →
chọn tài khoản → quay lại trang chính, góc phải header hiện ảnh đại diện.
Vào Table Editor → profiles, phải thấy một dòng vừa được tạo tự động.
NEXT_PUBLIC_SUPABASE_URL và NEXT_PUBLIC_SUPABASE_ANON_KEY vào
Environment Variables của project.https://<domain>/** vào Redirect URLs.Không cần sửa gì trong Google Cloud Console — redirect URI vẫn trỏ về Supabase.
| File | Nội dung |
|---|---|
| CLAUDE.md | Đặc tả dự án và quy tắc làm việc |
| docs/design.md | Quyết định thiết kế, bảng màu, design tokens |
| docs/database.md | Schema, RLS, và ý nghĩa cờ is_public |