Javis OS
Javis OS is an Agentic AI that assists entrepreneurs in business tasks, helping them grow their work.
AI translation
Internal Request Center, AxisKey Operations Hub
Translation pending
BusinessTypeScript · JavaScriptGitHub @josemiguelespi188-glitchOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full 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).