A defensive communication CLI for spotting manipulation, holding boundaries, and answering bullies without becoming one.
Project description
IRL Gaslight
Spot the spin. Hold the line. Keep your receipts.
A warm, keyboard-driven defensive communication CLI for recognizing manipulation, rehearsing boundaries, answering bullies without becoming one, and keeping factual local notes.
██╗ ██████╗ ██╗
██║ ██╔══██╗ ██║ IRL GASLIGHT
██║ ██████╔╝ ██║ ─────────────
██║ ██╔══██╗ ██║ A calmer answer,
██║ ██║ ██║ ███████╗ right when pressure hits.
╚═╝ ╚═╝ ╚═╝ ╚══════╝
IRL Gaslight turns a terminal window into a small reality-check toolkit. Open the command palette, choose what happened, and leave with a response you can actually say—not another argument designed to exhaust you.
It does not teach gaslighting, coercion, humiliation, retaliation, or psychological abuse.
Install
pip install --upgrade irl-gaslight
Then open the interactive experience:
irl-gaslight
Use the arrow keys to move and press Enter to choose. On first launch, the shared IRL identity ritual can create your local profile and optionally link Google.
What is inside
| Path | What you get |
|---|---|
| Pattern check | Phrase-based signals for 20 manipulation tactics |
| Boundaries | Calm lines with consequences you control |
| Comebacks | Calm, dry, and direct answers without abuse |
| Rehearsal | Practice against realistic pressure scenarios |
| Incident log | Factual notes stored only on your machine |
| Daily grounding | One deterministic reality check each day |
| Favorites | A personal response shelf stored locally |
| Safety resources | Clear signals for stepping beyond a comeback |
| Shared identity | Name, pronunciation, pronouns, avatar, and oath |
| Google OAuth | Optional local account link shared across IRL tools |
The library contains 110 curated defensive entries across work, school, family, dating, friendship, and online situations. The interface includes a daily streak, clipboard support, favorites, responsive ANSI title art, and the warm burnt-orange IRL-Wisdom command-palette aesthetic.
Commands
irl-gaslight spot "That never happened. You imagined it."
irl-gaslight boundary --context work
irl-gaslight comeback --tone dry
irl-gaslight rehearse
irl-gaslight log
irl-gaslight history
irl-gaslight clear-log
irl-gaslight daily
irl-gaslight favorites
irl-gaslight resources
irl-gaslight upgrade
Add --copy or -c to supported response commands:
irl-gaslight boundary --context school --copy
Interactive lesson cards also offer Copy, Save to favorites, Back, and Exit actions.
Shared IRL identity and Google OAuth
IRL Gaslight uses the same local identity system as IRL Wisdom. A profile created in one ecosystem CLI can appear in the others.
irl-gaslight profile
irl-gaslight profile edit
irl-gaslight profile reset
irl-gaslight avatar
irl-gaslight oath
irl-gaslight oauth login
irl-gaslight oauth status
irl-gaslight oauth logout
The Google flow uses OAuth 2.0 Authorization Code with PKCE, a random state value, and a temporary localhost callback. Tokens are written locally to ~/.irl/google_oauth.json; profile data lives in ~/.irl/profile.json.
Google linking is optional. Cancelling, going offline, or skipping login does not block the defensive tools.
For a browserless terminal:
irl-gaslight oauth login --no-browser
The upgrade ritual
IRL Gaslight checks PyPI, compares versions, and asks before installing:
irl-gaslight upgrade
For scripts and confident terminals:
irl-gaslight upgrade --yes
How it works
irl-gaslight
├── Typer commands
├── Questionary command palette
├── Rich terminal rendering
├── Local JSON defensive library
├── irl_identity
│ ├── first-launch profile ritual
│ ├── avatars and Wisdom oath
│ └── Google OAuth with PKCE
├── ~/.irl_gaslight.json
│ ├── favorites
│ ├── incident notes
│ └── daily streak
└── ~/.irl
├── profile.json
└── google_oauth.json
There is no application database, telemetry, or cloud sync. Gaslight state, the shared profile, and OAuth tokens stay on the local device.
Safety first
The detector is a phrase-based educational aid, not a diagnosis. Context, repetition, power imbalance, and safety matter more than one sentence.
Do not use a comeback when it could increase danger. If someone is threatening, stalking, controlling, or violent, prioritize distance, trusted support, and local emergency or abuse-support services. Use irl-gaslight resources for the built-in safety checklist.
Development
git clone https://github.com/Dev2Creator/irl-gaslight.git
cd irl-gaslight
python -m venv .venv
.venv\Scripts\activate
python -m pip install -e .
irl-gaslight
Build and validate a release:
python -m pytest -q
python -m build
python -m twine check dist/*
Author
Created by Anika Mukherjee
Email: cuteypieanika@gmail.com
GitHub: @Dev2Creator
Copyright and license
Copyright © 2026 Anika Mukherjee.
The source code is licensed under the GNU Affero General Public License v3 or later.
Built for people who want their footing back before they choose their next words.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file irl_gaslight-0.2.0.tar.gz.
File metadata
- Download URL: irl_gaslight-0.2.0.tar.gz
- Upload date:
- Size: 47.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f7c2d8597af0a64f98d9b6498ee8495377f0cd1f5b23a50f4b1849809274dbb
|
|
| MD5 |
96abb6f4449a5d6a7688952fb947da8b
|
|
| BLAKE2b-256 |
135f3d2bc23d976ed2a28f500aa6ce34294fe0b7d20828919b8ddc46f9164f65
|
File details
Details for the file irl_gaslight-0.2.0-py3-none-any.whl.
File metadata
- Download URL: irl_gaslight-0.2.0-py3-none-any.whl
- Upload date:
- Size: 49.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2dff6bbf8dae1c27148ff06205f98d8abb5e94003a1845b1861ebdc8f5ce9f7a
|
|
| MD5 |
4e1d43b9c0ba984dc1426acdab790a0d
|
|
| BLAKE2b-256 |
16937dcdafbf62352d1d52351b03aac307f344d95ad45b2085b976fecb06e9c2
|