{"id":41842919,"url":"https://github.com/kamilc/campers","last_synced_at":"2026-01-25T09:38:43.930Z","repository":{"id":329275247,"uuid":"1067739647","full_name":"kamilc/campers","owner":"kamilc","description":"Command-line tool that manages disposable remote development environments on the cloud","archived":false,"fork":false,"pushed_at":"2025-12-27T16:30:42.000Z","size":5125,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-28T22:51:56.885Z","etag":null,"topics":["aws","cli","cloud","python"],"latest_commit_sha":null,"homepage":"","language":"Python","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/kamilc.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":"2025-10-01T10:12:10.000Z","updated_at":"2025-12-27T16:29:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kamilc/campers","commit_stats":null,"previous_names":["kamilc/campers"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/kamilc/campers","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamilc%2Fcampers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamilc%2Fcampers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamilc%2Fcampers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamilc%2Fcampers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kamilc","download_url":"https://codeload.github.com/kamilc/campers/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kamilc%2Fcampers/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28750880,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-25T09:00:19.176Z","status":"ssl_error","status_checked_at":"2026-01-25T09:00:04.131Z","response_time":113,"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":["aws","cli","cloud","python"],"created_at":"2026-01-25T09:38:43.831Z","updated_at":"2026-01-25T09:38:43.917Z","avatar_url":"https://github.com/kamilc.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Campers\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/campers.png\" alt=\"Campers\" width=\"400\"\u003e\n\u003c/p\u003e\n\n\u003ch3 align=\"center\"\u003e\n  Local development experience. Remote cloud resources.\n\u003c/h3\u003e\n\nCampers is a command-line tool that manages disposable remote development environments on the cloud (currently AWS EC2). It allows you to offload heavy computation to the cloud while keeping your local development workflow intact.\n\nIt bridges the gap between your local machine and a cloud instance by handling provisioning, file synchronization, and network tunneling automatically.\n\n## How you use it\n\nThe goal of Campers is to make a remote cloud instance feel like localhost.\n\nImagine you are working on a resource-intensive project, like a large microservices stack or a deep learning model. Your local machine is struggling with heat and memory limits.\n\nWith Campers, the workflow looks like this:\n\n1.  **Configuration**: You add a `campers.yml` file to your project root. This defines the hardware you need (e.g., an instance type like `p3.2xlarge`), the setup steps, and which ports to forward.\n\n2.  **Spin Up**: You run `campers run` in your terminal.\n    In the background, Campers provisions the instance, configures it (via shell scripts or Ansible), and establishes a real-time, two-way file sync using Mutagen.\n\n3.  **Development**: You stay on your laptop.\n    *   You edit code in your local editor (VS Code, Vim, etc.). Changes are synced instantly to the cloud instance.\n    *   You run your application on the remote instance.\n    *   You access the application via `localhost` in your browser. Campers tunnels the traffic through SSH automatically.\n\n4.  **Exit Options**:\n    When you press Q or Ctrl+C, you'll be prompted to choose:\n    *   **Stop** (default): Instance is stopped but preserved. Resume later with `campers run`.\n    *   **Keep running**: Disconnect locally but keep the instance running. Ideal for demos where clients need continued access.\n    *   **Destroy**: Terminate and delete everything. You can also run `campers destroy` anytime.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"docs/assets/infographic.jpg\" alt=\"Campers Workflow Infographic\" width=\"100%\"\u003e\n\u003c/p\u003e\n\n## Use Cases\n\n**Data Science \u0026 Pipelines**\nIdeal for ad-hoc data science projects. Run resource-intensive data pipelines or train models on high-end cloud hardware.\n\nIt also solves **data residency** challenges. Many organizations strictly prohibit storing PII on developer laptops. By spinning up a camp in a compliant cloud region, you can develop against real datasets without ever downloading sensitive data to your local machine.\n\n**Isolated Environments**\nInstead of cluttering your local machine with databases and system dependencies, you can define a clean, reproducible environment for each project. If the environment breaks, you simply destroy it and create a new one.\n\n**Heavy Compilation**\nIf you are compiling large C++ or Rust projects, you can provision a high-core instance (like a `c6a.24xlarge`) for the duration of the build. You get the build speed of a workstation without maintaining the hardware.\n\n**Client Demos**\nShare running applications with clients by exposing ports publicly. Use `public_ports` to open security group rules, then select \"Keep running\" on exit so clients can continue accessing your demo while you disconnect.\n\n## Features\n\n- **Mutagen Sync**: Uses [Mutagen](https://mutagen.io/) for high-performance file synchronization. It is not `rsync`; it uses a real-time, bi-directional sync agent that is orders of magnitude faster for large projects (like `node_modules`).\n- **Automatic Port Forwarding**: Tunnels remote ports to your local machine based on your configuration.\n- **Public Port Exposure**: Open ports directly for external access - perfect for client demos.\n- **Ansible Integration**: Supports running Ansible playbooks to configure the instance on startup.\n- **Multi-User Support**: Teams sharing an AWS account get automatic instance isolation. Each instance is tagged with the owner's identity, and `campers list` shows only your instances by default.\n- **Docker-like Exec**: Run commands on running instances with `campers exec dev \"command\" -it` - no re-sync or re-provision needed.\n- **Cost Control:** Encourages an ephemeral workflow where instances are destroyed when not in use.\n- **TUI Dashboard**: A terminal interface to monitor logs, sync status, and instance health.\n\n## Simple Configuration\n\nCampers uses a single YAML file to define your infrastructure and provisioning. Here is a complete example:\n\n```yaml\n# campers.yml\n\n# Define reusable variables to keep config clean\nvars:\n  project_name: my-ml-project\n  # Use standard linux paths\n  remote_path: /home/ubuntu/${project_name}\n\n# Define reusable Ansible playbooks (idempotent setup)\nplaybooks:\n  python-setup:\n    - name: Install Python Tools\n      hosts: all\n      tasks:\n        - pip: {name: [numpy, pandas, jupyter], state: present}\n\n  deep-learning:\n    - name: Install PyTorch \u0026 TensorBoard\n      hosts: all\n      tasks:\n        - pip: {name: [torch, torchvision, tensorboard], state: present}\n\n# Define your camps (machines)\ncamps:\n  # 1. Cheap dev environment\n  dev:\n    instance_type: t3.medium\n    # Uses variable defined above\n    command: cd ${remote_path} \u0026\u0026 bash\n\n  # 2. Interactive experimentation (Jupyter)\n  experiment:\n    instance_type: g4dn.xlarge\n    # Use the Deep Learning AMI\n    ami:\n      query:\n        name: \"Deep Learning Base AMI (Ubuntu*)*\"\n        owner: \"amazon\"\n    # Open Jupyter on your laptop's localhost:8888\n    ports: [8888]\n    ansible_playbooks: [python-setup]\n    command: jupyter lab --ip=0.0.0.0 --port=8888\n\n  # 3. Heavy training job (TensorBoard)\n  training:\n    instance_type: p3.2xlarge\n    # Forward TensorBoard to localhost:6006\n    ports: [6006]\n    ansible_playbooks: [python-setup, deep-learning]\n\n    # Run every time the instance starts (e.g., pull latest data)\n    startup_script: |\n      cd ${remote_path}\n      dvc pull data/\n\n    # Run background monitoring and main training script\n    command: |\n      cd ${remote_path}\n      tensorboard --logdir logs --port 6006 \u0026\n      python train_model.py\n\n  # 4. Client demo (publicly accessible)\n  demo:\n    instance_type: t3.medium\n    # Open ports for external access (clients can hit the public IP)\n    public_ports: [80, 3000]\n    command: npm start\n```\n\n**How you use them:**\n\n```bash\n# Start the cheap coding environment\ncampers run dev\n\n# Switch to the GPU machine for notebooks\ncampers run experiment\n\n# Launch the heavy training job\ncampers run training\n\n# Start a client demo (share the public IP with clients)\ncampers run demo\n\n# Open another shell to a running camp (like docker exec)\ncampers exec dev \"/bin/bash\" -it\n\n# Run a one-off command without interrupting your session\ncampers exec dev \"tail -f /var/log/app.log\"\n\n# Check status of all your camps (showing estimated monthly costs)\ncampers list\n# ┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┓\n# ┃ NAME               ┃ INSTANCE-ID  ┃ STATUS     ┃ REGION         ┃ COST/MONTH           ┃\n# ┡━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━┩\n# │ campers-dev        │ i-0abc123def │ running    │ us-east-1      │ $29.95/month         │\n# │ campers-experiment │ i-0def456abc │ stopped    │ us-east-1      │ $4.00/month          │\n# └────────────────────┴──────────────┴────────────┴────────────────┴──────────────────────┘\n```\n\n### Full Control\nSince you get a standard Linux instance, you can run **multiple services** at once. You might use `supervisord` or `docker compose` to spin up Jupyter, TensorBoard, and a database simultaneously. Campers will automatically forward all the ports you specify.\n\n### Environment Forwarding\nCampers securely forwards your local environment variables (like API keys) to the remote instance. You can configure exactly which variables to send using regex filters:\n\n```yaml\ndefaults:\n  # Only forward specific safe variables\n  env_filter:\n    - ^AWS_.*\n    - ^WANDB_API_KEY\n```\n\n### `.env` File Support\nCampers automatically loads a `.env` file from your project directory. Use it to store secrets outside of version control:\n\n```bash\n# .env (add to .gitignore!)\nDB_PASSWORD=secret\nAPI_KEY=sk-123\n```\n\nReference them in `campers.yaml` with `${oc.env:VAR_NAME}`:\n\n```yaml\nvars:\n  api_key: ${oc.env:API_KEY}\n  db_pass: ${oc.env:DB_PASSWORD,default_value}\n```\n\n## Quick Start\n\n```bash\n# Install via pip\npip install campers\n\n# Or run instantly with uv (recommended)\nuvx campers run\n\n# Check prerequisites (AWS credentials, Mutagen, etc.)\ncampers doctor\n\n# First-time setup (creates default VPC if needed)\ncampers setup\n\n# Initialize a configuration in your current directory\ncampers init\n\n# Validate your configuration\ncampers validate\n\n# Spin up your camp\ncampers run\n```\n\n## Setup \u0026 Troubleshooting\n\n### First-Time Setup\n\nIf you're using a new AWS account or region, run the setup command to ensure prerequisites are in place:\n\n```bash\ncampers setup --region us-east-1\n```\n\nThis creates a default VPC (required for launching instances) and verifies IAM permissions.\n\n### Diagnosing Issues\n\nIf something isn't working, run the doctor command:\n\n```bash\ncampers doctor\n```\n\nIt checks:\n- AWS credentials and connectivity\n- IAM permissions\n- Default VPC availability\n- Mutagen installation\n\nFor verbose output with stack traces, enable debug mode:\n\n```bash\nCAMPERS_DEBUG=1 campers run dev\n```\n\n## Documentation\n\nFull documentation is available at **[kamilc.github.io/campers](https://kamilc.github.io/campers)**\n\n- [Getting Started](https://kamilc.github.io/campers/getting-started/)\n- [Configuration Reference](https://kamilc.github.io/campers/configuration/)\n- [CLI Commands](https://kamilc.github.io/campers/commands/)\n- [Examples](https://kamilc.github.io/campers/examples/)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkamilc%2Fcampers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkamilc%2Fcampers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkamilc%2Fcampers/lists"}