尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Advanced Talent Management System. Multi-tenant SaaS for staffing firms: applicant tracking, CRM and leads, careers pages and job-board feeds, timesheets with payroll export and invoicing, remote e-signatures, vendor compliance and EEO/OFCCP reporting — sold by subscription.
This repository is the production foundation. docs/prototype.html is the working single-file prototype (every screen, interaction and business rule) that the production UI is being ported from.
Next.js 14 (App Router, TypeScript) · PostgreSQL + Prisma · NextAuth (credentials, JWT) · Stripe Billing · Resend (email) · Twilio (SMS) · S3/R2 (files) · Anthropic API (AI) · pdf-lib (PDFs)
See DEPLOY.md: Vercel + Neon/Supabase in about 20 minutes, a Dockerfile for container hosts, and a post-deploy checklist. GET /api/health reports database reachability, and the server logs which integrations are missing at startup.
cp .env.example .env # fill in keys; Stripe/Resend/Twilio/S3 can stay blank for first boot
docker compose up -d # Postgres
npm install
npx prisma migrate dev --name init
npm run db:seed # demo company; [email protected] (owner) or [email protected] (recruiter), password change-me-please
npm run dev # http://localhost:3000
npm run stripe:listen # separate terminal, forwards webhooks (Stripe CLI)
The demo company comes filled in: clients, open jobs, a pipeline, workers on assignment with this week's schedule and last week's timesheets, credentials (some expiring or expired), six months of deals and sales targets, leads, vendors and tasks. Dates are relative to the day you seed. Running the seed again leaves existing data alone.
In Stripe (test mode) create three recurring prices and put their IDs in STRIPE_PRICE_*. Enable Stripe Tax and the Customer Portal.
Below 820px the sidebar becomes a top bar with a full-screen menu plus a bottom tab bar (Home, Pipeline, Candidates, Jobs, Tasks, More); lists become labelled cards below 640px (add class scroll to a .tablewrap to keep a sideways-scrolling table instead). On touch screens, pipeline and deal cards get a “Move to” menu, since drag and drop doesn’t work with fingers, and board columns snap one per swipe. Fields use 16px text so iOS doesn’t zoom, controls are at least 44px tall, numeric fields open the number pad, and layouts respect the iPhone notch and home bar. Candidate, lead and vendor drawers have one-tap Call, Text and Email. A web app manifest and icons let people add Preciops to their home screen and open it full screen.
mail.preciopsatms.com (the SPF, DKIM and DMARC records it shows go in DNS).RESEND_API_KEY and EMAIL_FROM (an address on that domain). Emails go out as “ <EMAIL_FROM address>” with replies going to the recruiter, company or applicant as appropriate.RESEND_API_KEY, email is a no-op that prints each message (including signing and invite links) to the server log — handy for local development.What sends email: team invites, e-signature links and signed/countersigned copies (PDF attached), careers-page application notices and applicant confirmations, and the Email / text button on candidate, lead, vendor and client-contact records. Every recruiter message is logged per recipient (sent, failed with the provider’s reason, or blocked by opt-out) and shown on the record. Messages that still contain an unfilled {{field}} are held back.
Each company gets a hosted careers page (/careers/<slug>, one page per job with Google for Jobs markup), an embeddable widget (copy the snippet from Settings & data) and an XML job feed for Indeed, ZipRecruiter, Talent.com and other aggregators. The widget and job API allow cross-origin requests, so the snippet works on any domain.
Settings & data → Job boards lists one feed URL per board (/api/public/<slug>/feed.xml?board=indeed|ziprecruiter|talent|jooble|careerjet|adzuna). The feed follows Indeed's Job Sync XML format, which those boards and most aggregators read: unique referencenumber, city/state/country/postal code, HTML description, hourly salary, Indeed job types, and remotetype for fully remote jobs. Apply links carry ?src=<board>, so applicants are tagged with the board they came from. The card also lists jobs that boards would hide (no "City, ST", very short descriptions).
Indeed Apply: enter the API token and secret from Indeed's partner console, then give Indeed the application URL shown (/api/public/<slug>/indeed-apply). The feed then carries <indeed-apply-data> for jobs that use the built-in apply form, and applications arrive signed (X-Indeed-Signature, HMAC-SHA1). Each one is verified, then creates the candidate (source "Indeed") with the resume attached, adds them to the job at Applied, and emails the apply inbox.
Google for Jobs reads the JobPosting markup on each job page (remote jobs use TELECOMMUTE). LinkedIn job slots and Limited Listings go through a LinkedIn partner, which can use the same feed.
createdb -O preci preciops_test # once (or via psql)
DATABASE_URL=postgresql://preci:preci@localhost:5432/preciops_test npx prisma migrate deploy
npm test # Vitest; override the DB with TEST_DATABASE_URL
Covers tenant isolation and API gating (tests/tenant.test.ts and tests/rls.test.ts, which need the test DB), plan feature gating, payroll/overtime math and the four-fifths rule.
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗