<feed xmlns='http://www.w3.org/2005/Atom'>
<title>ship.git, branch main</title>
<subtitle>Deploy to your VPS in one command</subtitle>
<id>https://code.northwest.io/ship.git/atom?h=main</id>
<link rel='self' href='https://code.northwest.io/ship.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/'/>
<updated>2026-02-19T05:11:48+00:00</updated>
<entry>
<title>fix: pass container port (not host port) as PORT env var</title>
<updated>2026-02-19T05:11:48+00:00</updated>
<author>
<name>Clawd</name>
<email>ai@clawd.bot</email>
</author>
<published>2026-02-19T05:11:48+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/commit/?id=6d4ffd6e2176e82e81033adf878cba959817336f'/>
<id>urn:sha1:6d4ffd6e2176e82e81033adf878cba959817336f</id>
<content type='text'>
Docker deployments were passing the host port as PORT to the container,
but the port mapping routes traffic to container port. This caused apps
that read PORT from env to listen on the wrong port inside the container.
</content>
</entry>
<entry>
<title>fix: port allocator scans existing ports to avoid collisions</title>
<updated>2026-02-19T04:46:53+00:00</updated>
<author>
<name>Clawd</name>
<email>ai@clawd.bot</email>
</author>
<published>2026-02-19T04:46:53+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/commit/?id=7b05505db7e964e400b779f76e8a2023bda93fe1'/>
<id>urn:sha1:7b05505db7e964e400b779f76e8a2023bda93fe1</id>
<content type='text'>
- Collapse multi-line allocScript to single line (fixes SSH+sudo mangling)
- Scan /etc/ship/ports/* to find highest port in use
- Use max(next_port, highest_used + 1) to prevent collisions
- Fixes issue where stale/missing next_port caused port conflicts
</content>
</entry>
<entry>
<title>Remove remaining planning docs (SHIP_V2.md, SPEC.md)</title>
<updated>2026-02-17T16:13:28+00:00</updated>
<author>
<name>Clawd</name>
<email>ai@clawd.bot</email>
</author>
<published>2026-02-17T16:13:28+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/commit/?id=805541df0f22f1200692ddfae7b2f199a89a8f7b'/>
<id>urn:sha1:805541df0f22f1200692ddfae7b2f199a89a8f7b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Clean up obsolete docs and binaries</title>
<updated>2026-02-17T16:11:44+00:00</updated>
<author>
<name>Clawd</name>
<email>ai@clawd.bot</email>
</author>
<published>2026-02-17T16:11:44+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/commit/?id=c50f5c5feb7e2b4c43fe3f54a31d853fb828ff04'/>
<id>urn:sha1:c50f5c5feb7e2b4c43fe3f54a31d853fb828ff04</id>
<content type='text'>
Removed:
- GIT_AND_GOMOD_PLAN.md (old planning)
- PLAN_v0.2.0.md (old planning)
- PROGRESS.md (v2 progress tracking, complete)
- TODO.md (all items fixed)
- ship-new binary (added to gitignore)
</content>
</entry>
<entry>
<title>Merge agent-mode: v2 rewrite complete</title>
<updated>2026-02-17T16:11:19+00:00</updated>
<author>
<name>Clawd</name>
<email>ai@clawd.bot</email>
</author>
<published>2026-02-17T16:11:19+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/commit/?id=6f02ec84a8299fc5577f147cc8741c8a4b162b64'/>
<id>urn:sha1:6f02ec84a8299fc5577f147cc8741c8a4b162b64</id>
<content type='text'>
- Removed all v1 code (-2800 lines)
- Simplified state to just default_host + base_domain
- Atomic port allocation via flock
- --container-port flag for Docker
- Custom domains shown in ship list
- Caddyfiles preserved on redeploy
- JSON output by default, --pretty for humans
</content>
</entry>
<entry>
<title>Mark custom Caddyfile support as fixed</title>
<updated>2026-02-17T16:09:53+00:00</updated>
<author>
<name>Clawd</name>
<email>ai@clawd.bot</email>
</author>
<published>2026-02-17T16:09:53+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/commit/?id=05ea98df57599775c1d5bfea336012b075531670'/>
<id>urn:sha1:05ea98df57599775c1d5bfea336012b075531670</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Preserve existing Caddyfiles on redeploy</title>
<updated>2026-02-17T16:09:34+00:00</updated>
<author>
<name>Clawd</name>
<email>ai@clawd.bot</email>
</author>
<published>2026-02-17T16:09:34+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/commit/?id=b976b147e2e5e34b940c69fee7d7c121e12cd9a8'/>
<id>urn:sha1:b976b147e2e5e34b940c69fee7d7c121e12cd9a8</id>
<content type='text'>
Don't overwrite Caddyfile if it already exists. This preserves
manual customizations (NIP-05 routes, custom headers, etc.).

First deploy generates Caddyfile, subsequent deploys leave it alone.
</content>
</entry>
<entry>
<title>Mark custom domains in list as fixed</title>
<updated>2026-02-17T16:06:15+00:00</updated>
<author>
<name>Clawd</name>
<email>ai@clawd.bot</email>
</author>
<published>2026-02-17T16:06:15+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/commit/?id=21e6aa97a56ad8c494feef066dc0970cf4b94b4f'/>
<id>urn:sha1:21e6aa97a56ad8c494feef066dc0970cf4b94b4f</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Show custom domains in ship list and status</title>
<updated>2026-02-17T16:06:00+00:00</updated>
<author>
<name>Clawd</name>
<email>ai@clawd.bot</email>
</author>
<published>2026-02-17T16:06:00+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/commit/?id=c1b0bb8b149a251a5802557a8d8ab649170a83ad'/>
<id>urn:sha1:c1b0bb8b149a251a5802557a8d8ab649170a83ad</id>
<content type='text'>
Read actual domain from Caddyfile instead of assuming subdomain.
Works for both apps and static sites.
</content>
</entry>
<entry>
<title>Update TODO: mark port collision and container port as fixed</title>
<updated>2026-02-17T16:00:11+00:00</updated>
<author>
<name>Clawd</name>
<email>ai@clawd.bot</email>
</author>
<published>2026-02-17T16:00:11+00:00</published>
<link rel='alternate' type='text/html' href='https://code.northwest.io/ship.git/commit/?id=c11e0ed6edd10e48780fb965b8d5b730d53b81a0'/>
<id>urn:sha1:c11e0ed6edd10e48780fb965b8d5b730d53b81a0</id>
<content type='text'>
</content>
</entry>
</feed>
