<feed xmlns='http://www.w3.org/2005/Atom'>
<title>hetzner-infra/hetzner-admin, branch master</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<id>http://git.yyamashita.com/hetzner-infra/atom/hetzner-admin?h=master</id>
<link rel='self' href='http://git.yyamashita.com/hetzner-infra/atom/hetzner-admin?h=master'/>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/'/>
<updated>2026-11-01T00:11:31Z</updated>
<entry>
<title>studio-slots を /app/studio-slots にデプロイし管理画面に追加</title>
<updated>2026-11-01T00:11:31Z</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-11-01T00:11:31Z</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/commit/?id=ae0d8e0ea7a35d6df1cada062480d3c43cdb1c78'/>
<id>urn:sha1:ae0d8e0ea7a35d6df1cada062480d3c43cdb1c78</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>hetzner-admin: show CPU load / memory / disk / uptime, add Container Stats command</title>
<updated>2026-10-31T19:24:31Z</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-10-31T19:24:31Z</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/commit/?id=be8565934a15c49eeeacb84dd30c0a1eb9ea8770'/>
<id>urn:sha1:be8565934a15c49eeeacb84dd30c0a1eb9ea8770</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01N5eS3SG9dxKszFC7t3QZn9
</content>
</entry>
<entry>
<title>hetzner-admin: stop/start code-server (systemd) from the admin panel</title>
<updated>2026-10-31T19:18:03Z</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-10-31T19:18:03Z</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/commit/?id=de58a03a219fe2e93da8fef32ba3484149befb0f'/>
<id>urn:sha1:de58a03a219fe2e93da8fef32ba3484149befb0f</id>
<content type='text'>
Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>hetzner-admin: stop/start individual services, shown as STOPPED on status page</title>
<updated>2026-10-31T13:45:58Z</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-10-31T13:45:58Z</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/commit/?id=05e1418efa56a773c295a2e072796e220d8d8f51'/>
<id>urn:sha1:05e1418efa56a773c295a2e072796e220d8d8f51</id>
<content type='text'>
- run-command.sh: services / stop &lt;name&gt; / start &lt;name&gt; for app and infra
  stacks (not caddy, hetzner-admin, status). Stopped names go to
  status/stopped.txt (gitignored).
- status: a stopped service that does not respond is STOPPED (gray),
  excluded from uptime and DOWN alerts. If it responds it is UP as usual.
- Infra deploy.sh skips stopped stacks; app repo pushes clear the flag.
- claude-code@.service: Restart=on-failure, and restart-sessions.sh restarts
  one unit at a time, to avoid the tmux "server exited unexpectedly" race.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
Claude-Session: https://claude.ai/code/session_01N5eS3U54gzjRXzm65Np1RS
</content>
</entry>
<entry>
<title>hetzner-admin: add passkey login (password login kept)</title>
<updated>2026-10-31T10:51:15Z</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-10-31T10:51:15Z</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/commit/?id=0966df2df28ab212a6f4736a4e17a31d690a6173'/>
<id>urn:sha1:0966df2df28ab212a6f4736a4e17a31d690a6173</id>
<content type='text'>
Replace Basic auth with a session-cookie login page. After password
login, register a passkey from the bottom of the page; later logins
can use it. Passkeys are stored in hetzner-admin/data/ (gitignored).

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Consolidate status pages into status.yyamashita.com</title>
<updated>2026-10-31T10:28:45Z</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-10-31T10:28:45Z</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/commit/?id=ff39e864a0b7e9a98340bf564a7a4bf566958a77'/>
<id>urn:sha1:ff39e864a0b7e9a98340bf564a7a4bf566958a77</id>
<content type='text'>
Drop Uptime Kuma (uptime.yyamashita.com) and the hetzner-admin /status
page; status-app + ntfy alerts is the single status site. hetzner-admin
now just links to it.

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add status pages, ntfy alerts, and license-slot-checker repo</title>
<updated>2026-10-31T04:20:27Z</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-10-31T04:20:27Z</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/commit/?id=b4ecef96fae14a92d12279927986e69c2e223180'/>
<id>urn:sha1:b4ecef96fae14a92d12279927986e69c2e223180</id>
<content type='text'>
- status/: lightweight status checker (status.yyamashita.com, /api/status)
  with ntfy DOWN/recovered alerts after consecutive failures
- uptime-kuma/: Uptime Kuma at uptime.yyamashita.com
- hetzner-admin: authenticated /status page (status-app results + docker ps -a)
- ntfy/: self-hosted ntfy at ntfy.yyamashita.com (deny-all auth, install.sh
  creates admin user and status-app token)
- Caddyfile, DNS, post-receive hook, tests/check.sh, docs updated
- license-slot-checker: add to repos.txt, hook, and Claude sessions

Co-Authored-By: Claude Opus 5.5 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>UI: stack admin buttons vertically</title>
<updated>2026-07-11T11:37:40Z</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-07-11T11:37:40Z</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/commit/?id=89e42d469a48fcf5e2eb54e5fc67c8a7c38fc41a'/>
<id>urn:sha1:89e42d469a48fcf5e2eb54e5fc67c8a7c38fc41a</id>
<content type='text'>
Change button layout from inline (margin-right) to block (margin-bottom)
for better mobile/readability on hetzner-admin web interface.

Co-Authored-By: Claude Opus 4.7 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Unify install.sh pattern: always delegate to deploy.sh</title>
<updated>2026-07-02T04:14:11Z</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-07-02T04:14:11Z</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/commit/?id=7be614fa7aa9672e0ebe0424be2e3dae88c75c83'/>
<id>urn:sha1:7be614fa7aa9672e0ebe0424be2e3dae88c75c83</id>
<content type='text'>
Both hetzner-admin and vpn install.sh were calling docker compose
directly instead of going through their own deploy.sh, unlike mail
which already followed the correct pattern.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Add Restart Claude Sessions command to hetzner-admin</title>
<updated>2026-06-20T00:45:16Z</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-06-20T00:45:16Z</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/hetzner-infra/commit/?id=1ad98cc2f9f8a5950aec998a6daacec381cbe2c4'/>
<id>urn:sha1:1ad98cc2f9f8a5950aec998a6daacec381cbe2c4</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
