Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
d4a11ea
fix(macos): preserve launchd PATH for docker CLI
agustif Mar 5, 2026
17d9158
[dh] fix: use raw TOML compose path for project name derivation
dahyman91 Mar 5, 2026
791b510
[jrs] added clippy warnings to lint
jamiesunderland Mar 5, 2026
e1a0e3d
Merge pull request #40 from agustif/fix/macos-docker-path
jamiesunderland Mar 5, 2026
e8977c2
[jrs] fixed lookup worktree path detection
jamiesunderland Mar 5, 2026
fab6c33
Merge pull request #42 from coast-guard/jrs-fix-lookup-worktree-detec…
jamiesunderland Mar 5, 2026
8de7870
Merge pull request #41 from coast-guard/fix/compose-project-name-root…
dahyman91 Mar 5, 2026
04476ac
[jrs] detect orbstack and link to demo in deocs and README.md
jamiesunderland Mar 6, 2026
0c1a76b
Merge pull request #43 from coast-guard/jrs-add-orbstack-detection-an…
jamiesunderland Mar 6, 2026
5e56338
[jrs] doc updates
jamiesunderland Mar 8, 2026
e7c5ec8
Merge pull request #44 from coast-guard/jrs-add-orbstack-detection-an…
jamiesunderland Mar 8, 2026
ed37811
[jrs] add support for cross project checkouts and handle unbinding wh…
jamiesunderland Mar 8, 2026
405d957
Merge pull request #45 from coast-guard/jrs-fix-checkout-cleanup-for-…
jamiesunderland Mar 8, 2026
b04c480
[jrs] fix cli exit codes
jamiesunderland Mar 8, 2026
b031d96
Merge pull request #46 from coast-guard/jrs-fix-cli-exit-codes
jamiesunderland Mar 8, 2026
4e983a2
[jrs] Bug fix: scope secrets to build id in api.
jamiesunderland Mar 8, 2026
90dc877
Merge pull request #47 from coast-guard/jrs-fix-secrets-scoping-to-bu…
jamiesunderland Mar 8, 2026
b8869b7
[jrs] break assign up into smaller parts
jamiesunderland Mar 9, 2026
bfcd151
Merge pull request #48 from coast-guard/jrs-refactor-assign-into-smal…
jamiesunderland Mar 9, 2026
c8b5de7
[jrs] cleanup run handler
jamiesunderland Mar 9, 2026
34ac5bf
Merge pull request #49 from coast-guard/jrs-cleanup-run-handler
jamiesunderland Mar 9, 2026
e26b9f2
[jrs] broke up the build handler
jamiesunderland Mar 9, 2026
85b1396
Merge pull request #50 from coast-guard/jrs-breakup-build
jamiesunderland Mar 9, 2026
7fd883e
[jrs] updated syncing marker
jamiesunderland Mar 9, 2026
c75e8e8
Merge pull request #51 from coast-guard/jrs-fix-assign-syncing
jamiesunderland Mar 9, 2026
2491a67
Update README.md
dahyman91 Mar 9, 2026
acea018
Merge pull request #52 from coast-guard/dahyman91-patch-1
dahyman91 Mar 9, 2026
0a80547
[jrs] fix daemon install script and add auto restart post install
jamiesunderland Mar 9, 2026
7cb8488
Merge pull request #53 from coast-guard/fix-installation-plist-bug
jamiesunderland Mar 9, 2026
5c60438
[jrs] add update ephemeral state checks and quiescing
jamiesunderland Mar 9, 2026
ad82b0d
Merge pull request #54 from coast-guard/jrs-add-update-ephemeral-stat…
jamiesunderland Mar 9, 2026
eed1522
[dh] docs: update volumes video link
dahyman91 Mar 10, 2026
4ec553b
Merge pull request #55 from coast-guard/dh-volume-video-link
dahyman91 Mar 10, 2026
6ad71a3
[ec] added compose port mappings
Mar 10, 2026
e5a4a20
Merge pull request #56 from clarkerican/ec-added-compose-port-mappings
jamiesunderland Mar 10, 2026
1b40649
[dh] feat: add Coasts Video Course docs section
dahyman91 Mar 10, 2026
ddc74ad
[dh] fix: resolve TS error in DocsViewer youtube caption link parsing
dahyman91 Mar 10, 2026
d7ed347
Merge pull request #57 from coast-guard/dh-video-course-docs
dahyman91 Mar 10, 2026
ae457a6
[dh] docs: restructure README with installation up top and consolidat…
dahyman91 Mar 10, 2026
02c5867
[jrs] put video docs in correct order
jamiesunderland Mar 10, 2026
b20fb56
Merge pull request #59 from coast-guard/jrs-fix-video-content-order-a…
jamiesunderland Mar 10, 2026
f9835be
Merge pull request #58 from coast-guard/dh-readme-local-setup
dahyman91 Mar 11, 2026
57f7945
Make COAST_SKIP_UI_BUILD a complete backend-only path
agustif Mar 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,4 @@ OPENAI_API_KEY=sk-your-key-here

# Optional model override for docs translation script.
# Defaults to gpt-5.2 when unset.
OPENAI_TRANSLATION_MODEL=gpt-5.2
OPENAI_TRANSLATION_MODEL=gpt-5.4
85 changes: 85 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ async-trait = "0.1"

# Testing
tempfile = "3"
assert_cmd = "2"
predicates = "3"

# CLI output
colored = "2"
Expand Down
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ export
.PHONY: lint fix test coverage coverage-text check fmt zip-projects unpack-projects watch \
docs-version docs-status translate translate-all doc-search doc-search-all

# Check formatting and run clippy. Deny-level lints (configured in Cargo.toml)
# cause hard failures; warn-level lints are printed but don't block.
# Check formatting and run clippy. Matches CI: -D warnings promotes all
# warnings to errors so local lint catches what CI catches.
lint:
cargo fmt --all -- --check
cargo clippy --workspace
cargo clippy --workspace -- -D warnings

# Auto-format and auto-fix what clippy can.
fix:
Expand Down
110 changes: 59 additions & 51 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,87 +6,57 @@

Coasts (Containerized Hosts) is a CLI tool with a local observability UI for running multiple isolated instances of a full development environment on a single machine. It works out of the box with your current setup: no changes to your existing application code, just a small `Coastfile` at your repo root. If you already use Docker Compose, Coasts can boot from your existing `docker-compose.yml`; if you do not use Docker or Compose, Coasts works just as well.

Build once and run N instances with whatever volume and networking topology your project needs. Check out one coast at a time to bind canonical ports to your host, and use dynamic ports to peek at any other worktree.
Build once and run N instances with whatever volume and networking topology your project needs. Check out one coast at a time to bind canonical ports to your host, and use dynamic ports to peek into the progress of any worktree.

Coasts is agnostic to AI providers and agent harnesses. The only host requirement is Git worktrees, so you can switch tools without changing how you work and without any harness-specific environment setup.

Coasts is also offline-first with no hosted service dependency, so there is no vendor lock-in risk: even if we disappeared, your local workflow would keep running.

## Installation

Install the latest public release:

```sh
eval "$(curl -fsSL https://coasts.dev/install)"
```

[Visit coasts.dev](https://coasts.dev) for the website, docs, and installation instructions.

![Coastguard overview showing multiple coasts](assets/coastguard-overview-live.png)

## Documentation

For the full user-facing documentation, see the [Coasts docs](https://coasts.dev/docs).

## Contributing
## Demo Repo

To contribute, read the [contributing guide](CONTRIBUTING.md).
Want a concrete example to explore? Check out the [`coasts-demo` repository](https://github.com/coast-guard/coasts-demo) for a small demo project you can use to try Coasts end to end.

> Note: Coasts is currently macOS-specific. General Linux support is coming shortly.
## Contributing

## Installation
To contribute, read the [contributing guide](CONTRIBUTING.md) for PR guidelines.

```sh
curl -fsSL https://coasts.dev/install | sh
```
> Note: Coasts is currently macOS-specific. General Linux support is coming shortly.

## Prerequisites
### Prerequisites

- Rust (stable toolchain)
- Docker
- Node.js
- socat (`brew install socat` on macOS)
- Git

## Building

```bash
cargo build --release
```

Binaries are placed in `target/release/`:
- `coast` -- the CLI client
- `coastd` -- the background daemon

## Quick Start (building from source)

```bash
# Start the daemon
coastd --foreground &

# In a project with a Coastfile and docker-compose.yml:
coast build
coast run main
coast run feature-x --worktree feature/x

# Swap which instance owns the canonical ports
coast checkout main
coast checkout feature-x

# Inspect
coast ls
coast ps main
coast logs main
coast ports main

# Clean up
coast rm main
coast rm feature-x
```

## Development

### Dev setup

If you have coast globally installed, the production daemon occupies `~/.coast/` and port 31415. The workspace builds separate `coast-dev` and `coastd-dev` binaries that use `~/.coast-dev/` and port 31416, so the two never conflict.

Run the setup script once to build everything and symlink the dev binaries into `~/.local/bin`:
Run the setup script once to build the web UI, compile the workspace, and symlink `coast-dev` / `coastd-dev` into `~/.local/bin`:

```bash
./dev_setup.sh
```

This builds the web UI, compiles the workspace, and creates `coast-dev` / `coastd-dev` symlinks. On first run it adds `~/.local/bin` to your PATH — restart your shell or `source ~/.zshrc` to pick it up.
On first run it adds `~/.local/bin` to your PATH — restart your shell or `source ~/.zshrc` to pick it up.

Dev mode uses `~/.coast-dev/` and port 31416, so it never conflicts with a global coast install on port 31415.

### Day-to-day development workflow

Expand Down Expand Up @@ -215,3 +185,41 @@ coast/
integrated-examples/ # Example projects and shell-based integration tests
```

## Building from source

```bash
cargo build --release
```

Binaries are placed in `target/release/`:
- `coast` -- the CLI client
- `coastd` -- the background daemon

```bash
# Start the daemon
coastd --foreground &

# In a project with a Coastfile and docker-compose.yml:
coast build
coast run main
coast run feature-x --worktree feature/x

# Swap which instance owns the canonical ports
coast checkout main
coast checkout feature-x

# Inspect
coast ls
coast ps main
coast logs main
coast ports main

# Clean up
coast rm main
coast rm feature-x
```

## Original History


This project started in another repository and had some of its history squashed. Please see the [original repo here](https://github.com/jsx-tool/coasts) for the full commit history.
2 changes: 2 additions & 0 deletions coast-cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,5 @@ workspace = true

[dev-dependencies]
tempfile = { workspace = true }
assert_cmd = { workspace = true }
predicates = { workspace = true }
Loading