{"id":46475986,"url":"https://github.com/ddrcode/charon","last_synced_at":"2026-03-06T07:03:04.314Z","repository":{"id":302347604,"uuid":"1012103296","full_name":"ddrcode/charon","owner":"ddrcode","description":"The Ghost Between Your Keyboard \u0026 Your Machine","archived":false,"fork":false,"pushed_at":"2026-02-26T23:38:03.000Z","size":450,"stargazers_count":4,"open_issues_count":12,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-27T05:46:13.302Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ddrcode.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-01T20:19:59.000Z","updated_at":"2026-02-03T20:44:03.000Z","dependencies_parsed_at":"2025-07-11T05:54:57.012Z","dependency_job_id":"b64fbef7-401e-4367-9a90-e8e05155476e","html_url":"https://github.com/ddrcode/charon","commit_stats":null,"previous_names":["ddrcode/keyboard-os","ddrcode/charon"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ddrcode/charon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddrcode%2Fcharon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddrcode%2Fcharon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddrcode%2Fcharon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddrcode%2Fcharon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ddrcode","download_url":"https://codeload.github.com/ddrcode/charon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddrcode%2Fcharon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30164901,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T04:43:31.446Z","status":"ssl_error","status_checked_at":"2026-03-06T04:40:30.133Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2026-03-06T07:03:01.541Z","updated_at":"2026-03-06T07:03:04.227Z","avatar_url":"https://github.com/ddrcode.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Charon\n**The ghost between your keyboard and your machine.**\n\nOr - if you don’t like poetry:\n\u003e A USB keyboard pass-through device built on Raspberry Pi, capable of intercepting input to run\n\u003e local apps (like a password manager or editor) and injecting the results as keystrokes.\n\nOr - if you wear a tie and a blue shirt:\n\u003e A stealth personal assistant disguised as a keyboard.\n\nOr - if this parapgraph is already too long for you:\n\n\u003cimg width=\"578\" alt=\"Charon\" src=\"https://github.com/user-attachments/assets/63099e00-4ce6-4a08-a5d6-9f160f672aa9\" /\u003e\n\n\n\n\n## Current Features\n\n- **Pass-through Mode** - Forwards keystrokes directly to the host with negligible latency.\n- **In-App Mode** - Acts as an interceptor: brings up a menu on screen for user interaction.\n- **Vim-everywhere** - Launch a local editor, type your text, and inject it as keystrokes to the host.\n- **Charonsay** - Enjoy cryptic wisdom from the other side of the Styx as you type.\n- **Telemetry** - Captures rich per-keystroke stats, because *every ESC press matters*.\n- **Stats Screen / Charts** - Visualize metrics like average/max WPM over the past year.\n- **Power Management** - Automatically dims the screen and lowers CPU usage when idle.\n- **Password Manager** - Securely pick and type out passwords—no copy-paste involved.\n- **Keymaps** - keystrokes writer supports multiple layouts/keymaps\n\n\n\n##  \"*But I already have a programmable keyboard (QMK, ZMK, etc)...*\"\n\nPerfect. Charon is *not* a replacement for QMK - it's an extension.\n\nThink of it as giving your QMK keyboard:\n- A brain,\n- A screen, and\n- A full Linux stack.\n\nWith Charon you can:\n- Run any Linux app, interact with it, and send results to the host as keystrokes.\n- Plug in multiple keyboards: type on one, trigger macros on the other.\n- Get real telemetry (e.g., *how often did you press ESC last Tuesday?*).\n- Do anything that needs more power, storage, display, or OS features than microcontroller-based solutions allow.\n\n\n\n## \"*But I don’t have a programmable keyboard...*\"\n\nPerfect - because you don’t need one.\n\nCharon isn't about just remapping keys or adding layers. It's about bringing *apps* and a *screen* to *any* keyboard, programmable or not.\n\n\n\n## \"*Is It Stable?*\"\n\nYes.\nDespite the prototype being held together with `.unwrap()` and goodwill, it hasn’t crashed once.\n\n\u003e “If the ghost drops your keystrokes into the Styx, we’ll fish them out and patch it.”\n\nMore pragmatically:\n- I now use Charon 100% of the time.\n- The daemon reliably forwards keystrokes with **sub-millisecond latency**.\n- The client is still limited to a few basic apps, but it’s growing fast.\n\nIt’s not \"production-grade\" or certified for aerospace use (yet), but it’s definitely *towel-grade*:\nIt doesn’t panic.\n\n\n\n## Planned Features\n\n- Per-keyboard settings and stats\n- Multi-keyboard support (e.g. one for typing, another for macros)\n- Unicode character injection (platform-specific)\n- Mouse pass-through\n- QMK Raw HID support\n- Users / profiles\n\n\n\n##  Known Limitations\n\n- No wake-from-sleep: It can't currently wake the host from a deep sleep via keystrokes.\n  **Workaround**: It *can* send a Wake-on-LAN magic packet (just press F8).\n\n\n\n## Screenshots\n\n\u003cdiv\u003e\nCharon's welcome screen:\u003cbr/\u003e\n\u003cimg width=\"666\" alt=\"splash screen\" src=\"https://github.com/user-attachments/assets/67eacb3b-e3ac-41f4-a0fd-943c3f5d5318\" /\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\nWhen typing happens somewhere else... (the idle state)\u003cbr/\u003e\n\u003cimg width=\"666\" alt=\"idle screen\" src=\"https://github.com/user-attachments/assets/ca557aac-345c-43bc-b5db-2adb28691038\" /\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\nWhen you're typing faster than yourself, Cerberus comes:\u003cbr/\u003e\n\u003cimg width=\"666\" alt=\"typing fast screen\" src=\"https://github.com/user-attachments/assets/0eb8a35e-34a2-425b-843e-4e85b91e7c0e\" /\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\nCharts in the terminal? Why not...\u003cbr/\u003e\n\u003cimg width=\"666\" alt=\"wpm stats\" src=\"https://github.com/user-attachments/assets/e892e629-6749-40e9-91cc-38a809d136ac\" /\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\nHeatmap is fine too...\u003cbr/\u003e\n\u003cimg width=\"666\" alt=\"key frequencies\" src=\"https://github.com/user-attachments/assets/f48e23b5-3921-47ae-a568-040393adbb3d\" /\u003e\n\u003c/div\u003e\n\n\u003cdiv\u003e\nCharon's menu - it pops up automatically on \u003ci\u003emagic key\u003c/i\u003e (F7 by default):\u003cbr/\u003e\n\u003cimg width=\"666\" alt=\"menu\" src=\"https://github.com/user-attachments/assets/d9bea87b-6ed7-4a6d-bc6c-a8f14bf83a4b\" /\u003e\n\u003c/div\u003e\n\n## Want to Contribute?\n\nCharon is still in its early stages, but it’s built to grow. If you:\n\n- love tinkering with Linux input devices,\n- enjoy Rust’s type system more than some people enjoy vacation,\n- or have ideas about how to make keyboards even cooler...\n\nYou’re very welcome to get involved.\n\nOpen issues, suggest features, or just come say hi in Discussions.\nNo pressure, no CLA, just curiosity and a bit of ghostly magic.\n\n## Getting Started\n\nSee the [Raspberry Pi 5 Setup Guide](docs/rp5-setup.md) for complete instructions on setting up Charon on your Pi.\n\n## Testing your devices\n\nUse `evtest \u003cinput_file\u003e`\n\n## Credits\n\n[rikka-chunibyo/HIDPi](https://github.com/rikka-chunibyo/HIDPi)\nWithout this project I would have never properly configured RP5 as HID gadget. Thank you!\n\n[passepartui](https://github.com/kardwen/passepartui)\nThe default password manager used by Charon (although it can be integrated with any other one tool).\n\n[ASCII.co.uk](https://ascii.co.uk/)\nThe ASCII-art comes from the amazing repository on that website. A great ASCII-gem.\n\n\n## License\n\nCharon is licensed under the [GNU General Public License v3.0](LICENSE).\n\n\n## Bonus: Pancakes from the Underworld\n\nCharon doesn’t just ferry your keystrokes. Here’s what fuels him:\n\n**Ghostly Pancakes**\n\nIngredients:\n- 1 cup all-purpose flour\n- 1 tbsp sugar\n- 1 tsp baking powder\n- 1/2 tsp baking soda\n- 1 pinch of salt\n- 1 cup buttermilk\n- 1 egg\n- 2 tbsp melted butter\n\nInstructions:\n1.\tIn a bowl, whisk together dry ingredients.\n2.\tIn another bowl, beat the egg, then add buttermilk and melted butter.\n3.\tCombine wet and dry. Do not overmix — lumps are from the Styx.\n4.\tCook on a hot greased griddle until bubbles form; flip and cook the other side.\n5.\tServe with maple syrup. Or with Charon’s tears of joy.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fddrcode%2Fcharon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fddrcode%2Fcharon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fddrcode%2Fcharon/lists"}