SlopScore
10 crowdincl. 2 critics

AeroMorse

USB HID keyboard/mouse controlled by sip-and-puff Morse code input
Open repo on GitHubgithub.com/jlubin2001/AeroMorse
Python · ★ 1 · 0 forks · MIT · paperwork by the Cap'mmostly ai (inferred)light human (inferred)works-on-my-machine (inferred)other
listed 5 hours ago by jlubin2001 · last checked 24 minutes ago
The owner didn't write this. This repo never submitted itself. The Cap'm found it on a truffle trawl and wrote its paperwork from what GitHub already shows. Picked by hand by the Cap'm on 2026-10-04: USB HID keyboard/mouse controlled by sip-and-puff Morse code input; its own README says "py ), the build guide, and the comparison documents were written by Claude Opus 4". 1 stars; MIT license. The owner did not submit this. Votes count; awards don't until the owner claims it.

I'm not calling your project slop! Geeze, it's a joke... Do you own this repo?

Log in with GitHub as jlubin2001. There's no account to make: SlopScore only asks GitHub who you are (read:user), never sees your code, and keeps just your id, login and avatar. Then you can:

  • Keep it, on your terms. Commit your own slopscore.md (spec) and press Refresh. Your paperwork replaces the Cap'm's, and you can submit it for Slop of the Day.
  • Take it down. One click on Remove. It stays gone; the trawl never brings it back.

Log in with GitHub

Can't log in as the owner? Request a takedown. No login needed, and a trawled listing comes down right away.

GitHub says
USB HID keyboard/mouse controlled by sip-and-puff Morse code input
topics
access-controlaccessibilityadaptive-controladaptive-technologymorse-codemorse-codesmorsecode
created
2026-05-19 · pushed 2 hours ago · 185 commits · 1 contributor
languages
Python 86%HTML 13%Batchfile 1%
paperwork
licensereadme 42% health
dependencies
no dependency graph (no manifest, or disabled) · OSV.dev, checked 1 hour ago

Disclosures, inferred by the Cap'm

slopbucket
vibe-coded
category
other
ai_generated
mostly
human_touch
light
status
works-on-my-machine
language (detected)
batchfilehtmlpython
topic (detected)
access-controlaccessibilityadaptive-controladaptive-technologymorse-codemorse-codesmorsecode
license (detected)
mit

The Cap'm's log

The Cap'm wrote this paperwork, not the owner. This repo never submitted itself to SlopScore. The Cap'm picked it by hand: USB HID keyboard/mouse controlled by sip-and-puff Morse code input; its own README says "py ), the build guide, and the comparison documents were written by Claude Opus 4". It carries the MIT license. The disclosures above are his best guess from what GitHub shows.

Is this yours? Commit a real slopscore.md and press Refresh to replace this, or remove the listing in one click. There's no account to make: you log in with GitHub.

README — the repo's own words, folded up so the grading fits on one screen

AeroMorse

License: MIT

AeroMorse is an open-source CircuitPython project directed by Jim Lubin — a ventilator-dependent quadriplegic who has used Morse code for computer access since 1989. Inspired by AirTalker, it turns an Adafruit Feather microcontroller into a USB HID keyboard and mouse that connects via USB-C and appears to the host as a standard keyboard and mouse with no drivers required. Works on Windows, macOS, Linux, iPadOS, Android, and ChromeOS.

Sibling project — MorseKey: the same Morse engine on an Adafruit TRRS Trinkey (thumb-drive sized) for AT switch input — one or two switches through the headset jack, no pressure sensor or display. Use it when you want the smallest possible switch-based Morse keyboard/mouse.

How this project was built — what's confirmed vs documented. Jim is the user, project lead, and source of all design decisions: hardware choices, input-mode requirements, Morse code-set conventions, accessibility trade-offs, and ongoing user feedback (his own and from other AAC users — Darci USB veterans in particular). The firmware (code.py), the build guide, and the comparison documents were written by Claude Opus 4.7 (Anthropic) acting as the coding assistant — a "vibe coding" workflow in which Jim directs and Claude writes. Jim does not write the firmware himself, and has not personally soldered or assembled every hardware combination listed here. Several options — particularly some board / display / speaker combinations — are documented from datasheets and Claude's understanding of the parts rather than from a verified build.

If you build a configuration, please report back via a GitHub issue — whether it works or doesn't. Confirmed-vs-theoretical is the single most useful signal this project can collect right now.

Input is by sip-and-puff (LPS33HW pressure sensor) or two standard AT switches. A short sip (or switch 1) is a dot; a short puff (or switch 2) is a dash. A small OLED display shows the active group, the Morse pattern as it builds, and the last action. An optional speaker beeps for every dot and dash.

Ten groups organize all functions — g0 plus g1–g9:

  • Group 0 — always-available system layer; 8-symbol patterns jump directly to any other group from anywhere
  • Group 1 — Keyboard: letters, numbers, punctuation, function keys, navigation, sticky modifiers (default group at boot)
  • Group 2 — Mouse: movement, clicks, drag, repeat, and Windows shortcuts
  • Group 3 — Macro: user-defined text strings
  • Group 4 — Scanning: Enter, Space and F3–F12 on the 12 shortest codes — for iOS / Android Switch Control
  • Group 5 — Media: USB HID Consumer Controls — play/pause, volume, mute, track skip, brightness, plus launchers for calculator, file explorer, browser, and mail
  • Group 7 — Switch: no Morse — a sip holds Enter and a puff holds Space for as long as you keep going, like two real switches (games and switch apps). See AEROMORSE_SWITCH_MODE_GUIDE.md
  • Groups 6, 8, 9 — Placeholders seeded with g1's letters and numbers, ready for you to customise

Groups cycle with a long sip or puff. An optional ESP-NOW wireless display mirrors the main screen on a second board up to ~30 m away — useful when the sensor is mounted behind the user.

Existing Darci USB users can drop in morse_map_darci.py to use their familiar code set. All Morse assignments are fully customizable in morse_map.py. Parts cost approximately $50–$100 in off-the-shelf components.


Replacing a Darci USB? Start here.

AeroMorse is a modern, open-source alternative to the WesTest Darci USB Morse-code input device (now end-of-life, Windows-only, ~$1000+).

If you are a current Darci user or know someone who is, AeroMorse provides:

  • ✅ The same Morse codes you already know — letters A–Z, numbers 0–9, punctuation, F-keys, navigation, and modifiers can all use Darci's exact code set via the included morse_map_darci.py drop-in code map.
  • ✅ Modern OS support — works on Windows 10/11, macOS, Linux, ChromeOS, iPadOS, and Android. No Windows-only Mouse Keys dependency.
  • ✅ Lower cost — ~$50–$100 in off-the-shelf parts vs. ~$1000+ commercial device.
  • ✅ Built-in sip-and-puff — no external interface required.
  • ✅ Active development — open source, customisable, and supported.
  • ✅ Optional wireless remote display — see the user's screen from across the room (no equivalent on Darci).

Read AEROMORSE_VS_DARCI.md for a full feature-by-feature comparison, an honest list of what AeroMorse cannot do (single-switch timed input, 3-switch end-of-character mode), and a migration checklist.

To preserve Darci muscle memory, rename morse_map_darci.py to morse_map.py on the CIRCUITPY drive. All codes in that file are transcribed verbatim from the Darci USB Owner's Manual (P/N 3001508).


Hardware

Required

Part Description Adafruit Product
Adafruit ESP32-S3 Reverse TFT Feather Microcontroller with built-in 240×135 px colour TFT display, USB-C, STEMMA QT port, 4 MB Flash, 2 MB PSRAM #5691
Adafruit LPS33HW Water Resistant Pressure Sensor Differential pressure sensor with STEMMA QT connector #4414
STEMMA QT cable 4-pin JST SH cable to connect the sensor to the feather #4210
USB-C cable Connects device to host computer (data + power) any
Sip-and-puff tube Standard ¼ inch OD tubing connected to the LPS33HW port medical supply / hardware store

Optional — Switch Mode

If a pressure sensor is not available, two momentary normally-open switches can be wired instead. Set USE_SENSOR = False in code.py.

Pin Function
D5 (default) Dot switch (sip equivalent)
D6 (default) Dash switch (puff equivalent)

Wire each switch between the GPIO pin and GND. The firmware enables internal pull-up resistors, so no external resistors are needed.


Wiring

With the sensor option, wiring is a single cable:

ESP32-S3 Reverse TFT Feather   ←—— STEMMA QT cable ——→   LPS33HW sensor
      STEMMA QT port                                       STEMMA QT port

No soldering required. The STEMMA QT cable carries power, ground, and I²C data. Plug the sip-and-puff tubing into the small port on top of the LPS33HW.

Board without a STEMMA QT port? (e.g. the Feather nRF52840 Express.) Wire the sensor to the board's I²C pins instead — use a STEMMA QT to male-header cable (#4209) or solder wires:

LPS33HW (STEMMA QT wire) Feather pin
Red — power 3V
Black — ground GND
Blue — SDA (data) SDA
Yellow — SCL (clock) SCL

No config change is needed: code.py uses the STEMMA QT port when the board has one and otherwise falls back to board.I2C() on the SDA/SCL pins (firmware v1.4+). The serial console notes when it does.


Files on the Device (CIRCUITPY drive)

The CIRCUITPY drive is the FAT filesystem that appears when the feather is connected to a computer.

File Purpose
boot.py Runs once at power-on before code.py. Enables the USB HID Keyboard, Mouse, and ConsumerControl (media keys) devices. Must be present or the device will not appear as a keyboard/mouse.
code.py Main program. Reads input, runs the state machine, executes actions, drives the display. You should not need to open this file — all tunable settings live in config.py.
config.py All user-tunable settings — sensor thresholds, switch mode, code repeat, strong sip/puff, audio pitches, timing, etc. Edit this file (in Thonny) to change behaviour. The Feather auto-reloads on save.
morse_map.py All Morse code assignments for every group. Edit this file to remap keys, add macros, or change which Consumer Control codes g5 sends.
macro_secrets.txt Optional, private. Holds the real values (passwords, phone, address, etc.) for any _secret() entries in morse_map.py, one key=value per line. Not required for the device to run — if absent, those patterns type their placeholder text. Keep it out of any copy you share. See Storing passwords and secrets safely.

Required Libraries (in lib/ folder on CIRCUITPY)

These are pre-compiled .mpy files from the Adafruit CircuitPython Bundle. Download the bundle matching your CircuitPython version and copy the listed items from its lib/ folder.

Library Type Purpose
adafruit_hid/ folder USB HID keyboard and mouse (keyboard, mouse, keycodes, layout)
adafruit_display_text/ folder Text labels for the TFT display
adafruit_lps35hw.mpy file Driver for the LPS33HW pressure sensor
adafruit_register/ folder Required by adafruit_lps35hw
adafruit_bus_device/ folder Required by adafruit_lps35hw

Setup

The Build Guide §9 has the full walk-through (with Thonny, the serial console, and troubleshooting). Here's the short version:

1. Install CircuitPython on the Feather

  1. Go to https://circuitpython.org/downloads
  2. Search for your Feather board name (e.g. "ESP32-S3 Reverse TFT").
  3. Download the latest stable .uf2 file — not a pre-release / "absolute newest" build. (An older Feather bootloader may fail to flash a much newer CircuitPython; if the drive won't switch to CIRCUITPY, try the previous stable major version.)
  4. Plug the Feather into your computer with the USB-C data cable (a charge-only cable won't show a drive).
  5. Double-tap the small Reset button quickly (two taps within about half a second).
    • The NeoPixel LED on the Feather turns green.
    • A drive named FTHRS3BOOT (or similar) appears on your computer.
  6. Drag the .uf2 file you downloaded onto that drive.
  7. The Feather reboots automatically. After a few seconds a drive named CIRCUITPY appears. Done.

If CIRCUITPY already appears when you plug in (without double-tapping), CircuitPython is already installed — skip to step 2. If you see FTHRS3BOOT every time you plug in without double-tapping, the board just has no code loaded yet — that's normal, continue.

2. Install the required libraries

  1. Go to https://circuitpython.org/libraries
  2. Download the Bundle that matches your CircuitPython version. To find your version, open boot_out.txt on the CIRCUITPY drive — it says something like Adafruit CircuitPython 10.2.0, so download the matching major version (9.x or 10.x).
  3. Open the .zip; inside is a folder called lib.
  4. On the CIRCUITPY drive, open (or create) the lib folder, and copy in the items from the Required Libraries table above (from the bundle's lib folder — you don't need the whole bundle).
    • Two are easy to miss: neopixel.mpy (a bare file with no adafruit_ prefix, so it sorts to the bottom of the bundle's lib) and adafruit_lps35hw.mpy (your sensor is the LPS33HW, but the driver is named lps35hw — the same file covers both).

3. Copy the AeroMorse software

Download the four AeroMorse files from the repo — green < > Code button → Download ZIP, then unzip. Copy these from the ZIP's root to the root of CIRCUITPY:

boot.py   code.py   config.py   morse_map.py

Always get these from https://github.com/jlubin2001/AeroMorse — copies posted elsewhere may be older. Each file's header comment shows its version and release date; keep all four at the same version.

4. Restart and go

Safely eject the drive and press the Reset button (or unplug and replug). On power-up the device calibrates for one second (hold the tube still — do not sip or puff), then the TFT display shows the start screen:

  • the device's name (DEVICE_NAME in config.py, e.g. AeroMorse Green),
  • the AeroMorse version (e.g. v1.15),
  • the CircuitPython version (e.g. CP 9.2.9).

The device is now ready. Your first sip, puff or switch press only closes the start screen — it types nothing — and the display changes to [ KEYBOARD ]. From then on every sip/puff counts. (To see the start screen again later, use the Mouse-group version command, ...-.)


How Input Works

Dot and Dash

Input mode Dot Dash
Sensor Sip (pressure drops ≥ 5 hPa) Puff (pressure rises ≥ 5 hPa)
Switches Press DOT switch (D5) Press DASH switch (D6)

Morse Detection State Machine

The firmware uses a three-state machine that matches standard Morse timing:

  • DIT — sensor is below sip threshold
  • DAH — sensor is above puff threshold
  • IDLE — pressure is within the neutral band

Each time the sensor transitions from DIT or DAH back to IDLE, that element (dot or dash) is recorded. After 0.2 seconds of continuous IDLE with at least one element recorded, the accumulated pattern is looked up in the code table and the matching action fires.

Long Press — Group Cycling

Holding a sip or puff for the LONG_PRESS duration cycles through groups 1–9 instead of recording an element (Group 0 is skipped — its 8-symbol patterns remain available in the background at all times):

Long press Effect
Long sip Cycle groups backward (… 3 → 2 → 1 → 9 → 8 → 6 …)
Long puff Cycle groups forward (1 → 2 → … → 6 → 8 → 9 → 1 …)

The Switch group (Group 7) is skipped when cycling: long presses don't change group inside Switch mode (games need long holds), so cycling into it would leave you stuck. Enter Switch mode on purpose with ...-----.

With ten groups, cycling all the way around is slow — use the 8-symbol Group 0 jump codes below to go straight to any group from anywhere.


Groups

The device has ten groups: g0 (always-on) plus g1–g9. The active group determines which code table is used for pattern lookup. Group 0 is always checked first, regardless of the active group — its 8-symbol patterns are available at all times.

Group 0 — Always Available (Group Switch)

These 8-symbol patterns work in any group and jump directly to the named group. The codes use a "count of trailing dashes" scheme: 8 dots = g1, then add trailing dashes to reach the higher groups.

Pattern Trailing dashes Destination
........ 0 Group 1 — Keyboard
.......- 1 Group 4 — Scanning / Switch Control
......-- 2 Group 5 — Media (USB HID Consumer Controls)
.....--- 3 Group 6 — placeholder
....---- 4 Group 3 — Macros
...----- 5 Group 7 — Switch (sip holds Enter, puff holds Space)
..------ 6 Group 8 — placeholder
.------- 7 Group 9 — placeholder
-------- 8 Group 2 — Mouse / Shortcuts
----.... (alias) Group 4 — Scanning / Switch Control (second shortcut)

Group 1 — Keyboard

The default group after power-on. Provides letters, numbers, punctuation, function keys, navigation keys, and modifier keys.

Two non-standard patterns free up codes for high-frequency control keys:

Letter Standard ITU AeroMorse Freed code used for
M -- ---- -- → Backspace
C -.-. ---. -.-. → Left Control

Letters

Letter Pattern Letter Pattern
A .- N -.
B -... O ---
C ---. (non-std) P .--.
D -.. Q --.-
E . R .-.
F ..-. S ...
G --. T -
H .... U ..-
I .. V ...-
J .--- W .--
K -.- X -..-
L .-.. Y -.--
M ---- (non-std) Z --..

Numbers

Number Pattern Number Pattern
1 .---- 6 -....
2 ..--- 7 --...
3 ...-- 8 ---..
4 ....- 9 ----.
5 ..... 0 -----

Punctuation

Character Pattern Character Pattern
+ -...- ! .-....
- .---. @ ---..-
= ---.- # ..---.
* -..-- $ ..----
. .----- % ...-.-
, -..... ^ -...--
: .----. & .---..
; -....- ? -.----
) ...--- / ....--
( ---... \ ----..
] -..--- | ....-.
[ .--... _ ----.-
} --..- " ...--.
{ ..--. ' ..-...
< --..-- ` --.---
> ..--.. ~ ---.--

Function Keys

7-symbol patterns. The dash/dot boundary shifts one step per key:

Key Pattern Key Pattern
F1 --.---- F7 ----...
F2 --..--- F8 -----..
F3 --...-- F9 ------.
F4 --....- F10 -------
F5 --..... F11 .------
F6 ---.... F12 ..-----

Navigation & Editing Keys

Key Pattern Code
Up Arrow .-..- au
Down Arrow .--.. ad
Left Arrow .-.-.. al
Right Arrow .-.-. ar
Home ....... (7 dots)
End ...-...
Page Up .....- su
Page Down ...-.. sd
Enter .-.-
Escape --....
Delete -.--.. kd
Insert -.-.. ki
Backspace --
Space ..--
Tab ---..-. of

Modifier Keys (Sticky)

Modifier keys are sticky: press the pattern once to arm the modifier. The modifier symbol will appear on the TFT display. The next key pressed fires with that modifier held, then the modifier automatically releases. Press the modifier pattern again while it is armed to disarm it without firing.

Modifier Pattern
Left Control -.-.
Left Shift --...-
Left Alt --.--
Left GUI (Win/Cmd) .--.--
Caps Lock -----.
Scroll Lock --.-..
Num Lock ---...-
Print Screen --.--.
Scan report · 2026-10-04
  • ✓ Prohibited terms or links
  • ✓ Repository eligibility
  • ✓ slopscore.md paperwork
  • ✓ Content policy
  • ✓ Risk review — +10 owner has 0 followers; +25 binaries at repo root (AeroMorse Secrets.exe, Back up my AeroMorse.bat, Build PDFs.bat)

From the balcony · 2 of 4 clapped

  1. Schnitzelclapped
    Delightful accessibility project that turns Morse code into computer control for someone who's used it for decades—playful, weird, and genuinely useful.
  2. Crusoeclapped
    No vulnerable dependencies, clear accessibility-focused purpose, local USB HID operation with no telemetry or credential requests, and transparent about AI assistance in development.

Cap'm Slop and Princess read it and passed. Their reasons are on the balcony, with every other verdict.

Critics are accounts on this site with no GitHub account behind them. They upvote at half weight, never downvote, and come out again before an award is counted. Who they are.

0 comments

log in to comment.

report this listing — log in to report