[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-83327":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":19,"compositeScore":20,"rankGlobal":10,"rankLanguage":10,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":26,"readmeContent":27,"aiSummary":10,"trendingCount":16,"starSnapshotCount":16,"syncStatus":15,"lastSyncTime":28,"discoverSource":29},83327,"asryx","rccyx\u002Fasryx","rccyx","Daemonless Linux native ASR CLI, done the UNIX way, no dependencies beyond pure C++ and the standard Linux toolchain","",null,"C++",141,8,115,2,0,1,26,18,60.46,"Apache License 2.0",false,"main",true,[],"2026-06-12 04:01:40","\u003Cdiv align=\"center\">\n\n# asryx\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Frccyx\u002Fasryx\u002Factions\u002Fworkflows\u002Fci.yml\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002Frccyx\u002Fasryx\u002Fci.yml?branch=main&style=for-the-badge&color=black&labelColor=111111&logo=githubactions&logoColor=white\" alt=\"CI Status\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"#installation\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPlatform-Linux-black?logo=linux&logoColor=white&style=for-the-badge&labelColor=111111\" alt=\"Platform: Linux\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"#runtime-model\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FOffline-100%25-black?logo=shield&logoColor=white&style=for-the-badge&labelColor=111111\" alt=\"Offline\"\u002F>\n  \u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Frccyx\u002Fasryx\u002Fblob\u002Fmain\u002FLICENSE\">\n    \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-Apache--2.0-black?logo=apache&logoColor=white&style=for-the-badge&labelColor=111111\" alt=\"License: Apache-2.0\"\u002F>\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003C\u002Fdiv>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\".\u002Fassets\u002Fdemo.gif\">\n    \u003Cimg src=\".\u002Fassets\u002Fdemo.gif\" alt=\"asryx demo\" width=\"100%\">\n  \u003C\u002Fa>\n\u003C\u002Fp>\n\n## Overview\n\nThis is a native C++ ASR binary toggle\u002FCLI for Linux.\n\nLinks against `whisper.cpp` (built locally against a pinned source tree) as an embedded library through it's public C compatible API to supply the inference engine, while `asryx` owns the entire native Linux runtime around it.\n\nRecords audio through the active Linux audio stack, runs recognition in process, writes the transcript to the active clipboard backend, emits desktop notifications, and removes runtime artifacts after completion.\n\nEasily [installed](#installation), and more easily [removed](#uninstallation).\n\nDoesn't stay in memory between uses. 0MB idle RAM. Doesn't load the model unless invoked.\n\nBoots instantly and exits instantly.\n\nOne command install. You compile the program on your own machine, no package manager or third parties.\n\nIt uses standard C++ and Linux [dependencies](#dependencies), and it's CPU only by default, so it works with any machine, regardless of distro or GPU model.\n\nGGML models are downloaded [locally](#uninstallation).\n\nTranscription runs locally against those weights.\n\n[Reliable](#mechanism) is the word. Repeated invocations, key repeat, stale locks, interrupted sessions, and abandoned runtime artifacts are handled before a new recording begins.\n\nThere is no ASR server, background daemon(s), hosted API, Python runtime, Node runtime, container layer, resident daemon, GUI process, dashboard, subscription, or network dependency during transcription.\n\n## Usage\n\nThe program is a toggle\n\n```bash\nasryx\n```\n\nThe first invocation starts capture.\n\nYou talk for as long as you want.\n\n```bash\nasryx\n```\n\nThe next invocation stops capture, transcribes locally, copies the transcript, notifies the session, and cleans the runtime directory.\n\n> [!TIP]\n> This toggle can be hooked to Sway, Hyprland, i3, GNOME, etc.\n\nAnd a very simple [CLI](#cli)\n\n```\nasryx                           # Toggle record\u002Ftranscribe\nasryx status                    # Check idle\u002Frecording\u002Ftranscribing\nasryx --language \u003Cauto|CODE>    # Set language\nasryx --model list              # List supported models\nasryx --model install \u003CMODEL>   # Download model\nasryx --model use \u003CMODEL>       # Switch model\n```\n\n## Mechanism\n\nAudio capture orchestration, runtime state, model management, clipboard delivery, notification dispatch, cleanup, and failure recovery are all owned by the binary.\n\nThe audio path is native code. Captured audio is validated as RIFF\u002FWAVE, walked chunk by chunk, checked for 16 kHz mono signed 16-bit PCM, and decoded from PCM16 into float samples before inference.\n\nDependency free as in, not even a WAV library sits between the recorder output and the model input.\n\nDependencies are ones you already have, only needed to compile the program, pipe audio to your audio server, and emit notifications, that's it.\n\nThe recorder is launched as a native Linux process, tracked through its PID, stopped by signal, and verified to have exited before transcription begins.\n\nAn atomic lock directory guards the runtime. Directory creation is the mutex primitive, and ownership is tracked through live PIDs.\n\nStale sessions are recovered automatically, and repeated invocations coalesce into a single active operation, so key repeats, compositor double fires, interrupted sessions, and abandoned runtime artifacts resolve safely before a new recording begins.\n\n**Runtime model:**\n\n```text\npress\n  -> acquire lock\n  -> start local recorder\n  -> write recorder pid\n  -> mark state as recording\n  -> notify\n\npress again\n  -> acquire lock\n  -> stop recorder\n  -> mark state as transcribing\n  -> parse RIFF\u002FWAVE\n  -> validate format chunk\n  -> locate data chunk\n  -> decode PCM16 into float samples\n  -> run whisper.cpp inference in-process\n  -> trim transcript\n  -> write transcript to clipboard\n  -> notify\n  -> remove runtime files\n  -> release lock\n```\n\nAudio capture prefers PipeWire:\n\n```text\npw-record\n```\n\nALSA is used as fallback:\n\n```text\narecord\n```\n\nCaptured audio is written as a temporary WAV file:\n\n```text\nmono\n16 kHz\nsigned 16-bit\n```\n\nClipboard backends:\n\n```text\nwl-copy                     # Wayland\nxclip -selection clipboard  # X11 fallback\n```\n\nNotifications:\n\n```text\nnotify-send\n```\n\nWhenever the event is emmited, `notify-send` pipes it to Mako, Dunst, or any active desktop notification daemon to render it.\n\n**Runtime state:**\n\n```text\n$XDG_RUNTIME_DIR\u002Fasryx\n```\n\nIf `$XDG_RUNTIME_DIR` is unavailable, falls back to:\n\n```text\n\u002Ftmp\u002Fasryx-$UID\n```\n\n**Runtime files:**\n\n```text\nlock\u002F\nrec.pid\nrec.wav\nrec.err\nstate\n```\n\nAfter a completed transcription, runtime files are removed. The transcript survives only through the clipboard.\n\n## Installation\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Frccyx\u002Fasryx\ncd asryx && bash .\u002Fscripts\u002Finstall\n```\n\nThe installer validates the user environment, checks required tools, clones the pinned source, builds the binary locally, installs the executable, writes the version pin, writes the default config, installs the default model, selects it, and prints a PATH note when `~\u002F.local\u002Fbin` is unavailable from the current shell.\n\nInstalled paths:\n\n```text\n~\u002F.local\u002Fbin\u002Fasryx\n~\u002F.local\u002Fopt\u002Fwhisper.cpp\n~\u002F.local\u002Fshare\u002Fasryx\u002F\n~\u002F.local\u002Fshare\u002Fasryx\u002Fversions\u002Fwhisper-cpp-sha\n~\u002F.asryx.conf\n```\n\nDefault model:\n\n```text\nbase.en\n```\n\nModel downloads pull from [Hugging Face.](https:\u002F\u002Fhuggingface.co\u002Fggerganov\u002Fwhisper.cpp)\n\nAfter installation:\n\n```bash\nasryx status\n```\n\nExpected output:\n\n```text\nidle\n```\n\n`asryx status` prints one of:\n\n```text\nidle\nrecording\ntranscribing\n```\n\n> [!TIP]\n> This output can be used for status surfaces such as Waybar and Polybar.\n\n## Dependencies\n\nYou probably have most of these already, but check.\n\nBuild:\n\n```text\nbash\ngit\ncurl\ncmake\nninja\ng++ or clang++\n```\n\nRuntime depends on your machine. For audio, check what you have:\n\n```bash\nwhich pw-record || which arecord\n```\n\nPipeWire systems have `pw-record`, ALSA systems have `arecord`. If you have neither, install `pipewire` or `alsa-utils` through your package manager.\n\nFor clipboard, it depends on your session. Hyprland, Sway, and any other Wayland compositor need `wl-clipboard`. X11 needs `xclip`. If you're not sure which you're on:\n\n```bash\necho \"$XDG_SESSION_TYPE\"\n```\n\nDesktop notifications require an active notification daemon such as Mako, Dunst, or the session's native notification service.\n\n## Keybind\n\nThe binary takes no arguments to toggle, so bind it to a key in the active compositor or desktop environment.\n\nHyprland:\n\n```ini\nbind = ALT, W, exec, asryx\n```\n\nSway \u002F i3:\n\n```ini\nbindsym $mod+w exec asryx\n```\n\nGNOME:\n\n```text\nSettings > Keyboard > Custom Shortcuts\ncommand: asryx\n```\n\nKDE Plasma:\n\n```text\nSystem Settings > Shortcuts > Custom Shortcuts\ncommand: asryx\n```\n\n> [!TIP]\n> A clipboard manager is highly recommended for long recordings. In case you copy something else by mistake after the transcription is emitted.\n\n## CLI\n\nThe full surface area:\n\n```text\nasryx\nasryx status\nasryx --language \u003Cauto|CODE>\nasryx --model list\nasryx --model install \u003CMODEL>\nasryx --model use \u003CMODEL>\nasryx --model uninstall \u003CMODEL>\n```\n\nList supported models:\n\n```bash\nasryx --model list\n```\n\nInstall a model:\n\n```bash\nasryx --model install small.en\n```\n\nSelect a model:\n\n```bash\nasryx --model use small.en\n```\n\nRemove a model:\n\n```bash\nasryx --model uninstall small.en\n```\n\nSet transcription language:\n\n```bash\nasryx --language auto\nasryx --language en\nasryx --language de\n```\n\n## Models\n\nSupported models:\n\n```text\ntiny.en\ntiny\nbase.en\nbase\nsmall.en\nsmall\nmedium.en\nmedium\nlarge-v1\nlarge-v2\nlarge-v3\nlarge-v3-turbo\nlarge\n```\n\n| Model              | Disk    | RAM     | Speed vs large |\n| ------------------ | ------- | ------- | -------------- |\n| tiny \u002F tiny.en     | 75 MiB  | ~273 MB | ~10x           |\n| base \u002F base.en     | 142 MiB | ~388 MB | ~7x            |\n| small \u002F small.en   | 466 MiB | ~852 MB | ~4x            |\n| medium \u002F medium.en | 1.5 GiB | ~2.1 GB | ~2x            |\n| large-v3-turbo     | 1.5 GiB | ~2.3 GB | ~8x            |\n| large-v1 \u002F v2 \u002F v3 | 2.9 GiB | ~3.9 GB | 1x             |\n\nSpeed is relative to large on CPU.\n\n`base.en` is the default. It starts quickly and covers the default English offline transcription path.\n\nInstalled models live under:\n\n```text\n~\u002F.local\u002Fshare\u002Fasryx\u002F\n```\n\nExample:\n\n```text\n~\u002F.local\u002Fshare\u002Fasryx\u002Fggml-base.en.bin\n```\n\n## Configuration\n\nConfiguration is stored in `~\u002F.asryx.conf`.\n\n**Model**\n\n`model` selects the active model. Switching via CLI updates the config instantly:\n\n```bash\nasryx --model use small.en\n```\n\n**Language**\n\n`language` controls transcription language. `auto` detects the language first, which adds a small amount of latency. Locking to a code skips detection entirely.\n\n```bash\nasryx --language es\nasryx --language auto\n```\n\nEnglish only models (`tiny.en`, `base.en`, `small.en`, `medium.en`) only accept `en` or `auto`. Multilingual models accept any of the 99 supported language codes.\n\n> [!NOTE]\n> Language support and transcription quality are a property of the [GGML model weights](https:\u002F\u002Fgithub.com\u002Fggerganov\u002Fwhisper.cpp\u002Fblob\u002Fd682e150908e10caa4c15883c633d7902d685237\u002Fsrc\u002Fwhisper.cpp#L248).\n\nInvalid model and language values are rejected before recording starts.\n\nManual edits to the config file are also valid:\n\n```text\nmodel=base\nlanguage=de\n```\n\n\u003Cdetails>\n\u003Csummary>\u003Cstrong>Supported language codes\u003C\u002Fstrong>\u003C\u002Fsummary>\n\n\u003Cbr\u002F>\n\n| Code | Language       |\n| ---- | -------------- |\n| en   | english        |\n| zh   | chinese        |\n| de   | german         |\n| es   | spanish        |\n| ru   | russian        |\n| ko   | korean         |\n| fr   | french         |\n| ja   | japanese       |\n| pt   | portuguese     |\n| tr   | turkish        |\n| pl   | polish         |\n| ca   | catalan        |\n| nl   | dutch          |\n| ar   | arabic         |\n| sv   | swedish        |\n| it   | italian        |\n| id   | indonesian     |\n| hi   | hindi          |\n| fi   | finnish        |\n| vi   | vietnamese     |\n| he   | hebrew         |\n| uk   | ukrainian      |\n| el   | greek          |\n| ms   | malay          |\n| cs   | czech          |\n| ro   | romanian       |\n| da   | danish         |\n| hu   | hungarian      |\n| ta   | tamil          |\n| no   | norwegian      |\n| th   | thai           |\n| ur   | urdu           |\n| hr   | croatian       |\n| bg   | bulgarian      |\n| lt   | lithuanian     |\n| la   | latin          |\n| mi   | maori          |\n| ml   | malayalam      |\n| cy   | welsh          |\n| sk   | slovak         |\n| te   | telugu         |\n| fa   | persian        |\n| lv   | latvian        |\n| bn   | bengali        |\n| sr   | serbian        |\n| az   | azerbaijani    |\n| sl   | slovenian      |\n| kn   | kannada        |\n| et   | estonian       |\n| mk   | macedonian     |\n| br   | breton         |\n| eu   | basque         |\n| is   | icelandic      |\n| hy   | armenian       |\n| ne   | nepali         |\n| mn   | mongolian      |\n| bs   | bosnian        |\n| kk   | kazakh         |\n| sq   | albanian       |\n| sw   | swahili        |\n| gl   | galician       |\n| mr   | marathi        |\n| pa   | punjabi        |\n| si   | sinhala        |\n| km   | khmer          |\n| sn   | shona          |\n| yo   | yoruba         |\n| so   | somali         |\n| af   | afrikaans      |\n| oc   | occitan        |\n| ka   | georgian       |\n| be   | belarusian     |\n| tg   | tajik          |\n| sd   | sindhi         |\n| gu   | gujarati       |\n| am   | amharic        |\n| yi   | yiddish        |\n| lo   | lao            |\n| uz   | uzbek          |\n| fo   | faroese        |\n| ht   | haitian creole |\n| ps   | pashto         |\n| tk   | turkmen        |\n| nn   | nynorsk        |\n| mt   | maltese        |\n| sa   | sanskrit       |\n| lb   | luxembourgish  |\n| my   | myanmar        |\n| bo   | tibetan        |\n| tl   | tagalog        |\n| mg   | malagasy       |\n| as   | assamese       |\n| tt   | tatar          |\n| haw  | hawaiian       |\n| ln   | lingala        |\n| ha   | hausa          |\n| ba   | bashkir        |\n| jw   | javanese       |\n| su   | sundanese      |\n| yue  | cantonese      |\n\n\u003C\u002Fdetails>\n\n## Uninstallation\n\n```bash\n.\u002Fscripts\u002Funinstall\n```\n\nRemoves owned files and leaves shared system packages untouched.\n\nRemoved paths:\n\n```text\n~\u002F.local\u002Fbin\u002Fasryx\n~\u002F.local\u002Fopt\u002Fwhisper.cpp\n~\u002F.local\u002Fshare\u002Fasryx\n~\u002F.cache\u002Fasryx\n~\u002F.asryx.conf\n$XDG_RUNTIME_DIR\u002Fasryx\n```\n\n> [!NOTE]\n> Deletion goes through owned [path validation](\u002Fsrc\u002Fplatform\u002Ffs.cpp) before files or directories are even removed.\n\n## License\n\nApache-2.0 © @rccyx\n","2026-06-11 04:10:57","CREATED_QUERY"]