{"id":51605372,"url":"https://github.com/tarun-elango/outpost","last_synced_at":"2026-07-12T02:00:31.331Z","repository":{"id":359709923,"uuid":"1245131468","full_name":"Tarun-Elango/Outpost","owner":"Tarun-Elango","description":"CLI to provision and manage remote AWS development boxes.","archived":false,"fork":false,"pushed_at":"2026-07-10T02:09:29.000Z","size":73373,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-10T02:09:41.621Z","etag":null,"topics":["aws-ec2","cli","developer-tools","remote-development"],"latest_commit_sha":null,"homepage":"https://outpost.tarunelango.com","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tarun-Elango.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-05-21T00:11:46.000Z","updated_at":"2026-07-10T02:02:09.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Tarun-Elango/Outpost","commit_stats":null,"previous_names":["tarun-elango/devboxssh-cli","tarun-elango/devbox-cli","tarun-elango/outpost"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/Tarun-Elango/Outpost","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tarun-Elango%2FOutpost","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tarun-Elango%2FOutpost/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tarun-Elango%2FOutpost/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tarun-Elango%2FOutpost/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tarun-Elango","download_url":"https://codeload.github.com/Tarun-Elango/Outpost/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tarun-Elango%2FOutpost/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35379591,"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-07-12T02:00:06.386Z","response_time":87,"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":["aws-ec2","cli","developer-tools","remote-development"],"created_at":"2026-07-12T02:00:18.362Z","updated_at":"2026-07-12T02:00:31.316Z","avatar_url":"https://github.com/Tarun-Elango.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Outpost CLI\n\nManage remote dev boxes from the CLI — provision, connect, sync, and destroy them using your own AWS account (BYOK). Currently supports Linux and macOS.\n\n## What is a box?\n\nA **box** is a personal Linux dev machine on AWS — an EC2 instance (Amazon Linux, Ubuntu, or Debian) that you provision, connect to, and tear down from your local machine.\n\n## Why was this created?\nThe idea of keeping your dev environment away from your machine, keeps the blast radius small when installing any new packages or dependencies. Having a seperate environment for AI agents to do their thing, without having to worry about our computer. All while staying in the terminal, and keeping credentials secure locally.\n\nThe tool has since been extended with commands for box management, snapshots (save a copy of your box so you can restore it later), templates (spin up a box with pre-installed software), ssh, sync, idle-stop to save on costs, git-sync to use your local git credentials on the box, budget tracking, importing existing instances and more.\n\nsee the docs for more details: https://outpost.tarunelango.com\n\n## Table of Contents\n- [Download and Install (from GitHub release)](#download-and-install-from-github-release)\n- [Common commands](#common-commands)\n- [Setup](#setup)\n\n## Download and Install (from GitHub release)\n\nEvery push to `main` publishes Linux and macOS binaries to the [latest release](https://github.com/Tarun-Elango/Outpost/releases/tag/latest). Run the following command:\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Tarun-Elango/outpost/latest/scripts/install.sh | bash\n```\n\nVerify with the command `outpost ls`.\n\nIf that worked, you're done — skip the sections below. They're optional alternatives for pinning a version or installing system-wide.\n\nNote: if you want to pin a specific version, or install it for every user on this machine, see here https://outpost.tarunelango.com/docs/install\n\nIf you want to clone the repo and build it yourself, see here https://outpost.tarunelango.com/docs/install#build-from-source\n\n## Common commands\n\nRun `outpost help` to print usage, or see the table below.\n\n### Config and health\n\n| Command | Notes |\n| --- | --- |\n| `version` | Show the outpost CLI version |\n| `update` | Check GitHub releases for a newer version and install it after confirmation |\n| `setup` | Configure/change AWS credentials and region (stored in `~/.outpost/config.json`) |\n| `clear-creds` | Clear saved AWS credentials from `~/.outpost/config.json` |\n| `health` | Check config, AWS credentials, region, and database |\n| `import` | Sync EC2 instances and self-owned AMIs from your AWS account (configured region) into the local DB; prompts for each untracked resource — answer `y` to import or press Enter to skip. For boxes, may ask for an existing `.pem` to authorize outpost SSH |\n\n### Boxes\n\n| Command | Notes |\n| --- | --- |\n| `create \u003cname\u003e [--template \u003ctemplateName\u003e...] [--from \u003camiId\\|name\u003e]` | Create a new box, optionally from one or more templates, optionally restoring from a snapshot |\n| `ls` | List all boxes |\n| `status \u003cid-or-name\u003e` | Show details for a box |\n| `rename \u003cid-or-name\u003e \u003cnew-name\u003e` | Rename a box |\n| `resize \u003cid-or-name\u003e` or `upgrade \u003cid-or-name\u003e` | Resize a stopped box instance type or root disk |\n| `stop \u003cid-or-name\u003e` | Stop a running box |\n| `start \u003cid-or-name\u003e` | Start a stopped box |\n| `restart \u003cid-or-name\u003e` or `reboot \u003cid-or-name\u003e` | Reboot a running box |\n| `delete \u003cid-or-name\u003e` | Delete a box |\n\n### Connect and transfer\n\n| Command | Notes |\n| --- | --- |\n| `ssh [-i key] \u003cid-or-name\u003e [-- \u003cssh-option\u003e...]` | Open an SSH session to a box (`-i` path to private key; default `~/.ssh/id_ed25519`; `--` passes native ssh options before the target, e.g. `-v`, `-A`, `-L 8080:localhost:8080`; for one-off remote commands use `exec`) |\n| `cp [-i key] \u003csource\u003e \u003cdest\u003e` | Copy a file to or from a box (e.g. `outpost cp ./main.go mybox:~/app/`) |\n| `sync [-i key] [--delete] \u003csource\u003e \u003cdest\u003e` | Incremental directory sync via rsync over SSH (same path syntax as `cp`: one local path, one `box:/path`). Only **dest** is modified — copies new/changed files from source; source is never changed. `--delete` also removes files on dest that are not in source |\n| `exec [-i key] [-s] [-t] \u003cid-or-name\u003e -- \u003ccommand\u003e` | Run a one-off command on a running box (`-s` run as a shell snippet via `sh -lc`; `-t` allocate a pseudo-TTY for sudo or interactive commands) |\n| `forward \u003cid-or-name\u003e \u003cport\u003e` | Forward a port from a box |\n\n### Snapshots\n\nA snapshot is a saved disk image of a box; restore one with `create --from`.\n\n| Command | Notes |\n| --- | --- |\n| `snapshot [ls] [\u003camiId-or-name\u003e]` | List all snapshots, or show details for one |\n| `snapshot create \u003cid-or-name\u003e \u003cname\u003e` | Create a snapshot of a box |\n| `snapshot delete \u003camiId-or-name\u003e` | Delete a snapshot |\n\n### Templates\n\nTemplates let you create boxes preloaded with libs, tools, and other setup.\n\n| Command | Notes |\n| --- | --- |\n| `template [ls]` | List available templates |\n| `template new \u003ctemplateName\u003e [command string]` | Create a template with optional startup command |\n| `template delete \u003ctemplateName\u003e` | Delete a template |\n| `template rename \u003ctemplateName\u003e \u003cnew-templateName\u003e` | Rename a template |\n| `template search \u003cquery\u003e` | Search templates by name (returns partial matches) |\n\n### Idle stop\n\n| Command | Notes |\n| --- | --- |\n| `idle-stop set \u003cid-or-name\u003e \u003cminutes\u003e` | Stop the box after inactivity |\n| `idle-stop show \u003cid-or-name\u003e` | Show idle-stop settings for a box |\n| `idle-stop update \u003cid-or-name\u003e \u003cminutes\u003e` | Update idle-stop timeout |\n| `idle-stop delete \u003cid-or-name\u003e` | Remove idle-stop from a box |\n\n### Git sync\n\nUse your local GitHub SSH key on a box (for `git push`, `git clone`, etc.) without copying it there: adds the key to `ssh-agent` and enables agent forwarding (`-A`) in the box's SSH config. Run again to undo both.\n\n| Command | Notes |\n| --- | --- |\n| `git-sync \u003cid-or-name\u003e` | Toggle GitHub SSH agent forwarding for a box |\n\n### Budgets\n\nList and manage AWS account cost budgets. Results are cached under `~/.outpost/` for 12 hours. Requires the `AWSBudgetsActionsWithAWSResourceControlAccess` IAM policy.\n\n| Command | Notes |\n| --- | --- |\n| `budget [ls] [--refresh]` | List AWS account budgets (name, period, limit, spend, forecast, % of budget). `--refresh` bypasses the local cache |\n| `budget create \u003cname\u003e \u003climit\u003e \u003cemail\u003e` | Create a monthly cost budget for all AWS services. Alerts at 85% actual, 100% actual, and 100% forecasted spend |\n| `budget update \u003cname\u003e` | Interactively update name, limit, or alert email (Enter keeps each current value) |\n| `budget delete \u003cname\u003e` | Delete a budget by exact name (quote names with spaces) |\n\n## Setup\n\n***Note***: the aws access key and secret are stored in the `~/.outpost/` file, locally on your machine. No cloud storage or syncing is done.\n\nGo to your AWS console \n\n1. **create an IAM user**\nGo to the IAM console → **Users** → **Create user**. Name it (e.g. `outpost`), choose **Attach policies directly**, search for `AmazonEC2FullAccess`, `AWSBudgetsActionsWithAWSResourceControlAccess`, and `AmazonSSMReadOnlyAccess`, select them, and create the user.\n\n2. **Access keys** \nOpen the user → **Security credentials** → **Access keys** → **Create access key**. Select **Local code**, confirm, then copy the **Access key ID** and **Secret access key** (the secret is shown only once).\n\n3. **Configure outpost**\nRun the steps below to create your first box:\n\n```bash\noutpost setup    # enter access key, secret, region → ~/.outpost/config.json\noutpost create mybox  # create a simple box\noutpost ssh mybox  # ssh into the box\n```\n\nfor detailed instructions, see here https://outpost.tarunelango.com/docs/setup","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftarun-elango%2Foutpost","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftarun-elango%2Foutpost","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftarun-elango%2Foutpost/lists"}