{"id":13911120,"url":"https://github.com/tuneflow/tuneflow","last_synced_at":"2026-02-26T12:37:16.728Z","repository":{"id":60968303,"uuid":"527759074","full_name":"tuneflow/tuneflow","owner":"tuneflow","description":"🧠+🎧 Build your music algorithms and AI models with the next-gen DAW 🔥","archived":false,"fork":false,"pushed_at":"2023-06-06T20:43:21.000Z","size":3541,"stargazers_count":195,"open_issues_count":5,"forks_count":34,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-10-08T22:09:59.708Z","etag":null,"topics":["ai","computer-music","daw","music","music-arrangements","music-composition","music-programming","plugin","sdk","tuneflow"],"latest_commit_sha":null,"homepage":"https://www.tuneflow.com","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/tuneflow.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}},"created_at":"2022-08-22T23:05:08.000Z","updated_at":"2025-10-04T15:42:59.000Z","dependencies_parsed_at":"2024-06-19T14:58:31.058Z","dependency_job_id":"96b67730-7934-4799-8386-95d760db40ad","html_url":"https://github.com/tuneflow/tuneflow","commit_stats":{"total_commits":307,"total_committers":5,"mean_commits":61.4,"dds":"0.37785016286644946","last_synced_commit":"5c1c184b090f0b9c945899c6641cea0aa46a1172"},"previous_names":["andantei/tuneflow"],"tags_count":131,"template":false,"template_full_name":null,"purl":"pkg:github/tuneflow/tuneflow","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuneflow%2Ftuneflow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuneflow%2Ftuneflow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuneflow%2Ftuneflow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuneflow%2Ftuneflow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tuneflow","download_url":"https://codeload.github.com/tuneflow/tuneflow/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tuneflow%2Ftuneflow/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29859083,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T08:51:08.701Z","status":"ssl_error","status_checked_at":"2026-02-26T08:50:19.607Z","response_time":89,"last_error":"SSL_read: 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":["ai","computer-music","daw","music","music-arrangements","music-composition","music-programming","plugin","sdk","tuneflow"],"created_at":"2024-08-07T00:01:58.282Z","updated_at":"2026-02-26T12:37:16.705Z","avatar_url":"https://github.com/tuneflow.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# TuneFlow Typescript SDK\n\n[English](./README.md) | [中文](./README.zh.md)\n\n![TuneFlow Screenshots](docs/images/tuneflow_wall_thin.jpg)\n\n[![Build Status](https://dev.azure.com/zeostudio/tuneflow-public/_apis/build/status/tuneflow.tuneflow?branchName=master)](https://dev.azure.com/zeostudio/tuneflow-public/_build/latest?definitionId=33\u0026branchName=master)\n[![Code Coverage](https://img.shields.io/azure-devops/coverage/zeostudio/tuneflow-public/33/master?logo=azure-pipelines)](https://dev.azure.com/zeostudio/tuneflow-public/_build/latest?definitionId=33\u0026branchName=master)\n[![npm](https://img.shields.io/npm/v/tuneflow?logo=npm)](https://www.npmjs.com/package/tuneflow)\n[![Discord](https://img.shields.io/discord/1076012137161424906?color=%237289da\u0026logo=discord)](https://discord.com/channels/1076012137161424906/1076012755250851860)\n![License](https://img.shields.io/github/license/tuneflow/tuneflow-py)\n\n## What is `TuneFlow`?\n\n[TuneFlow](https://www.tuneflow.com) is a next-gen DAW that aims to boost music making productivity through the power of AI. Unlike traditional DAWs, TuneFlow has a plugin system designed to facilitate music production in almost all areas, including but not limited to **song writing**, **arrangement**, **automation**, **mixing**, **transcription**...... You can easily write your own algorithms or integrate your AI models directly into the song-making process. `tuneflow` is the Typescript SDK of TuneFlow plugins.\n\n## Installation\n\n``` bash\nnpm install tuneflow\n```\n\n## Prefer another language?\n\nCheck out the SDKs in other languages:\n\n* **Python**: https://www.github.com/tuneflow/tuneflow-py\n* Other: Contributions welcome!\n\n## Getting started\n\nThe core idea of TuneFlow's plugin system is that you only care about the data model, NOT the implementation. A plugin's only goal is to modify the song to its need, and the DAW will get the modified result and apply the changes automatically. Below is an illustration:\n\n![Plugin Flow](docs/images/pipeline_flow_en.jpg)\n\nA plugin bundle consists of 3 components: The bundle file, the plugin files, and the bundle export.\n\n\n\n### Bundle file (`bundle.json`)\n\nThe bundle file, which we usually name it `bundle.json`, contains the information of the plugins in this bundle.  The information here will be shown to the users before they need to load the code of your plugin.\n\nAn example manifest file looks like this.\n\n``` json\n{\n  \"plugins\": [\n    ......,\n    {\n      \"providerId\": \"my-provider-id\",\n      \"providerDisplayName\": \"My Provider Name\",\n      \"pluginId\": \"my-plugin-id\",\n      \"pluginDisplayName\": \"My Plugin Name\",\n      \"version\": \"1.0.0\",\n      \"minRequiredDesktopVersion\": \"1.8.3\",\n      \"options\": {\n        \"allowReset\": false\n      }\n    },\n    ......\n  ]\n}\n```\n\n### Plugin code\n\nThis is will be your actual code file. A barebone plugin, for example `hello_world_plugin.ts`, may look like this:\n\n``` typescript\n// hello_world_plugin.ts\n\nimport type { LabelText, ParamDescriptor, SliderWidgetConfig, Song } from 'tuneflow';\nimport { TuneflowPlugin, WidgetType } from 'tuneflow';\n\nexport class HelloWorld extends TuneflowPlugin {\n  static providerId(): string {\n    return 'my-provider-id';\n  }\n\n  static pluginId(): string {\n    return 'my-plugin-id';\n  }\n\n  params(): { [paramName: string]: ParamDescriptor } {\n    return {\n      ......\n    };\n  }\n\n  async init(song: Song, readApis: ReadAPIs): Promise\u003cvoid\u003e {\n    ......\n  }\n\n  async run(song: Song, params: { [paramName: string]: any }): Promise\u003cvoid\u003e {\n    ......\n  }\n}\n\n```\n\nFirst you'll need to overwrite the `providerId()` and `pluginId()` methods to match what you specified in the manifest file. When loading the plugins, TuneFlow looks for the two ids to match the bundle file with each plugin source code.\n\n### Bundle export\n\nFinally, in order for TuneFlow to execute your code, you need to export all of your plugins in this bundle into one file, and use build tools to build it into a javascript file for distribution. Here we need to create an index file to export all of your plugins in this bundle. Here for example, we can create an `index.ts` file which looks like this:\n\n``` typescript\n// index.ts\n\nexport { HelloWorld } from './hello_world_plugin';\nexport { SomeOtherPlugin } from './some_other_plugin';\n......\n```\n\n## Writing a plugin\n\nWhen writing a plugin, our main focus is in `params`, `init` and `run`.\n\n### `params`\n\nThis is where you specify the input parameters you want from the user or from the DAW. It will be processed by the DAW and generate your plugin's UI widgets.\n\n### `init`\n\nCalled by the DAW when the user loads the plugin but before actually running it. The DAW will provide the current song snapshot (`song: Song`) and some read-only APIs (`readApis: ReadAPIs`), and you will take these params to initialize your plugin.\n\nFor example, if you have a list of presets that applies to different time signatures, you can use `init` to read the current song's time signature and filter out those options that don't work for the song.\n\n### `run`\n\nCalled by the DAW when the user actually runs the plugin by hitting the **Apply`** button.\n\nHere is where you implement your main logic. The method takes in the current song snapshot (`song: Song`), the params that are actually provided by the user or the DAW (`params`), and the read-only APIs (`readApis: ReadAPIs`).\n\n## Run your plugin\n\nTo run or debug your plugin, your can use `tuneflow-devkit`. For more information on plugin development, check out https://www.github.com/tuneflow/tuneflow-devkit\n\n## Examples\n\nFor a comprehensive of basic plugins that are used in TuneFlow's editor, check out https://www.github.com/tuneflow/tuneflow-plugin-basic\n\n\n## Resources\n\n[TuneFlow Website](https://tuneflow.com)\n\n[Python SDK](https://www.github.com/tuneflow/tuneflow-py)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuneflow%2Ftuneflow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftuneflow%2Ftuneflow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftuneflow%2Ftuneflow/lists"}