VoidAccess
Ask one question and VoidAccess searches 12+ Tor search engines, GitHub and security feeds in parallel, then returns actors, wallets, leaked credentials and IOCs ready for STIX, MISP or Sigma. Open so
Cyber safety guidance for everyday life
Translation pending
SecurityJavaScript · PLpgSQLGitHub @LathithabOnlineOwner 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 ↗A cyber-safety platform for South African learners, built with C3SA (a non-profit). Learners can take short modules and quizzes, read scam guides, share and read moderated community reports, find emergency contacts, and chat with CyberBot on WhatsApp about cyberbullying and online scams.
flowchart LR
L[Learner on phone/browser] -->|HTTPS| W[Web app<br/>Next.js PWA<br/>Vercel]
L -->|WhatsApp| M[Meta WhatsApp<br/>Cloud API]
M -->|signed webhook| B[CyberBot<br/>Node/Express<br/>Render]
B -->|chat completion| G[Groq API<br/>gpt-oss-120b]
W -->|supabase-js<br/>anon key + user JWT| S[(Supabase<br/>Postgres + Auth + Storage<br/>Row Level Security)]
A[Admin / teacher] --> W
B -. "ask for a person" .-> C3[C3SA staff WhatsApp]
There is no separate application server. The web app talks to Supabase directly, and the database enforces who may do what:
submit_quiz() grades a quiz and is the only way progress is saved.check_quiz_answer() reveals the correct answer for one question after it is answered.admin_save_learning_content() saves a module and its quiz in one transaction.validate_new_post() rejects reports that are too short or too long, or carry oversized images.post_flags records "Report post" flags (one per person per post). Admins see them under the "flagged" filter in /admin/community.set_post_display_name() sets a post's public name from the author's username, so it cannot be faked.auto_hide_reported_post() returns a post to review after 3 reports.post_like_counts is a view that gives public "helpful" counts without revealing who liked what.is_admin() is the shared role check used by policies.learner, teacher, admin) live in profiles and cannot be changed from the browser.posts with status pending. Only the author can see it, marked "Pending review"./admin/community, reads it, and approves or removes it.pending automatically. When an admin re-approves it, only new reports count.The server enforces this, not just the screens: signed-out visitors cannot insert posts, nobody can approve their own post, and the public name is set from the author's username by the database (or "Anonymous" if they ticked that box). Admins can still see who wrote an anonymous post.
Comments work differently from posts, on purpose. A review queue for every reply would make a conversation unusable, so comments appear straight away and safety comes from other controls:
/admin/community, Comments tab. The default view is "Reported". They can restore, hide or remove a comment. Removed comments stay in the database for records.| Path | What it is |
|---|---|
apps/web | Next.js 15 / React 19 web app (installable PWA). Pages are in src/app/*. |
whatsapp-bot | CyberBot: Express webhook + Groq. index.js (server), bot-logic.js (AI + safety), commands.js (typed commands), security.js (webhook signature check), test/ (automated tests). |
supabase | schema.sql (initial schema), migrations/ (dated changes), seed_*.sql (starter content). |
cd apps/web
npm install
cp .env.example .env.local # then fill in the two values below
npm run dev # http://localhost:3000
| Variable | Where to find it |
|---|---|
NEXT_PUBLIC_SUPABASE_URL | Supabase → Project Settings → API |
NEXT_PUBLIC_SUPABASE_ANON_KEY | Supabase → Project Settings → API (the anon/public key only) |
Without these the app still starts in a demo mode so the UI can be worked on.
cd whatsapp-bot
npm install
npm test # 27 automated tests, no API keys needed
npm start
| Variable | Purpose |
|---|---|
GROQ_API_KEY | Groq API key for the AI replies |
WHATSAPP_TOKEN | Meta permanent access token |
PHONE_NUMBER_ID | WhatsApp phone number ID from Meta |
VERIFY_TOKEN | Any secret string; must match what you enter in Meta's webhook setup |
APP_SECRET | Meta app secret. Required: the bot refuses to start without it |
STAFF_WHATSAPP | C3SA staff number (international format, no +) that receives "talk to a person" requests |
STAFF_TEMPLATE_NAME | Recommended. Name of an approved WhatsApp message template with one body variable (the learner's number). WhatsApp only delivers plain text to a number that messaged the bot in the last 24 hours, so without a template the staff message can fail. If it fails, the learner is told honestly and given the helplines. |
STAFF_TEMPLATE_LANG | Language code of that template (default en) |
PORT | Optional, defaults to 3000 |
ALLOW_UNSIGNED_WEBHOOKS | true skips the signature check. Local testing only, never in production |
Webhook URL for Meta: https://<your-render-url>/webhook.
supabase/schema.sql in the SQL Editor, then the files in supabase/migrations/ in filename order, then the seed_*.sql files.update public.profiles set role = 'admin' where id = '<user uuid>';
Known gap in the SQL files. The
"Quizz"table, the"Tier"type, and a few columns onmoduleswere created in the Supabase dashboard and are not inschema.sql, so the SQL files alone cannot rebuild a database from scratch. To fix this, export the real schema from the production project and commit it as the new baseline:supabase db dump --schema public -f supabase/baseline.sql.
| Part | Host | Notes |
|---|---|---|
| Web app | Vercel | Root directory apps/web; set the two NEXT_PUBLIC_* variables. |
| CyberBot | Render | Start command npm start; set all bot variables. A deploy without APP_SECRET fails on purpose and the previous version keeps running. |
| Database | Supabase | Apply new files from supabase/migrations/ in order. |
/admin.STAFF_WHATSAPP points to a staffed number, set up a WhatsApp template and STAFF_TEMPLATE_NAME, test "Talk to a person" once, and agree response times.https://<your-domain>/reset-password to the Redirect URLs. Password reset emails do not work without it.