Javis OS
Javis OS는 기업가를 돕는 에이전시 AI로, 업무를 지원하고 함께 성장합니다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A single-user lead/prospect CRM that replaces the Excel prospect-tracking
workbook. It runs a four-stage pipeline — Discovery → Screen → Triage → Verify
— over leads, with the criteria stored as editable data, deduplication,
reconciliation of existing prospects, and an append-only audit log.
The core is generic (account, opportunity, stage, verdict), so the same app
works for sales leads, partnerships or recruiting pipelines. Every table is
scoped by workspace_id, so multi-tenant accounts can be added later without
rewriting the data layer.README 전문 보기 ↗A single-user lead/prospect CRM that replaces the Excel prospect-tracking workbook. It runs a four-stage pipeline — Discovery → Screen → Triage → Verify — over leads, with the criteria stored as editable data, deduplication, reconciliation of existing prospects, and an append-only audit log.
The core is generic (account, opportunity, stage, verdict), so the same app
works for sales leads, partnerships or recruiting pipelines. Every table is
scoped by workspace_id, so multi-tenant accounts can be added later without
rewriting the data layer.
It runs online (Vercel + a free Neon Postgres database) or on a computer.
This tool only researches and prepares — it never acts. It never submits anything or contacts anyone. You approve and send outreach yourself; the app only records that you did.
DATABASE_URL automatically.The password is stored only as a salted hash, and you can change it in Rules &
settings. Optionally, an APP_PASSWORD environment variable overrides it.
Requires Node.js 20.9+. No database install: an embedded Postgres keeps data in
data/pglite (gitignored).
npm install
npm run dev # sets up the database, then serves http://localhost:3000
The first visit asks you to create a password, just like online. Set
DATABASE_URL to use a real Postgres instead of the embedded one.
Use the Import page in the app, or from a terminal:
npm run import -- "path/to/Local Prospect Weekly Tracker.xlsx"
import_rows and linked to the record it
became.*.xlsx is gitignored, except for the
placeholder test fixture.| Sheet | Becomes |
|---|---|
| RAW LEADS | Records, with stage 1/2/2.5/3 verdict + reason pairs. Stage and status are derived from the verdicts. Other columns become criteria attributes. |
| PRIORITY | Records at Verify / active, with tier, prepared brief/answers and outreach status. |
| HOLD / ARCHIVE | Record status hold / archived, with reason, date and next action. |
| TARGET ACCOUNTS | Target accounts. Both the outreach and watchlist blocks are imported, and contacts go into restricted fields. |
| HISTORY | History entries. Both the reconciliation and activity-log blocks are imported, linked to records where they match. |
| CONFIG (hidden) | Rules: criteria, exclusions, stage definitions, standing and trigger rules. Also settings: profile, sheet/column maps, validation counts. |
A lead that appears on several sheets is one record. It is deduplicated on (account, opportunity, source/next-step URL), and the later sheet sets its current state (RAW → PRIORITY → HOLD → ARCHIVE).
Enter the owner's name, personal email/phone, profile URL, home city and
current employer in Rules & settings → Redaction. They are redacted from
shared exports. When running on a computer, you can instead copy
config/identity.example.json to data/identity.local.json (gitignored); it is
loaded on every start.
Find new leads (Home, or the Find leads page) searches the public job boards (Lever, Greenhouse, Ashby, Workable, Recruitee, SmartRecruiters) of every company in your tracker, plus any careers link you add. It is free: no API key, no AI. It:
candidateBoards). Only
if that board lists the same job is it trusted: the board is watched from
then on and its jobs are added as above, linking to the company's page.
Unconfirmed jobs are listed on Find leads, never added; listings with scam
warning signs (fees, WhatsApp/Telegram, crypto pay) are dropped
(src/sources/job-sites.ts).It also runs by itself every Monday at 08:00 India time through Vercel Cron
(vercel.json → /api/cron/weekly). CRON_SECRET must be set in Vercel
(Settings → Environment variables); the route refuses to run without it when
hosted. Locally, Vercel's scheduler user agent is enough.
LinkedIn and other sites can't be searched this way. Add those leads by hand.
Run update is the weekly sorting step. It replaces the workbook's "Update this week's prospect tracker" trigger. In one transaction it:
Applied (application tracker): every list and lead has a "Your application" drop-down (Not applied yet → Applied → Heard back → Interviewing → Offer / Not successful / Withdrew). Applied leads move to the Applied list whatever happens to the listing; the first applied date is kept. Only a signed-in person can set these ().
| Rule | Enforcement |
|---|---|
Never fabricate; unknown = UNKNOWN | Blank/"unknown" input is stored as UNKNOWN, and a known value is never overwritten by an unknown one (services/records.ts). |
| UNKNOWN doesn't auto-reject | UNKNOWN evaluates as "unknown", never "fail" (core/rules.ts). |
| Unverifiable sources → Hold | Verify-stage promotion requires source = verified; reconciliation holds unverified prospects (core/pipeline.ts). |
| Dedup on (account, opportunity, URL) | Unique index plus in-place update, logged as dedup_merge. URLs and company names are normalised (core/dedup.ts). |
| Reconciliation every run | services/reconcile.ts, called first by Run update. |
| Nothing hard-deleted; every change logged | Postgres triggers block DELETE/TRUNCATE on records, accounts and rules, and any UPDATE/DELETE/TRUNCATE on history (drizzle/0001_append_only.sql). |
| Research only, never acts | Permission layer: no send/submit capability exists; human-only outreach states need a human actor plus explicit confirmation (core/permissions.ts). ESLint forbids fetch/http/mail libraries in src/, except the read-only job-board reader src/sources/job-boards.ts (GET requests to public job listings only; job-sites.ts goes through its fetcher). |
| No identity leakage | Every exported field is classified (unclassified = restricted), and shared exports are scrubbed (core/redaction.ts). Contacts live only in labelled contact fields, never in the dedup key. |
CONFIG's rules are prose, so they're imported as process notes. The import also adds a few evaluable criteria derived from them. Each one cites its source and can be edited or disabled:
BLOCKED (Screen).NO (Verify).NO (Verify).The compensation floor is not a numeric rule. The workbook's pay text mixes currencies and monthly/annual periods, so applying a number would mean guessing. It stays a note for human judgement at Verify.
src/core/ pure domain logic (no DB): rules, pipeline, dedup, permissions, redaction
src/db/ Drizzle schema + Postgres client (Neon/any Postgres online, embedded PGlite locally)
src/lib/ sign-in: first-visit password setup, scrypt hash, signed session cookie
src/proxy.ts requires sign-in for every request
src/sources/ read-only readers for public job boards and remote-job sites (the only code allowed to go online)
src/services/ workspace-scoped persistence; every change writes History
src/app/ Next.js UI (server components + server actions) and CSV export routes
scripts/ migrate, workbook import (also used by the Import page), fixture generator
drizzle/ SQL migrations (incl. append-only triggers)
tests/ vitest: core rules, services, import (placeholder fixture only)
Checks: npm test, npm run typecheck, npm run lint.
default workspace. The migration 0002_people.sql moves an
existing owner's password and recovery code into the users table./join/<token>, 7 days, only a SHA-256 of the token is stored). Accepting
creates the person and a private workspace seeded with the default rules.
They sign in with email + password.src/services/request.ts resolves the signed-in person and their workspace
for every request; every query is scoped by workspace_id
(tests/isolation.test.ts). The owner can open a member's workspace
(crm_view cookie, owner only); changes there are recorded under the owner.session_epoch):
"sign out everywhere", a password change, a password link or switching an
account off ends that person's sessions. Recovery codes, the guessing
throttle and AI links are per person/workspace.core/permissions.tsYour AI (/connect): a private link the owner adds to Claude as a custom
connector (Model Context Protocol, src/app/api/mcp/[key]/route.ts). Tools
(src/services/ai-tools.ts) read leads, the last search and saved answers,
and write prepared briefs/answers, notes and new leads — never decisions,
application statuses, rules or settings. Only a hash of the link's key is
stored; making a new link or switching it off stops the old one.
My answers: the owner's reusable application answers (intro, notice period, pay…), shown with Copy buttons on every Ready lead. Stored in settings, never exported, logged without their text.
Password: change it, or make a one-time recovery code (shown once, stored as a hash). "Forgot your password?" on the sign-in page uses it.
Records: list, filter and sort by view (Leads / Prospects / Hold / Archive), stage, status and tier, or search. Open a record to edit it, make the next stage decision (a reason is always required), hold, archive or restore it, mark source verification, set the tier, and record outreach hand-offs.
Rules & settings: edit the criteria each stage applies, and whether a violation archives or holds. Rules are disabled, never deleted.
Exports: shared CSV drops restricted fields (prepared packages, notes, contacts, gaps, unmapped columns) and scrubs identity terms, emails and phone numbers. Internal CSV is everything, for your own backups.