TapBaitx: consent-first phone, location & media tracking lab in Python, Java, JS - Carbon 4 council!
52

A consent-first phone, cell phone, video-call, location, and media tracking lab β built with synthetic fixtures only, in Python π, Java β, and JavaScript π¨.
β οΈ Workflow badge note: the CI and Docker Publish badges above are static shields badges. The real workflow-status badges light up only after you paste the two workflow files into
.github/workflows/(plural) and they run once β until then GitHub has no run to show, and this README does not fake one.
π The one rule of this whole project: TapBaitx studies how phone tapping, call tracking, location tracking, and media tracking work β using fake phone lines, fake calls, and your own media only. It never taps a real line, never tracks another person, and never decrypts a real FaceTime call. Every live power is locked behind a HOLD gate.
TapBaitx is a learning lab about the technology inside five everyday things:
On top of all that sits a π§ council: Gemini Carbon 4 Extended Thinking as the decider and Muse as the advisor. The council can make a rule stricter. It can never unlock a HOLD gate.
main.py β it runs the demo and all 24 self-checks.phone.py β numbers are cleaned to 10 digits, formatted, and checked for the 555 synthetic flag.taplab.py β it checks the two locks (synthetic line + authorization reference). If either fails, it raises a HOLD error and nothing happens.facetime_lab.py β tile math, join/camera visibility, and metadata-only packet summaries.geoearth.py β consent is checked first, coordinates are fuzzed second, and only then is a KML file built and XML-validated.media_tracker.py β format is detected from magic bytes, a SHA-256 fingerprint is taken, duplicates are caught by fingerprint, and location is attached only with owner consent.council.py β Carbon 4 maps, models, stress-tests, and decides; Muse advises. The decider's verdict stands. A HOLD verdict is final.gates.py β 14 HOLD gates, listed in one place, readable by anyone.flowchart TD
A[βΆοΈ main.py demo] --> B[π phone.py numbers + call log]
A --> C[π§ taplab.py two-lock tap check]
C -->|either lock fails| H[β HOLD - nothing happens]
A --> D[πΉ facetime_lab.py tiles + metadata]
A --> E[π geoearth.py consent β fuzz β KML]
A --> F[πΌοΈ media_tracker.py format + fingerprint]
F --> G[π§ owner consent?]
G -->|no| N[location stays empty]
G -->|yes| Y[city-fuzzed location]
A --> I[π§ council.py Carbon 4 decides + Muse advises]
I --> J[β
verdict - HOLD always wins]
None β honestly. TapBaitx has no blockchain, no wallet, and no network service. It is an offline lab.
None required. Optional, names-only, never called by default: GEMINI_API_KEY (Carbon 4 seat), MODEL_API_KEY (Muse seat), GOOGLE_MAPS_API_KEY (live Earth/Maps seat β HOLD-gated).
| Workflow | File | What it runs |
|---|---|---|
| β CI | .github/workflows/ci.yml | Python pytest + main.py checks, Node JS checks, Java compile + checks |
| π³ Docker Publish | .github/workflows/docker-publish.yml | Builds and pushes credkellar/tapbaitx:latest using the DOCKERHUB_USERNAME + DOCKERHUB_TOKEN repo secrets |
Because it teaches real phone, location, and media technology the safe way β with the locks visible, not hidden.
| # | π Problem | β Solution |
|---|---|---|
| 1 | Learning about taps can slide into spying on real people | Solution 1: synthetic fixture lines only β a real line raises HOLD before anything runs |
| 2 | "Authorized" tools often skip the paperwork | Solution 2: no authorization reference = no session, enforced in code, not in a promise |
| 3 | Location sharing leaks your exact home address | Solution 3: consent-first + city fuzzing before export β exact coordinates never enter a public file |
| 4 | People get tracked without knowing | Solution 4: sharing is OFF by default, the level is chosen by the owner, and tracking another person is a permanent HOLD gate |
| 5 | A photo's hidden GPS data travels with it when shared | Solution 5: EXIF location is read only with owner consent, and a strip-metadata plan shows exactly what to remove |
| 6 | The same image/GIF gets saved and shared as "new" copies | Solution 6: SHA-256 fingerprints dedupe media β copies are caught by hash, not by eye |
| 7 | Nobody knows how many frames a GIF has or when a video changes scene | Solution 7: real GIF frame counting from the byte stream + a video motion/scene-change model |
| 8 | Video-call tools can show people who never agreed to be seen | Solution 8: visible = joined AND camera on β both, always |
| 9 | Encrypted call traffic tempts people to "just peek" at payloads | Solution 9: metadata-only summaries β sizes and timing, payloads never inspected |
| 10 | AI helpers sometimes talk people into unsafe actions | Solution 10: tighten-only council β Carbon 4 can raise a HOLD, Muse can only advise, neither can lift a gate |
git clone https://github.com/credkellar/TapBaitx.git
cd TapBaitx
python3 main.py
CHECKS 24/24.pip install pytest
python3 -m pytest -q
6 passed.node js/tapbaitx.js
JS CHECKS 7/7.cd java
javac TapBaitx.java
java TapBaitx
JAVA CHECKS 6/6.docker build -t tapbaitx .
docker run tapbaitx
.github/workflows/ (plural) and add the Docker Hub secrets (DOCKERHUB_USERNAME, DOCKERHUB_TOKEN) in repo Settings β Secrets β Actions. The first push then runs CI, and Docker Publish pushes credkellar/tapbaitx:latest.| Thing | Needed for | Notes |
|---|---|---|
| π Python 3.12+ | Main project + tests | Standard library only; pytest is the one test install |
| π¨ Node.js 24+ | JavaScript port | Zero npm packages |
| β JDK 17+ | Java port | JDK standard library only. β οΈ The project was built on a machine with no JDK installed, so the Java file is source-delivered and its checks run in CI (or on your machine) β the Python and JavaScript versions are the ones verified live at build time |
| π³ Docker | Optional container run | Builds from python:3.12-slim |
| π API keys | Not required | All seats run offline. Keys, if you ever add them, are environment-variable names only β never paste a key value into this repo |
Imagine you have a toy phone that only calls pretend numbers. π
TapBaitx is a practice kit for how real phones, video calls, maps, and pictures work β but everything in the kit is pretend or yours.
That's it: learn how the real thing works, practice on pretend things, and keep every real person safe.
main.py β demo + 24 CHECKSflowchart TD
A[Start] --> B[Run demo data]
B --> C[Run 24 checks across every module]
C --> D{All pass?}
D -->|yes| E[Print CHECKS 24/24 - exit 0]
D -->|no| F[Print FAIL lines - exit 1]
tapbaitx/gates.py β the 14 HOLD gatesflowchart TD
A[Any live or non-consensual action] --> B{Named in gates.py?}
B -->|yes| C[β HOLD - action never runs]
B -->|no| D[Continue - still checked by its module]
tapbaitx/phone.py β numbers, cell profiles, call logflowchart TD
A[Raw number] --> B[Strip to digits]
B --> C{10 digits?}
C -->|no| D[ValueError]
C -->|yes| E[Format 202 555-0147 style]
E --> F{Exchange = 555?}
F -->|yes| G[Flag: synthetic β
]
F -->|no| H[Flag: not synthetic]
tapbaitx/taplab.py β the simulated tap chamberflowchart TD
A[Open tap request] --> B{Line synthetic?}
B -->|no| H[β HOLD]
B -->|yes| C{Authorization ref given?}
C -->|no| H
C -->|yes| D[Session opens - transcript analysis only]
D --> E[Count turns, speakers, top words]
tapbaitx/facetime_lab.py β FaceTime-style video labflowchart TD
A[Participant] --> B{Joined?}
B -->|no| V[Not visible]
B -->|yes| C{Camera on?}
C -->|no| V
C -->|yes| D[β
Visible tile]
A --> E[Packets] --> F[Metadata summary - payload never read]
tapbaitx/geoearth.py β consent-first Google Earthflowchart TD
A[Track points] --> B{Sharing ON?}
B -->|no| N[Return None - no KML]
B -->|yes| C[Fuzz coordinates to chosen level]
C --> D[Build KML placemarks]
D --> E[Validate XML] --> F[Return KML]
tapbaitx/media_tracker.py β image / GIF / video trackerflowchart TD
A[Media bytes] --> B[Detect format by magic bytes]
B --> C[SHA-256 fingerprint]
C --> D[GIF? Count frames / Video? Motion model]
D --> E{EXIF GPS + owner consent?}
E -->|no| L[Location = empty]
E -->|yes| M[City-fuzzed location in public record]
C --> N{Same fingerprint seen?}
N -->|yes| O[Mark duplicate]
tapbaitx/council.py β Carbon 4 + Muse councilflowchart TD
A[Question] --> B[Carbon 4: MAP β MODEL β STRESS β DECIDE]
A --> C[Muse: 4 advice items, authority none]
B --> D{Verdict}
C --> D
D -->|HOLD anywhere| H[β Final = HOLD]
D -->|clear| P[Proceed - with gates still on]
js/tapbaitx.js β JavaScript portflowchart TD
A[node js/tapbaitx.js] --> B[format / synthetic / fuzz / haversine]
B --> C[detect format + fingerprint]
C --> D[tile layout] --> E[Print JS CHECKS 7/7]
java/TapBaitx.java β Java portflowchart TD
A[javac + java TapBaitx] --> B[format / synthetic / fuzz / haversine]
B --> C[detect format + SHA-256 fingerprint]
C --> D[tile layout] --> E[Print JAVA CHECKS 6/6]
| Gate | What it locks |
|---|---|
live_wiretap_real_line | Tapping a real phone line |
covert_interception | Spying on another person, in secret, ever |
facetime_interception_decryption | Decrypting or tapping real FaceTime traffic |
tracking_another_person | Tracking another person's location |
carrier_network_access | Carrier / SS7 / Diameter network access |
imsi_catcher | IMSI catcher / stingray operation |
call_recording_without_consent | Recording a real call without consent notice |
live_location_api_call | Live Earth/Maps calls without key + consent |
live_gemini_api_call | Live Carbon 4 calls (seat runs offline) |
live_muse_api_call | Live Muse calls (seat runs offline) |
media_upload_external | Uploading tracked media to an outside service |
exact_location_public_share | Exact coordinates in public output |
child_location_sharing | Sharing a child's location |
exif_location_of_others_media | Reading location from another person's media without consent |
TapBaitx/
βββ π README.md
βββ βΆοΈ main.py
βββ π³ Dockerfile
βββ π¦ tapbaitx/
β βββ __init__.py
β βββ π gates.py
β βββ π phone.py
β βββ π§ taplab.py
β βββ πΉ facetime_lab.py
β βββ π geoearth.py
β βββ πΌοΈ media_tracker.py
β βββ π§ council.py
βββ π¨ js/
β βββ tapbaitx.js
βββ β java/
β βββ TapBaitx.java
βββ π§ͺ tests/
β βββ test_all.py
βββ π .github/workflows/
βββ ci.yml
βββ docker-publish.yml
python3 main.py β CHECKS 24/24
python3 -m pytest -q β 6 passed (clean copy, fresh venv)
node js/tapbaitx.js β JS CHECKS 7/7
java/TapBaitx.java β source-delivered (no JDK on the build machine; CI compiles + runs it)
Content type
Image
Digest
sha256:7499614d1β¦
Size
45.6 MB
Last updated
about 7 hours ago
docker pull credkellar/tapbaitx