{"id":31203512,"url":"https://github.com/midhunterx/project-launcher","last_synced_at":"2026-05-14T20:32:11.521Z","repository":{"id":312196037,"uuid":"1046652852","full_name":"MidHunterX/Project-Launcher","owner":"MidHunterX","description":":shipit: A project launcher/runner which automatically detects the technology, initializes and sets up a complete tmux development environment","archived":false,"fork":false,"pushed_at":"2026-05-10T11:41:08.000Z","size":203,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-10T13:44:29.603Z","etag":null,"topics":["cli","cognitive-friction","developer-tools","linux","productivity","tmux"],"latest_commit_sha":null,"homepage":"","language":"Shell","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/MidHunterX.png","metadata":{"files":{"readme":"README.adoc","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-08-29T02:38:02.000Z","updated_at":"2026-05-10T11:41:13.000Z","dependencies_parsed_at":"2025-08-29T06:48:30.603Z","dependency_job_id":"0a25a6d8-17e1-40ec-8e1f-55bbf4b41756","html_url":"https://github.com/MidHunterX/Project-Launcher","commit_stats":null,"previous_names":["midhunterx/project-launcher"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MidHunterX/Project-Launcher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MidHunterX%2FProject-Launcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MidHunterX%2FProject-Launcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MidHunterX%2FProject-Launcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MidHunterX%2FProject-Launcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MidHunterX","download_url":"https://codeload.github.com/MidHunterX/Project-Launcher/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MidHunterX%2FProject-Launcher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33042138,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-13T13:14:54.681Z","status":"online","status_checked_at":"2026-05-14T02:00:06.663Z","response_time":57,"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":["cli","cognitive-friction","developer-tools","linux","productivity","tmux"],"created_at":"2025-09-20T15:39:45.599Z","updated_at":"2026-05-14T20:32:11.515Z","avatar_url":"https://github.com/MidHunterX.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"image:./.assets/project_launcher_banner.jpg[]\n\n= Project Launcher\n\nA development environment orchestrator that automatically detects your project type and sets up appropriate tmux sessions, environment variables, optional system services and other script based automations.\n\n=== Supported Technologies\n\nimage:https://img.shields.io/badge/angular-DD0031?style=for-the-badge\u0026logo=angular\u0026logoColor=white[Angular]\nimage:https://img.shields.io/badge/astal-5190cf?style=for-the-badge\u0026logo=astral\u0026logoColor=white[Astal]\nimage:https://img.shields.io/badge/django-092E20?style=for-the-badge\u0026logo=django\u0026logoColor=green[Django]\nimage:https://img.shields.io/badge/elixir-4B275F?style=for-the-badge\u0026logo=elixir\u0026logoColor=white[Elixir]\nimage:https://img.shields.io/badge/fastapi-109989?style=for-the-badge\u0026logo=fastapi\u0026logoColor=white[FastAPI]\nimage:https://img.shields.io/badge/flask-%23000.svg?style=for-the-badge\u0026logo=flask\u0026logoColor=white[Flask]\nimage:https://img.shields.io/badge/flutter-02569B?style=for-the-badge\u0026logo=flutter\u0026logoColor=white[Flutter]\nimage:https://img.shields.io/badge/go-00ADD8?style=for-the-badge\u0026logo=go\u0026logoColor=white[Go]\nimage:https://img.shields.io/badge/html5-E34F26?style=for-the-badge\u0026logo=html5\u0026logoColor=white[HTML5]\nimage:https://img.shields.io/badge/next%20js-000000?style=for-the-badge\u0026logo=nextdotjs\u0026logoColor=white[NextJs]\nimage:https://img.shields.io/badge/node%20js-339933?style=for-the-badge\u0026\u0026logo=nodedotjs\u0026logoColor=white[NodeJs]\nimage:https://img.shields.io/badge/python-FFD43B?style=for-the-badge\u0026logo=python\u0026logoColor=blue[Python]\nimage:https://img.shields.io/badge/uv-DE5FE9?style=for-the-badge\u0026logo=uv\u0026logoColor=white[uv]\nimage:https://img.shields.io/badge/react-20232A?style=for-the-badge\u0026logo=react\u0026logoColor=61DAFB[React]\nimage:https://img.shields.io/badge/rust-black?style=for-the-badge\u0026logo=rust\u0026logoColor=#E57324[Rust]\n\n.`*💡 What to Expect?*`\n[%collapsible]\n====\n[discrete]\n=== What to expect\n\n|===\n| Without run | With run\n\na| [source,bash]\n----\n\u003e cd django-project\n# Now.. what was that venv command?\n\u003e python -m venv venv\n\u003e source venv/bin/activate\n# Phew almost done\n\u003e python manage.py runserver\n# Error.. dependency not installed\n\u003e pip install -r requirements.txt\n# Finally done\n\u003e python manage.py runserver\n# Migration error dammit\n\u003e python manage.py migrate\n# Open a new terminal\n\u003e nvim\n# Now need to see output\n\u003e python manage.py runserver\n# Open up browser and go to localhost:8000\n# Done! Start working on the project.\n\n# Finished development. Now for the next\n# mono-repo project\n\u003e cd fastapi-project\n\u003e python -m venv venv\n\u003e source venv/bin/activate\n\u003e pip install -r requirements.txt\n# What was the run command again?\n\u003e fastapi dev main.py\n# Open up a new terminal\n\u003e cd nextjs-project\n\u003e npm install\n\u003e npm run dev\n# Open up browser and go to localhost:3000\n# Done! Wait.. features are not working\n# Go to fastapi-project\n# Debugging.. ahh found  new model changes\n\u003e ^C\n# Look into README for migration command\n\u003e alembic upgrade head\n# Ohh.. this project needs database server\n\u003e systemctl start postgresql\n\u003e fastapi dev main.py\n# Finally time to develop new features.\n\u003e nvim\n# Now what was I supposed to build?\n----\n\na| [source,bash]\n----\n\u003e cd django-project\n\u003e run\n# You have some pending migrations\n# Auto-applied migrations into database\n# Here's the virtual environment,\n# test cases, running server, code editor\n# and the output opened up in browser.\n# Start coding right away!\n\u003e ^c\n# You have changes in tables: [table names]\n# You might want to do this command:\n# \"suggested command\"\n# Good bye!\n\n# Add a onetime mono-repo config\n\u003e cd nextjs-project\n\u003e run\n# Start coding right away again!\n----\n|===\n====\n\n== 📦 Installation\n\nClone the repository and run the install script:\n\n[source,bash]\n----\ngit clone \"https://github.com/MidHunterX/Project-Launcher\" --depth 1\ncd Project-Launcher\nbash ./install.sh\n----\n\n=== Requirements\n\n- **Required**: `bash`, `systemctl` (for services)\n- **Optional**: `tmux` (for session management)\n- **Per-project**: Technology-specific tools (npm, pip, cargo, etc.)\n\n== 🚀 Quick Start\n\nNavigate to any project directory and run:\n\n[source,bash]\n----\nrun\n----\n\nThe runner will:\n\n1. Detect your project type automatically\n2. Install dependencies if needed\n3. Migrate database if any unapplied migrations are detected\n4. Start required services\n5. Create a tmux session with appropriate windows\n6. Launch your development server\n7. Run post-initialization commands if enabled\n8. Open server URL (if any) in browser\n9. Does a post validation and warns if models are left changed without creating migrations on exit\n\n[NOTE]\nIf TMUX is not installed, the runner will just detect project, run the\nappropriate server command and open server URL in browser.\n\n== ⚙️ Configuration Settings\n\nCreate a `.runrc` file in your project root and add following overrides for\nproject-specific customization. All settings are optional.\n\n=== Per-Project Configuration\n\n==== Minimal Configuration\n\nThe most minimal configuration is actually NO configuration at all. But, if you\nare like me who don't want PostgreSQL running in the background all the time\nand only wants it running when developing a specific project only then, your\nminimal config for that project would just be:\n\n[source,bash]\n----\nENABLED_SERVICES=(\n  postgresql\n)\n----\n\n==== Full Configuration\n\n[source,bash]\n----\n# ------------------------------------------------------------- PROJECT DETAILS\n\n# Default: project dir name\nPROJECT_NAME=\"\"\n\n# Default: automatic detection\n# Available values:\n# none | angular | astal-gtk | django | elixir | fastapi | flask | flutter\n# go | html | nextjs | nodejs | python | python-uv | reactjs | rust\nPROJECT_TYPE=\"\"\n\n# ------------------------------------------------------------- SYSTEM SERVICES\n\n# Services: add any valid systemd service names here to start\nENABLED_SERVICES=(\n  # postgresql\n  # docker\n  # nginx\n)\n\n# ------------------------------------------------------------ BROWSER SETTINGS\n\n# Default: automatic detection\n# Available values: none | {custom url}\nURL=\"\"\n\n# Default: xdg-open\n# Available values: {custom command, arguments and newtab flag at the end}\nBROWSER=\"\"\n\n# --------------------------------------------------------- BEHAVIORAL SETTINGS\n\n# Settings: [ true | false ]\nAUTORUN_COMMANDS=true\n----\n\n### Global Configuration\n\nCreate `run/config.conf` in your config directory.\n\nExample 1: Just Browser\n\n[source,bash]\n----\n# custom browser, arguments and newtab flag at the end\nBROWSER=\"firefox --new-tab\"\n----\n\nExample 2: Custom Timezone + Browser\n\n[source,bash]\n----\nBROWSER=\"TZ=Asia/Dubai firefox --new-tab\"\n----\n\nExample 3: Window Manager + Custom Timezone + Custom Browser Profile\n\n[source,bash]\n----\nBROWSER=\"hyprctl dispatch -- exec [workspace 2] TZ=Asia/Dubai firefox-developer-edition -P Personal -no-remote -new-tab\"\n----\n\nThe global configuration file sets default values for all projects.\n\n=== Per-Project Logic Overriding\n\nUse the following overrides in `.runrc` for more granular customization.\n\nThese can also be used to extend support for new technologies as well.\n\nAdd `#!/usr/bin/env bash` at the top of the file to make it play nice with LSP.\n\n[source,bash]\n----\n# ------------------------------------------------------ OVERRIDE PROJECT SETUP\n\nsetup_env_custom() {\n  # Project specific custom init setup example\n  # Syntax: setup_base_env \"env_directory\" \"command to init env_directory\"\n  setup_base_env \"node_modules/\" \"npm install --force --legacy-peer-deps\"\n}\n\n# -------------------------------------------------------- OVERRIDE TMUX LAYOUT\n\nsetup_layout_custom() {\n  # Project specific custom layout example\n  local current_dir=$(pwd)\n  local api_dir=\"../example-fastapi-project\"\n\n  # 1. Server (FastAPI)\n  cd \"$api_dir\"\n  setup_env \"python\"\n  create_window \"API Server\" \"fastapi dev main.py\"\n\n  # 2. Server (NextJS)\n  cd \"$current_dir\"\n  setup_env \"nextjs\"\n  create_window \"Web Server\" \"npm run dev\"\n\n  # 3. Editor (FastAPI)\n  cd \"$api_dir\"\n  create_window \"Editor (API)\" \"nvim\"\n  deactivate\n\n  # 4. Editor (NextJS)\n  cd \"$current_dir\"\n  create_window \"Editor (Web)\" \"nvim\"\n}\n\n# ------------------------------------------------------- CUSTOM POST INIT HOOK\n\nsetup_post_init_hook() {\n  # Project specific post execution hook example\n  # Custom browser launch logic\n  log \"🔗 Launching browser...\"\n  (\n    new_tab_url=\"http://localhost:3000\"\n\n    # Wait for the server to start\n    local timeout=20\n    while ! curl -sf \"$new_tab_url\" \u003e/dev/null; do\n      sleep 1\n      ((timeout--)) || { exit 1; }\n    done\n\n    # Launch the browser\n    firefox-developer-edition -P Personal -no-remote -new-tab $new_tab_url \u0026\n  ) \u0026\n}\n----\n\n=== Environment Variables\n\nYou can also add environment variables to `.runrc`\n\n[source,bash]\n----\nexport RUST_LOG=debug\n----\n\n=== Python Problems\n\nA python project's requirements only works with an older python version due to\nany of the dependencies not supporting newer python versions? Here's the\nsolution:\n\n[source,bash]\n----\nsetup_env_custom() {\n  setup_python_env \"venv\" \"python3.11 -m venv venv\"\n}\n----\n\nNOTE: `setup_python_env` is a special function specific to python. It allows\nyou to override commands only without changing the underlying logic for\napplying environment. This function is used by `setup_env` under the hood.\n\n=== Adding an Unknown Technology\n\nIf you want to add support for a new technology, you can support it by\nfollowing the per project overriding with `.runrc`:\n\n* Setting up dependencies\n\n[source,bash]\n----\nsetup_env_custom() {\n  # env_directory: is the directory which gets created after doing the init_command.\n  # init_command: is the command you do to initialize the project. eg: npm install\n  # eg: node_modules/ gets created after \"npm install\" -\u003e setup_base_env \"node_modules/\" \"npm install\"\n  #     venv/ gets created after \"python -m venv venv\" -\u003e setup_base_env \"venv/\" \"python -m venv venv\"\n  setup_base_env \"env_directory/\" \"init_command\"\n  # add other dependency initialization commands here\n}\n----\n\n* Setting up tmux layout\n\n[source,bash]\n----\nsetup_layout_custom() {\n  create_window \"Window 1\" \"command 1\"\n  create_window \"Window 2\" \"command 2\"\n  create_window \"Window 3\" \"command 3\"\n  # Add windows other here\n}\n----\n\n== 🐞 Known Issues\n\n* Script does cleanup routine on detaching TMUX because it thinks the project is closed.\n\n== 📜 License\n\nThis runner is distributed under the link:LICENSE[MIT License].\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmidhunterx%2Fproject-launcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmidhunterx%2Fproject-launcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmidhunterx%2Fproject-launcher/lists"}