{"id":50960480,"url":"https://github.com/axide-dev/axidev-io-js","last_synced_at":"2026-06-18T13:02:23.015Z","repository":{"id":352836928,"uuid":"1216331179","full_name":"axide-dev/axidev-io-js","owner":"axide-dev","description":"Node/Electron wrapper around the native axidev-io library","archived":false,"fork":false,"pushed_at":"2026-04-21T10:22:20.000Z","size":214,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-21T11:38:01.471Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/axide-dev.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":"2026-04-20T19:53:35.000Z","updated_at":"2026-04-21T10:31:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/axide-dev/axidev-io-js","commit_stats":null,"previous_names":["axide-dev/axidev-io-js"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/axide-dev/axidev-io-js","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axide-dev%2Faxidev-io-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axide-dev%2Faxidev-io-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axide-dev%2Faxidev-io-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axide-dev%2Faxidev-io-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/axide-dev","download_url":"https://codeload.github.com/axide-dev/axidev-io-js/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axide-dev%2Faxidev-io-js/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34491239,"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-18T02:00:06.871Z","response_time":128,"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":[],"created_at":"2026-06-18T13:02:22.040Z","updated_at":"2026-06-18T13:02:23.004Z","avatar_url":"https://github.com/axide-dev.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# @axidev/io\n\n`@axidev/io` is a Node/Electron main-process package for keyboard automation and keyboard event listening.\n\nIt wraps the native `axidev-io` library and exposes a small JS API centered around `keyboard`, `keyboard.sender`, `keyboard.listener`, and `keyboard.keys`.\n\nSupports ESM. CommonJS is also available.\n\n## Install\n\n```sh\nnpm install @axidev/io\n```\n\nThe published package ships compiled JavaScript from `dist/` and packaged native addon binaries from `prebuilds/\u003cplatform\u003e-\u003carch\u003e/`.\nEnd users should not need a local C/C++ build toolchain when a matching prebuilt is present.\n\nImportant native docs are shipped in the package as well:\n\n- `vendor/axidev-io/docs/consumers/README.md`\n- `vendor/axidev-io/README.md`\n- `vendor/axidev-io/LICENSE`\n- `vendor/axidev-io/vendor/licenses/*`\n\n## Platform Notes\n\nSupported platforms:\n\n- Linux\n- Windows\n\nThis package is meant for Node.js and Electron main-process usage. It is not intended for browser code or Electron renderer code.\n\n## System Requirements\n\n### Windows\n\nRuntime notes:\n\n- uses the packaged prebuilt `axidev_io.node`\n- no local compiler toolchain is required for normal npm installs\n\n### Linux\n\nRuntime requirements:\n\n- the packaged prebuilt `axidev_io.node`\n- system shared libraries for `libinput`, `libudev`, and `xkbcommon`\n- access to `/dev/uinput` for key injection\n- access to the relevant `/dev/input/event*` devices for listening\n\nOn Linux, those backend dependencies are intentionally expected from the system and must remain dynamically linked.\n`keyboard.setupPermissions()` can help set up the required `uinput` access.\nFor the full native runtime/compliance guidance, read `vendor/axidev-io/docs/consumers/README.md` in the installed package.\n\n## Simple Example\n\n```js\nimport { keyboard } from \"@axidev/io\";\n\nconst permissions = keyboard.setupPermissions();\n\nif (permissions.requiresLogout) {\n  console.log(\"Log out and back in, then run again.\");\n  process.exit(0);\n}\n\nkeyboard.initialize({ keyDelayUs: 2000 });\n\nkeyboard.sender.text(\"Hello from @axidev/io\");\nkeyboard.sender.tap(\"Ctrl+Shift+P\");\n\nconst stop = keyboard.listener.start((event) =\u003e {\n  console.log(event.combo, event.pressed, event.text);\n});\n\nsetTimeout(() =\u003e {\n  stop();\n  keyboard.shutdown();\n}, 5000);\n```\n\n## API Shape\n\nMain entrypoints:\n\n- `keyboard.initialize(options?)`\n- `keyboard.shutdown()`\n- `keyboard.setupPermissions()`\n- `keyboard.status()`\n- `keyboard.version()`\n\nSender methods:\n\n- `keyboard.sender.tap(input, mods?)`\n- `keyboard.sender.keyDown(input, mods?)`\n- `keyboard.sender.keyUp(input, mods?)`\n- `keyboard.sender.text(text)`\n- `keyboard.sender.typeCharacter(input)`\n- `keyboard.sender.holdModifiers(mods)`\n- `keyboard.sender.releaseModifiers(mods)`\n- `keyboard.sender.releaseAllModifiers()`\n- `keyboard.sender.flush()`\n\nListener methods:\n\n- `keyboard.listener.start(callback)`\n- `keyboard.listener.stop()`\n\nKey helpers:\n\n- `keyboard.keys.parse(name)`\n- `keyboard.keys.format(key)`\n- `keyboard.keys.parseCombo(text)`\n- `keyboard.keys.formatCombo(input, mods?)`\n- `keyboard.keys.modifiers.resolve(mods)`\n- `keyboard.keys.modifiers.toNames(mask)`\n\n## Listener Events\n\nListener callbacks receive objects shaped like:\n\n```ts\ntype KeyEvent = {\n  codepoint: number;\n  text: string | null;\n  key: number;\n  keyName: string | null;\n  mods: number;\n  modifiers: string[];\n  combo: string | null;\n  pressed: boolean;\n};\n```\n\n## Initialization\n\nCall `keyboard.initialize()` before using:\n\n- `keyboard.sender.*`\n- `keyboard.listener.start(...)`\n\nKey parsing and formatting helpers under `keyboard.keys` can be used without initialization.\n\n## Development\n\nUseful scripts:\n\n- `npm run build`\n- `npm run build:native`\n- `npm run stage:prebuilt`\n- `npm run build:release`\n- `npm run smoke`\n- `npm run test:consumer:esm`\n- `npm test`\n- `npm run typecheck`\n- `npm run sync:upstream`\n\nThere is also a tracked local consumer fixture in `test-package/`.\nIt is an ESM package that installs the generated local npm tarball and sends a simple `Hello world` text payload to the currently focused window.\nIt is kept in the repository for manual testing, but it is not included in the published npm package.\n\n## CI And Release\n\nGitHub Actions CI runs on:\n\n- pushes to `main`\n- pull requests targeting `main`\n\nThe CI matrix builds and verifies:\n\n- `linux-x64`\n- `win32-x64`\n\nThe release publish workflow runs when a GitHub Release is published.\nIt rejects releases whose tag is not based on the `release` branch, builds the native prebuilds on Linux and Windows, assembles them into one npm package, and publishes `@axidev/io` as a public package.\n\nRecommended release flow:\n\n1. Merge release-ready changes into `release`\n2. Bump `package.json` version on `release`\n3. Create a Git tag from `release`\n4. Publish a GitHub Release for that tag\n\nMaintainers should use the dedicated runbook in `docs/maintainers/releasing.md` for the exact `main` -\u003e `release` promotion and publishing steps.\n\nRequired GitHub Actions secret:\n\n- `NPM_TOKEN`: an npm token that can publish the public `@axidev/io` package under the `axidev` organization on npm\n\nNo extra GitHub PAT is required for publishing.\nThe workflow uses GitHub's built-in `GITHUB_TOKEN` for repository access and OIDC provenance via `id-token: write`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxide-dev%2Faxidev-io-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faxide-dev%2Faxidev-io-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxide-dev%2Faxidev-io-js/lists"}