{"id":29328776,"url":"https://github.com/supermarsx/automidi","last_synced_at":"2026-05-08T15:32:43.654Z","repository":{"id":303223784,"uuid":"1014775716","full_name":"supermarsx/automidi","owner":"supermarsx","description":"An automation interface for MIDI devices with SysEx support","archived":false,"fork":false,"pushed_at":"2025-07-06T13:19:39.000Z","size":93,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-06T13:21:46.890Z","etag":null,"topics":["automation","launchpad-x","macros","midi","node","react","scripting","sysex","typescript"],"latest_commit_sha":null,"homepage":"","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/supermarsx.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.md","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-07-06T11:50:34.000Z","updated_at":"2025-07-06T13:19:43.000Z","dependencies_parsed_at":"2025-07-06T13:21:52.924Z","dependency_job_id":"a862a36c-644e-4aa2-8876-425af8e97b2d","html_url":"https://github.com/supermarsx/automidi","commit_stats":null,"previous_names":["supermarsx/automidi"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/supermarsx/automidi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supermarsx%2Fautomidi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supermarsx%2Fautomidi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supermarsx%2Fautomidi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supermarsx%2Fautomidi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/supermarsx","download_url":"https://codeload.github.com/supermarsx/automidi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/supermarsx%2Fautomidi/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264155086,"owners_count":23565302,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["automation","launchpad-x","macros","midi","node","react","scripting","sysex","typescript"],"created_at":"2025-07-07T22:37:06.414Z","updated_at":"2026-05-08T15:32:43.649Z","avatar_url":"https://github.com/supermarsx.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![image](https://github.com/user-attachments/assets/010b9f3d-9d22-4e4c-b033-274f3ef24bd2)\n\n# automidi\n\n**automidi** is a MIDI control application that provides a comprehensive interface for\ncontrolling MIDI devices, with special support for the Novation Launchpad X. When a \nLaunchpad X is detected, the app automatically switches the controller into _Programmer_ \nmode so that every pad can be addressed individually.\n\n## 🎯 Dual Architecture\n\nAutoMIDI supports two runtime modes:\n\n### 🖥️ Native Desktop App (Tauri)\n- **Recommended for production use**\n- Native performance with Rust backend\n- Direct MIDI hardware access (lower latency)\n- Persistent storage with Tauri Store\n- OS notifications and system integration\n- Cross-platform: Windows, macOS, Linux\n\n**Quick start:**\n```bash\nnpm install\nnpm run dev:tauri\n```\n\nSee [TAURI_QUICKSTART.md](./TAURI_QUICKSTART.md) for detailed setup.\n\n### 🌐 Web App (Vite + Node.js)\n- Great for development and testing\n- Browser-based with WebSocket communication\n- WebMIDI API for MIDI access\n- Node.js server for system integration\n\n**Quick start:**\n```bash\nnpm install\nnpm run dev\n```\n\n## 📚 Documentation\n\n- **[TAURI_QUICKSTART.md](./TAURI_QUICKSTART.md)** - Get started with Tauri development\n- **[TAURI_MIGRATION.md](./TAURI_MIGRATION.md)** - Architecture and implementation details\n- **[TODO_TAURI_NEXT16.md](./TODO_TAURI_NEXT16.md)** - Migration progress checklist\n- **[SPEC.md](./SPEC.md)** - Feature specifications\n- **[agents.md](./agents.md)** - Development workflow\n\n## 🚀 Quick Start\n\n### Prerequisites\n\n**For Tauri (Desktop):**\n- [Rust](https://rustup.rs/) (latest stable)\n- Node.js 18+ and npm\n- Platform-specific dependencies (see [TAURI_QUICKSTART.md](./TAURI_QUICKSTART.md))\n\n**For Web Mode:**\n- Node.js 18+ and npm\n\n### Installation\n\n```bash\n# Clone the repository\ngit clone \u003crepository-url\u003e\ncd automidi\n\n# Install dependencies\nnpm install\n\n# Copy environment config\ncp .env.example .env\n```\n\n### Running\n\n**Desktop App (Tauri):**\n```bash\nnpm run dev:tauri\n```\n\n**Web App:**\n```bash\nnpm run dev\n```\n\nVisit http://localhost:5173 in your browser (web mode only).\n\n## Setup\n\nInstall dependencies before running any lint or build steps:\n\n```bash\nnpm run setup\n```\n\nThis script simply runs `npm install` to fetch all project packages.\n\n---\n\n## Node server (Web Mode Only)\n\nThe project ships with a small Node server that exposes MIDI devices to the\nbrowser. It must be running for the React frontend to communicate with your\nhardware in web mode.\n\nStart it with:\n\n```bash\nnpm run server\n```\n\nIt listens on port `3000` and exposes REST endpoints for compatibility and\nmonitoring:\n\n- `GET /midi/devices` – lists available MIDI inputs and outputs\n- `POST /midi/send` – sends a raw MIDI message to a specified output\n- `GET /health` – returns `{ ok: true }` for health checks\n\n  A WebSocket on the same port handles the communication used by the frontend.\n  When a client connects it sends the current device list and it pushes `devices`\n  events whenever ports change. Incoming MIDI messages are forwarded as `midi`\n  events so the UI can react in real time. Device listings, outgoing MIDI messages\n  and automation commands are all transmitted over this socket as implemented in\n  `useMidiConnection.ts` and `useKeyMacroPlayer.ts`.\n\n  The frontend's **Settings** panel controls reconnection behavior. Setting\n  _Max reconnect attempts_ to `0` or a negative value removes the limit and the\n  client will continue retrying indefinitely.\n\n### API key\n\nBy default the server accepts requests without authentication. Set the\n`API_KEY` environment variable to require a matching key on all requests,\nincluding WebSocket connections. When `LOG_API_KEY=true` the server prints the\nactive key to the console. Configure the frontend in the **Settings** panel so\nthe `API key` field matches this value, otherwise the connection will be\nrejected with a `401` response.\n\n### Shell command security\n\nThe server exposes endpoints that can execute local shell commands. To avoid\naccidental or malicious use these routes now validate commands against a\nwhitelist defined in the `ALLOWED_CMDS` environment variable. Commands that do\nnot match the whitelist or contain characters commonly used for injection are\nrejected with a `403` response.\n\nExample:\n\n```bash\nALLOWED_CMDS=\"ffmpeg,ls\" npm run server\n```\n\nOnly `ffmpeg` and `ls` will be accepted by `/run/shell*` routes. Review your\nallowed commands carefully as running arbitrary processes can compromise your\nsystem.\n\n### MIDI logging\n\nBy default the server keeps MIDI logging quiet. Run `npm run dev:log-midi` to\nstart both servers with detailed logging. This script uses `cross-env` to set\nthe `LOG_MIDI` environment variable so incoming and outgoing MIDI messages and\ndevice events are printed to the console.\n\n---\n\n## Development workflow\n\n1. Install dependencies with `npm install`.\n2. Start the development servers with `npm run dev`. This launches both the backend and Vite dev server concurrently.\n3. Visit \u003chttp://localhost:5173\u003e and start playing with your MIDI gear.\n\nFor a production build run `npm run build`. The output is placed in `dist/` and\ncan be previewed locally using `npm run preview`.\n\n---\n\n## Launchpad X features\n\n- The **LaunchpadCanvas** component mirrors the Launchpad X layout allowing you\n  to set pad colours via colour pickers. Pad changes are sent as note or CC\n  messages.\n- When a Launchpad X is connected the app sends the required SysEx to enter\n  Programmer mode automatically.\n- Top and side pads are mapped to CC numbers while the main grid is mapped to\n  notes, letting you experiment with lighting and macros.\n  Color modes are chosen independently via the MIDI channel:\n  - **Channel 1** (`0x90`/`0xB0`) for static colours\n  - **Channel 2** (`0x91`/`0xB1`) for flashing colours\n  - **Channel 3** (`0x92`/`0xB2`) for pulsing colours\n  - Each pad's side panel now offers colour pickers for **STATIC**, **FLASH**\n    and **PULSE** modes. Selecting a mode button sends the chosen colour on the\n    corresponding channel so modes can be mixed across the grid.\n\n---\n\n## MIDI macros\n\nRecorded or hand written macros can be managed from the **Macros** panel.\nMessages and timing are persisted in IndexedDB using Zustand. The\n**MacroEditor** offers a simple timeline view or raw JSON editing. Macros can be\nplayed back with optional looping and tempo control.\n\nThe **Sysex Workbench** helper builds Launchpad SysEx messages and is handy for\ntesting device specific commands.\n\n---\n\n## Useful scripts\n\n- `npm run dev` – start both the backend and Vite dev server\n- `npm run dev:log-midi` – start the dev servers with MIDI logging enabled\n- `npm run setup` – install all dependencies\n- `npm run build` – build the React application for production\n- `npm run preview` – preview the production build locally\n- `npm run lint` – run ESLint\n- `npm run format` – run Prettier\n- `npm run server` – start only the MIDI backend\n- `npm test` – compile the server then run all tests with Vitest\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsupermarsx%2Fautomidi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsupermarsx%2Fautomidi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsupermarsx%2Fautomidi/lists"}