Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 README에서 읽을 수 있습니다. 저장소 README ↗
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Internal request center for AxisKey. A single page where staff go to submit operational process requests (IRA funding, title transfers, redemptions, etc.) instead of hunting through emails, SOPs, and scattered links.
This is not a client portal, investor portal, or CRM — it's an internal tool.
app/
page.tsx Landing page (single page app)
layout.tsx Root layout, fonts
api/requests/route.ts POST — creates a request, syncs to ClickUp
api/requests/[id]/retry-sync/route.ts POST — retries a failed/pending ClickUp sync
api/admin/stats/route.ts GET — KPIs for the Admin panel
components/
Logo.tsx Official AxisKey wordmark (public/axiskey-logo.png)
RequestCard.tsx One process card
RequestModal.tsx Request form (modal)
AdminPanel.tsx Admin KPI panel incl. ClickUp sync status
lib/
requestTypes.ts Source of truth for the 7 process types
payload.ts Builds the integration-ready payload
types.ts Shared TypeScript types
supabase/client.ts Browser Supabase client (anon key)
supabase/server.ts Server Supabase client (service role key)
services/requestSync.ts Business logic: orchestrates ClickUp + Supabase
integrations/clickup.ts ClickUp service — real API client (task create + attach)
integrations/n8n.ts n8n webhook trigger — stubbed, not wired up yet
supabase/
schema.sql Tables, indexes, RLS policies (fresh installs)
seed.sql Seeds request_types + creates storage bucket
migrations/001_clickup_sync_status.sql Run once on an already-live DB
Implemented from the AxisKey Brand Identity Guidelines (Jan 2026).
#201C1A (primary dark/text), Axis Signal #E3F464
(accent — emphasis/CTAs only, never dense text or full-page backgrounds),
Axis Base #CEC1A9 (warm neutral, secondary surfaces), Axis Light
#F2F2F2 (light neutral, page/table backgrounds), White #FFFFFF
(default background). Defined as Tailwind tokens (axis-core,
axis-signal, axis-base, axis-light) in tailwind.config.ts.next/font/google. Eurostile is a
licensed font not included in this repo — drop the files into
public/fonts and uncomment the @font-face block in
app/globals.css; headlines fall back to a geometric sans stack until
then. Left-aligned by default per the guidelines; centering is reserved
for short, isolated statements.public/axiskey-logo.png, monochrome,
transparent background) is wired up in components/Logo.tsx via
next/image, sized by height only so it never stretches or distorts.npm install
cp .env.example .env.local # fill in Supabase values, see below
npm run dev
supabase/schema.sql, then supabase/seed.sql.
supabase/migrations/001_clickup_sync_status.sql —
schema.sql uses create table if not exists, which won't add new
columns to a table that already exists.Project URL → NEXT_PUBLIC_SUPABASE_URLanon public key → NEXT_PUBLIC_SUPABASE_ANON_KEYservice_role key → SUPABASE_SERVICE_ROLE_KEY (server-only — never
expose this in client code or commit it)attachments storage bucket exists (created by seed.sql).Tables: request_types, requests, request_attachments, users,
activity_log. RLS is enabled with permissive insert/read policies since
there's no auth yet — tighten these once internal login ships.
.env.example in Project Settings →
Environment Variables: the three Supabase values, CLICKUP_API_TOKEN,
and CLICKUP_LIST_ID_MAP (leave N8N_REQUEST_WEBHOOK_URL blank until
that integration is turned on).RequestModal opens.attachments
storage bucket from the browser, then the form POSTs to
/api/requests.lib/payload.ts), inserts
into requests (+ request_attachments, activity_log), then calls
syncRequestAndPersist (lib/services/requestSync.ts), which:
lib/integrations/clickup.ts (real API
call, not a stub) — task name "<Type> | <Requestor> | <Deal or Investor>", description with every submitted field, attachments
best-effort re-uploaded to the task (URLs are always included as a
fallback);clickup_task_id, clickup_sync_status
(pending/synced/failed), clickup_sync_error, and
clickup_synced_at back onto the requests row;activity_log.failed (retryable) instead of synced.CLICKUP_LIST_ID_MAP is a JSON
object of request type slug -> ClickUp List ID (see .env.example).
Nothing is hardcoded; a request type missing from the map syncs as
failed with a descriptive error instead of guessing a list.synced, which calls POST /api/requests/[id]/retry-sync — it
re-reads the stored payload and re-attempts the ClickUp call.lib/integrations/clickup.ts only
knows how to talk to the ClickUp API; lib/services/requestSync.ts is the
business logic that decides what to persist in Supabase; the API routes
are thin glue; the UI never talks to ClickUp directly. Swapping ClickUp
for an n8n webhook later (lib/integrations/n8n.ts) means changing
requestSync.ts, not the routes or components.Top-right "Admin" button opens a panel with total requests, requests by
type, status breakdown (Submitted / In Review / Completed), ClickUp sync
breakdown (Successful / Failed / Pending), and a list of recent requests —
each showing its ClickUp Task ID, sync status, submission date, and a Retry
action when sync isn't synced. No authentication yet — add it before this
goes further than internal MVP use.
/admin/pdf-generator — unrelated to the request flow, it just reuses this
app, its admin login, and its Supabase project.
pdf-templates bucket; the
browser uploads it straight to Storage via a signed URL from
POST /api/admin/pdf-templates, so file size isn't capped by Vercel).{Company name} - Wire). Saved as JSON
in pdf_templates.mapping (see lib/pdfGenerator/types.ts; the older
bare-array format is still read and converted).lib/pdfGenerator/xlsx.ts reads floating drawings and "Place in Cell"
rich-value images); an image cell can instead hold a file name, matched
by that column's "Upload many". Downloads one PDF per row, zipped.Generation runs entirely in the browser (pdf-lib + pdfjs-dist for the
editor preview, fflate for the ZIP): images and generated PDFs are never
uploaded or stored. Setup: run supabase/migrations/007_pdf_templates.sql
once in the Supabase SQL editor (creates the table and the bucket).