Departed Jan 2026 · returned Feb 2026
Something Running Somewhere
Oracle Free Tier · Infrastructure · Shipped
[image: Terminal window titled 'oram' streaming live PaperMC server logs — timestamps in the left margin, lines reading 'JackL426 logged in', 'Beasty515 lost connection', 'Beasty515 has completed the challenge [Return to Sender]', cursor blinking at the bottom]
Departure
I wanted a computer that didn't go to sleep when I closed the laptop — always on, reachable from school, home, or my phone, and free. Oracle's Always Free tier hands out a 4-OCPU ARM box with 24GB of RAM and 200GB of NVMe if you can wrestle one out of capacity, so I went hunting for one. On top of it I stacked the things I'd been hearing about for years and never had a reason to learn: Tailscale, SSH keys, tmux, Vim. The visible payload was a Minecraft server my friends could join 24/7. The real payload was finally living inside a stack instead of reading about one.
Approach
- Oracle Cloud ARM A1
- Ubuntu
- Tailscale
- tmux
- PaperMC
- GeyserMC
$0 budget — Oracle Always Free Tier only; school firewall in the path.
Field log
Late Jan 2026
[image: Satellite map of the United States viewed through a circular break in a cloud layer — silver MacBook angled in from the left, black industrial server rack standing on the right, small white cloud over the Midwest labeled '700 miles']
The whole project compressed into one frame: my laptop here, the box somewhere over the Great Lakes. Late Jan 2026
Wanted a computer that didn't sleep when I closed the laptop. Reachable from school WiFi, from cellular, from anywhere. Free. Heard the Oracle Always Free tier hands out a 4-OCPU ARM box with 24GB of RAM if you can wrestle one out of capacity. Went hunting.
Jan 30, 2026
Picked the VM.Standard.A1.Flex shape — 4 OCPU ARM64, 24GB RAM, 200GB NVMe. The console kept refusing it.
[image: Oracle Cloud Infrastructure compute create flow with shape selector still set to VM.Standard.A1.Flex (4 OCPU, 24GB RAM, 200GB NVMe), red API Error notification overlay reading 'Out of capacity for shape VM.Standard.A1.Flex in availability domain AD-2... try again later. Learn more about host capacity.', availability domain dropdown highlighted]
The free tier is real. So is the line for it. Jan 30, 2026
Switched availability domains, retried, retried. AD-1 took it on the fourth try. Instance came up as oram-A1-Server, status ACTIVE, a green tile in the dashboard. Four cores, twenty-four gigs, two hundred GB of NVMe — billed at zero dollars. I had a computer somewhere in Phoenix that I'd never see.
Day 2
[image: Connection failure diagram — linear path from Laptop (Private IP) → Home Router (NAT) → School Firewall → public Internet (cloud icon) → Oracle Cloud Server (Public IP). Two large dashed arcs try to bridge laptop to server directly; both are crossed out with a heavy red X. Caption underneath reads 'Public IP? Open ports? Firewall?']
Every layer in the path was a different no. Day 2
Couldn't reach the public IP from school WiFi. Installed Tailscale on the box and on my laptop and the diagram collapsed into one hop. `ssh oram` from anywhere — no port forwarding, no static IP, no VPN client to launch. The mesh doesn't care about the edge.
[image: Tailscale overlay diagram — four device icons (Laptop, Phone, Tablet, Desktop) labeled Device A/B/C/D arranged around a central 'Overlay Network' circular-arrows icon, each connected by blue lines, caption 'Devices connected directly to each other by name.']
A network above the network. Day 3
Generated an ed25519 keypair. Public lock on the server, private key on disk and nowhere else. Disabled `PasswordAuthentication` in sshd_config. First clean `ssh oram` with no prompt was the moment the project actually existed.
Day 5 — first long-running build
[image: Process death flowchart — BEFORE: SSH Session → Shell branching to Process A, Process B, Server Running. DISCONNECT arrow points right. AFTER: same flowchart with every box (SSH Session, Shell, Process A, Process B, Server Running) crossed out with a heavy black X. Single word 'Dead.' centered at the bottom]
Closing the laptop closed the world. Day 5
Closed the laptop mid-build. Came back to dead processes — the SSH session ended and took the shell, the shell took everything under it. Wrapped every long-running thing in tmux from then on. Detach, walk between buildings, reattach to the same cursor.
[image: macOS terminal screenshot — tmux session 'mc' attached, three windows visible in the green status bar at the bottom reading [main] 0:bash* 1:bash- 2:logs ... 'oram' 08:06 03-Feb-26, scrollback shows server startup output above, Chrome-tabs-for-terminals metaphor]
Detach, walk to a different building, reattach. The cursor is exactly where I left it. Week 1
Edited config files on the box itself instead of scping them back and forth. `vimtutor` is twenty minutes and it's the first thing I'd recommend to anyone with shell access. The muscle memory only stuck because the server I was editing was mine. Switched to Neovim once `:wq` stopped feeling like a fight.
Week 1 — the picture
[image: Vertical stack diagram — seven white rectangular blocks tower-stacked from top to bottom: Application (running inside Tmux), Tmux (persistent sessions), Vim/Neovim (editing), SSH (secure access), tailscale (network mesh), ubuntu (headless OS), ORACLE ARM A1 (hardware — Free Tier). Each tier has its own icon on the left]
Seven layers, $0 worth of hardware. Week 2
Installed PaperMC on OpenJDK 21. Pasted in Aikar's flags so the JVM would actually use the 24GB instead of fighting default heap settings. Layered GeyserMC on top so my friend on a Switch could join the same Java world. Pointed it at the Tailscale name. Friends were on within an hour.
[image: PaperMC startup console inside tmux — Aikar's flags JVM command spilling past the terminal margin, ASCII PAPER banner mid-render, lines reading 'Starting Minecraft server on *:25565', 'Loading libraries, please wait...', 'Geyser-Spigot has been initialized', world spawn chunks loading at the bottom]
Aikar's flags so the JVM stops choking on its own defaults; Geyser so Bedrock and Java sit at the same table. Throughout
The build never ran first time. Out of capacity, connection refused, OOMKilled, address already in use, host key verification failed. Each error was a specific question with a specific answer somewhere — paste the full message, get the next move. AI was a tireless debugging partner; the work was still mine.
Steady state
Server log scrolls whether I'm watching or not. Uptime measured in weeks, then months. Bill from Oracle: $0.00. Bill from Tailscale: $0.00. The error messages were the path.
From the gallery
[image: Neovim editing a Python file on the server — functions def now_ms(), def pcm16_rms(), def wrap_with_system_tags(), class RateConverter8k24k visible, syntax highlighting active in yellow/green/blue, command line at the bottom showing :wq, tmux green status bar underneath]
[image: What Actually Stuck flowchart — six white boxes connected by arrows reading CLOUD (rental services — someone else's computer) → TAILSCALE (connectivity — no headsets) → SSH KEYS (secure access — remote identity) → TMUX (session persistence — work stays alive) → TROUBLESHOOTING (the process — not failure) → AI (debugging partner — genuinely powerful)]
[image: Oracle Cloud Home dashboard screenshot — left sidebar with Home/Resources/Services icons, central resources table listing 'oram-A1-Server Active', 'oram Running', 'minecraft-subnet Available', right panel with quick-start tiles for 'Create a VM instance' and 'Create an ATP database']
What I came back with
$0 always-on server
Lesson from the terrain
Always-on is mostly about removing yourself from the path. The box doesn't need me logged in — it needs Tailscale to be findable, SSH keys to be trusted, tmux to outlive the session, and Aikar's flags so the JVM stops choking on its own defaults. Every error along the way — out of capacity, connection refused, OOMKilled — was the next instruction, not a wall.
Cross-links
This fed into / from