מילואימניקים מאומתים ובני הזוג שלהם מציעים שירותים. כל אחד יכול לפרסם עבודה.
Translation pending
CommerceTypeScript · PLpgSQLGitHub @IdanleybOnlineOwner 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
Market place for reserves independent and job seekers to find opportunities and clients, and for companies, HRs, entrepreneurs and any user to find the match service provider and also support the reserves community.
Taken from the repository README
Loading the full README.
Read the full README ↗A two-sided marketplace: verified reservists (30+ reserve days since 7 Oct 2023) and their approved spouses offer services; anyone can post a job or approach a provider directly. Providers spend credits to apply (10) or to accept a direct request (2). Both sides rate each other after every engagement.
docs/PRD.md (v1.6)docs/ARCHITECTURE.mddocs/DECISIONS.md| Layer | Tool |
|---|---|
| App | Next.js 16 (App Router) · TypeScript · Tailwind CSS 4 · Hebrew, right-to-left |
| Hosting | Vercel |
| Database, auth, files, scheduled jobs | Supabase (Postgres, Auth, Storage, pg_cron) |
| Sign-in | Phone OTP (Twilio via Supabase Auth) · Google · every account also confirms a phone (SMS code) and an email (6-digit code sent by the app over SMTP) |
| Later steps | WhatsApp Cloud API · Resend (email) · Claude API (Form 3010 + CV reading) |
src/
app/ pages and route handlers (App Router)
app/auth/callback/ Google sign-in return URL
lib/supabase/ Supabase clients: browser, server, service role, session proxy
lib/database.types.ts generated from the database — do not edit by hand (npm run db:types)
lib/errors.ts database error codes → Hebrew messages
proxy.ts refreshes the session on every request (Next 16 "proxy", formerly middleware)
supabase/
migrations/ the whole database: tables, rules, security policies, timers
seed.sql category taxonomy (PRD §6)
tests/ database tests (business rules end to end)
config.toml local Supabase settings (phone OTP, Google)
scripts/test-db.sh runs the database tests
Prerequisites: Node 20.9+, and Docker Desktop for the local Supabase stack.
npm install
npx supabase start # local Postgres, Auth, Storage, Studio (first run downloads images)
cp .env.example .env.local # paste the URL and keys printed by `supabase start`
npm run dev # http://localhost:3000
Local phone sign-in sends no SMS: test numbers 972500000001–972500000012 accept code 123456 (see supabase/config.toml). Studio (database UI) runs at http://127.0.0.1:54323.
npx supabase migration new <short_name> and write SQL in the new file. Never edit a migration that is already deployed.npm run db:reset — rebuilds the local database from all migrations + seed.npm run db:types — regenerates src/lib/database.types.ts.npm run test:db — runs the business-rule tests.npm run test:unit # pure logic (reserve-day counting, AI output cleaning)
npm run test:db # database rules; needs PostgreSQL 15+ binaries OR a running local Supabase
npm run lint && npm run typecheck && npm run build
test:db without Docker: install PostgreSQL (brew install postgresql@16 on Mac) and run it as is. With the local Supabase stack running instead: TEST_DATABASE_URL=postgresql://postgres:[email protected]:54322/postgres npm run test:db.
End-to-end (real browser, phone width) — needs the app and the local Supabase stack running, on a fresh database:
python3 -m aiosmtpd -n -c aiosmtpd.handlers.Debugging -l 127.0.0.1:2525 > /tmp/joby-mail.log & # local email sink
npm run db:reset && JOBY_AI_FAKE=1 npm run build && SMTP_HOST=127.0.0.1 SMTP_PORT=2525 JOBY_AI_FAKE=1 npm start # app on :3000
E2E_MAIL_LOG=/tmp/joby-mail.log \
E2E_SUPABASE_URL=http://127.0.0.1:54321 \
E2E_SUPABASE_ANON_KEY=<anon key from supabase status> \
E2E_SUPABASE_SERVICE_KEY=<service_role key from supabase status> \
npm run test:e2e
They use the test phone numbers from supabase/config.toml (code 123456), so no SMS is sent; email codes go to the local sink (pip install aiosmtpd) and the tests read them from its log. JOBY_AI_FAKE=1 makes Form 3010 / CV reading return canned results based on the file name (see src/lib/ai/form3010.ts), and is refused on Vercel production.
CI (.github/workflows/ci.yml) runs lint, types, build and the database tests on every push and pull request.
| Supabase project | Vercel | |
|---|---|---|
| staging | joby-staging (free plan is fine) | Preview deployments (every pull request) |
| production | joby-prod (Pro plan before beta) | Production (branch main) |
npx supabase login
npx supabase link --project-ref <project-ref>
npx supabase db push # applies all migrations
Run supabase/seed.sql once in the SQL Editor (categories).
Updating an existing project without the CLI: bash scripts/make-bootstrap-sql.sh --after <last applied version> > update.sql, paste into the SQL Editor, Run. It applies only the newer migrations and records them.
No command line? On an empty project you can instead run bash scripts/make-bootstrap-sql.sh > bootstrap.sql (or use the file from the founder chat), paste it into the SQL Editor and click Run. It applies every migration and the seed in one transaction and records the migration history, so later supabase db push runs only newer migrations.VA… service SID only works with Twilio Verify.https://<project-ref>.supabase.co/auth/v1/callback, then paste the client ID and secret into Supabase.https://<your-domain>/auth/callback to Redirect URLs.pg_cron is enabled and the job joby-run-timers exists (select * from cron.job;). If the migration ran before pg_cron was enabled, run:
vercel.json runs the server functions in the Supabase project's region — now Tokyo (hnd1), because the current Supabase project is in Northeast Asia (Tokyo). For users in Israel, a Supabase project in Frankfurt with fra1 is much faster (Supabase cannot move a project: create a new one and run the bootstrap SQL). If the Supabase project is in another region (Supabase → Project Settings → General → Region), change regions to the closest Vercel region — a mismatch adds ~100 ms to every database call.src/app/loading.tsx shows a skeleton while a page loads.Sample data for demonstrations: 100 providers (80 reservists, 20 spouses), 28 posters, 52 jobs, 377 applications, 155 direct requests, 130 engagements with feedback, and a full credit ledger — all tagged דמו.
20261028000200_demo_data and 20261029000100_demo_staged_load).972500000101, 972500000102, 972500000103, 972500000104, each with code 123456 (no SMS is sent).supabase/demo/load_demo_part_N_of_6.sql (any order, about 120 kB each — the editor rejects one big file), then load_demo_finish.sql. If a part is missing, the finish file says which.Easiest: on the sign-in page, under נסו חשבון דמו, click one of the four accounts (no SMS; hidden when no demo data is loaded; turn off with DEMO_LOGIN=off). Or sign in with 050-000-0101 (Yossi, reservist electrician), 050-000-0102 (Noa, spouse illustrator), 050-000-0103 (Avi Mor, private poster) or 050-000-0104 (Lumen Analytics, HR). Remove everything with the button on /admin or select private.purge_demo();. Demo and real users can never transact with each other.
Israeli localities and coordinates (il_cities, src/lib/il-localities.json) come from the npm package israel-geolocation 1.0.1 (MIT), built from Israeli government (CBS) data.
The MVP starts on the founder's personal accounts and moves to dedicated company accounts if it succeeds. To keep that move cheap:
| Service | Start (personal) | Moving later |
|---|---|---|
| GitHub | Personal account, private repo used only for Joby | Transfer the repository to the company organization (history, issues and pull requests move with it) |
| Supabase | A separate organization named for Joby inside the personal account, holding only Joby's projects | Transfer the projects to the company organization; keys and URL stay the same |
| Vercel | Personal account, one project for Joby. Hobby is fine while building; upgrade to Pro before real users, because Hobby is for non-commercial use only | Transfer the project to the company team; re-check environment variables and domain |
| Domain | Registered in the founder's name | Transfer to the company registrar account |
| WhatsApp (Meta) | Create a Meta business portfolio for Joby from day one, even if owned by the personal Facebook account | Add the company admins to the portfolio; avoid re-registering the number |
| Twilio, Resend, Anthropic | Personal accounts, with a separate project or API key for Joby | Create company accounts and swap the keys in Vercel and Supabase |
Rules that apply from day one: every secret lives only in environment variables (never in code), each service uses keys created only for Joby, and the list of accounts and where each key is used is kept up to date in the password manager.
select cron.schedule('joby-run-timers', '*/10 * * * *', 'select private.run_timers()');
insert into public.admins (user_id, role)
select id, 'admin' from public.profiles where phone = '+9725XXXXXXXX';
More admins: /admin/admins → הזמנת אדמין (name, email, role). The invitation email is sent by the app over SMTP — see step 7..env.example (Production and Preview separately). SUPABASE_SECRET_KEY and ID_HASH_SALT are server-only — never prefix them with NEXT_PUBLIC_.SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASS, MAIL_FROM in Vercel and redeploy. Simplest for the beta is a Gmail account: turn on 2-Step Verification, create an App password (Google Account → Security → App passwords), then SMTP_HOST=smtp.gmail.com, SMTP_PORT=465, SMTP_USER=<the gmail address>, SMTP_PASS=<the 16-letter app password>, MAIL_FROM=Joby <the gmail address>. Any other SMTP service (Resend, Brevo…) works the same way. Gmail allows about 500 emails a day, enough for the beta; move to a sending service (Resend, Brevo…) before launch.