{"id":50677099,"url":"https://github.com/sgrljess/nogasm-link","last_synced_at":"2026-06-08T16:05:17.985Z","repository":{"id":297022073,"uuid":"993065048","full_name":"sgrljess/nogasm-link","owner":"sgrljess","description":"Edging detection and local control of any lovense device","archived":false,"fork":false,"pushed_at":"2025-06-03T11:53:03.000Z","size":1780,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-03T22:54:38.528Z","etag":null,"topics":["ble","edging","esp32","lovense","nogasm","pressure-sensor"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sgrljess.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-30T06:45:29.000Z","updated_at":"2025-06-03T11:53:05.000Z","dependencies_parsed_at":"2025-06-03T23:07:08.985Z","dependency_job_id":null,"html_url":"https://github.com/sgrljess/nogasm-link","commit_stats":null,"previous_names":["sgrljess/nogasm-link"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sgrljess/nogasm-link","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sgrljess%2Fnogasm-link","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sgrljess%2Fnogasm-link/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sgrljess%2Fnogasm-link/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sgrljess%2Fnogasm-link/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sgrljess","download_url":"https://codeload.github.com/sgrljess/nogasm-link/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sgrljess%2Fnogasm-link/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34069512,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ble","edging","esp32","lovense","nogasm","pressure-sensor"],"created_at":"2026-06-08T16:05:14.846Z","updated_at":"2026-06-08T16:05:17.978Z","avatar_url":"https://github.com/sgrljess.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# NogasmLink\n\nAn intelligent arousal management system for ESP32 that connects to Lovense devices via Bluetooth LE, using a pressure\nsensor for automated edging control and real-time web monitoring.\n\nThe inspiration for this project came from the fact that I wanted to build my own `nogasm` but could not source the\nmotors required for the vibrator easily, which made me think that I already have lots of lovense devices and they all\nuse Bluetooth LE.\n\nThe standard way of connecting to lovense devices is through [their API](https://developer.lovense.com), _however_,\nusing a direct BLE connection does not need to send data back and forth to their servers and the device control is\n**local** only, which is better for privacy and response times. The ESP here essentially acts as the lovense remote app.\n\nThis reduces the friction of building the project in my opinion. I'm not that great with PCB design (software is my main\nthing) and my current version is hand soldered. It would be great if the community can help design a solid PCB for this\nproject specifically\n\n## Features\n\n- **Pressure Sensor Integration**: Real-time monitoring with configurable sensitivity\n- **Bluetooth LE Device Control**: Native support for Lovense devices (Nora, Max, Lush, etc.)\n- **Intelligent Edging**: Automated arousal detection with cooldown periods\n- **Clench Detection**: Advanced pressure pattern recognition\n- **Web Interface**: Real-time dashboard with data visualization and device control\n- **Hardware Controls**: Rotary encoder for sensitivity adjustment and emergency stop\n\n## Lovense\n\nThe device will automatically reconnect on ble failure, and supports connecting to the last device on startup, which\nallows the UI to be used minimally supporting hands-free use.\n\nTested and working with:\n\n* Tenera\n* Max\n* Solace\n* Hush _(a bit pointless for this project 🤣)_\n\n## UI\n\n### Scanner\n\n![Scanner](docs/images/device-scanner.png)\n\n### Session\n\n![Session](docs/images/session-active.png)\n\n### Analytics\n\n![Analytics](docs/images/analytics.png)\n\n### Config\n\n#### General\n\n![General](docs/images/general-config.png)\n\n#### Clench\n\n![Clench](docs/images/clench-config.png)\n\n## Credits\n\n- https://github.com/nogasm/nogasm\n- https://github.com/MausTec/edge-o-matic-3000\n- https://github.com/Edging-Machines/Edging-Machines\n- https://docs.buttplug.io/docs/stpihkal/protocols/lovense/\n\n## Hardware\n\n![schematic](docs/images/schematic.png)\n\n### Components\n\n- ESP32 development board\n- MPX5700GP pressure sensor\n- Rotary encoder with push button\n- RGB LED (common cathode)\n- Appropriate resistors and breadboard/PCB\n\n### Pin Configuration\n\n```\nPressure Sensor: GPIO 34\nEncoder A/B:     GPIO 32/33  \nEncoder Button:  GPIO 35\nRGB LED:         GPIO 25/26/27\n```\n\n## Installation\n\n### 1. Build Web Assets\n\n```bash\ncd webapp\nyarn install\nyarn build\n```\n\n### 2. Upload Firmware\n\n```bash\n# Install PlatformIO dependencies\npio lib install\n\n# Build and upload firmware\npio run --target upload\n\n# Upload filesystem image (includes web assets)\npio run --target uploadfs\n```\n\n### 3. Initial Setup\n\n1. Device creates \"NogasmLink\" WiFi AP on first boot\n2. Connect and configure WiFi credentials\n3. Access web interface at device IP\n4. Pair Lovense device\n\n#### Startup\n\n```text\n[INFO]  Starting up NogasmLink...\n[INFO]  Initializing BLE...\n[INFO]  Nogasm BLE Manager initialized with name: NogasmLink\n[INFO]  WiFi Connected! IP Address: 192.168.0.139\n[INFO]  mDNS responder started, Device can be reached at: NogasmLink.local\n[INFO]  WebSocket server initialized on path: /ws\n[INFO]  HTTP server started @ 8080\n[INFO]  EncoderManager::init -\u003e value:63\n[INFO]  IDLE -\u003e SCANNING :: Start scanning\n[INFO]  SCANNING -\u003e IDLE :: Scan completed\n[INFO]  IDLE -\u003e CONNECTING :: Connecting to device...\n[INFO]  CONNECTING -\u003e FINDING_SERVICE :: connect() success\n[INFO]  FINDING_SERVICE -\u003e CONNECTED :: Connected successfully!\n```\n\n## Usage\n\n1. **Device Pairing**: Scan and connect via web interface\n2. **Session Control**: Start/stop arousal management from dashboard\n3. **Sensitivity**: Adjust via rotary encoder or web interface\n4. **Emergency Stop**: Press encoder button anytime\n5. **Data Export**: Download session data as CSV\n\n## API Overview\n\n### Key Endpoints\n\n```\nGET/POST /api/arousal/status     # Session control\nGET/POST /api/arousal/config     # Configuration\nPOST     /api/vibrate            # Device control\nGET      /api/devices            # BLE scanner\n```\n\n### WebSocket Updates\n\nReal-time data at `/ws`:\n\n- `ble_status`: Device connection state\n- `arousal_status`: Pressure, arousal level, session state\n\n## Configuration Options\n\n- **Arousal Decay Rate**: How quickly arousal decreases (0.1-0.99)\n- **Sensitivity Threshold**: Peak detection sensitivity\n- **Ramp/Cooldown Times**: Speed control and rest periods\n- **Clench Detection**: Pressure pattern recognition settings\n\n## Architecture\n\n**Core Components**: ArousalManager, NogasmBLEManager, PressureSensor, EncoderManager, RGBManager, NogasmHttp\n\n**Data Flow**: Pressure sensor → Arousal detection → State machine → Device control → User feedback","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsgrljess%2Fnogasm-link","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsgrljess%2Fnogasm-link","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsgrljess%2Fnogasm-link/lists"}