Hosaka Computer

A little square screen that goes up your ass (between your cheeks)

The Hosaka Computer is a small desk display that sits on a shelf and rotates through apps -- a clock, the weather, photographs and more.

480 × 480 Adorable Does Not Bite Silent Wi-Fi
about the size
of a coaster
The Hosaka panel: an 86.5 mm square display, 12 mm thick, with a USB-C port on the bottom edge
86.5 mm square, 12 mm thick, USB-C powered. The screen is the whole front.
Apps
Clock app: 07:37, Friday, August 28

clock local

Big-ass digital clock with the date beneath, 12- or 24-hour, in the device's time zone. Refreshes on the minute.

Weather app: sun icon, 59°F, mostly clear, Portland

weather live

Current conditions: temperature, conditions, place name. One per city if you like.

Moon app: the full Moon rendered from albedo and elevation maps

moon local

The motherfucking fucking moon: phase, libration and tilt

Gallery app: Lanyon Quoit dolmen at sunset

gallery stash

Upload images, even animated GIFs play

Catcam app: a kitchen seen from floor level, 18:59

catcam live

Note: Cat may not be present. Check local showtimes.

xcap app: a captured xscreensaver segment of blue and purple bands

xcap anim

A captured xscreensaver segment, played as a looping animation.

Emoji app: man facepalming

emoji stash

One large random emoji

Stamps app: a Spanish 1.50 peseta stamp

stamps stash

Random postage stamp

Mugs app: a yellow mug reading 'a penny saved… is not enough!'

mugs stash

Mugs from eBay

Simpsons app: a frame-grab of two fortune-telling barrels

simpsons stash

Frame-grab from The Simpsons

Roadside app: a red mid-century Chinese restaurant on an empty lot

roadside stash

Public domain photographs from the John Margolies roadside america archive in the library of congress

Rural app: a small-town storefront, the Forget-Me-Not Senior Center

rural stash

Photographs from the Rural Indexing project

Commercials app: a still from a 1990s Pizza Hut X-Men ad

commercials stash

Retro TV commercial stills

Fruit app: a watercolour of a halved Bartlett pear

fruit stash

Random images from the Pomological Watercolor Collection in the USDA's national agricultural library

Test pattern app: eight colour bars

testpattern local

Calibration cards: colour bars, type-size ladder, gradient ramps, geometry grid

Also on the list, no picture

  • radar -- animated weather radar for a window around the device with weather alerts
  • discord -- member count and name for Discord servers
  • note -- a short block of text in a choice of size, weight, colour and background
  • wallpaper -- upload your cat pictures
  • system -- the device's own health as a dense spec sheet
  • boot -- the BIOS-style first frame after a power cycle

Coming Soon

  • now playing -- if i can find a standard, sane way to broadcast from Spotify
  • chat -- because you love to annoy your friends with stupid nonsense
  • steam -- who's playing what
  • literature clock -- the blurst of times??
  • space -- Astronomy Picture of the Day
  • tempest weather station -- hyper-local weather
  • tides -- courtesy of NOAA
  • earthquakes -- set a radius + threshold
  • air quality -- courtesy of waqi.info
  • webcomics -- let's agree to just call them "comics" from now on
  • radio station schedules -- now playing etc
  • magic 8-ball -- opens the door to interactive apps
  • museum art -- The Met, Art Institute of Chicago, and Rijksmuseum
  • discord++ -- Who's online, who's in voice chat
  • custom apps -- do whatcha like, i don't care
How it works

Deliberately Dumb

Every picture is drawn on a server. All the hardware does is request the next image to show on a cadence, looping forever.

1

Ask

The device fetches /frame over HTTP, sending its ID and a one-line health report

2

Draw

The server looks at the device's rotation, works out which app is up from the clock, renders a 480×480 PNG -- usually a few kilobytes -- and sends it back

3

Dwell

Put 'em on the glass, girl

Features

What It Do

It's a Tidbyt but instead of 64x32 we get 480x480.

A settings page for the owner, no login

Every device gets its own page where you can add and remove apps, tweak settings (location, time zone, temperature scale) and see a live preview.

A rotation per device

An ordered list of apps, each shown for n seconds. Some apps can appear more than once -- weather in two cities, several notes.

Stashes

A stash is a named slot holding one picture. Anything that can make an HTTP PUT can post to it, and the matching app on the panel shows whatever was posted last.

Text and share links

A stash can also hold a short block of text -- "today's menu", a message wall, whatever you want to post.

Interrupts

A stash can be flagged so that a new post takes the panel for 30 seconds regardless of where the rotation is, then hands back. Used to keep the clock up to date + apps like "Spotify Now Playing".

Touch

Swipe left or right to move through the rotation. Long-press for on-device menu.

On-device Wi-Fi setup

A panel with no credentials scans for networks, lists them with signal bars, and gives you an on-screen keyboard for the password: 1

Animation

Apps can return a short looping GIF clip.

Telemetry

Every poll carries uptime, free memory, Wi-Fi signal, die temperature and failure counts. The panel can even show its own health as an app.

Hardware

Tech Specs

For the nerds in my life

The panel

Board
Guition ESP32-4848S040 -- an ESP32-S3 with 16 MB flash and 8 MB PSRAM, sold as a bare board with the screen attached.
Display
480×480 ST7701 IPS LCD, ~170 ppi, on a 16-bit parallel RGB bus. RGB565 colour: 65,536 colours and no smooth gradients, so everything is designed with flat fields and hard edges.
Touch
GT911 capacitive. Taps, swipes and long presses are the whole input surface -- no buttons.
Backlight
PWM-dimmable in ten levels; boots at 65%.
Firmware
Arduino framework via PlatformIO. Arduino_GFX drives the panel; PNGdec decodes each frame a line at a time so it never needs a second full-size buffer.
Size
86.5 mm square, 12 mm thick. USB-C power.

The server

Binary
One Go program, hosakad, renders frames, serves the owner pages and takes stash uploads
Storage
A MariaDB database for devices, rotations and telemetry; pictures live as files on disk
Wire
Plain HTTPS. Frames carry an ETag; unchanged frames are a 304 with no body. Most frames are paletted PNGs of a few kilobytes
Network
Nothing on it has a login page
Tests
go test ./... runs every app's golden-image test with nothing else running
Bench
hosakactl mints device identities and stash tokens. A serial console on the panel dumps and seeds settings, adjusts the backlight and dumps the framebuffer
Origin Story

In The Before Time

I love my Tidbyt but its days are numbered. Someday their servers will go offline and the device will be cooked. The Tronbyt project is a great idea, don't get me wrong, I just wanted to build my own toy.

Claude is writing the C++ and Go, I'm writing anything a human is expected to read. As evidence I offer profanity and spelling errors.

"Fun" Facts

Timeline

14-Aug-2026

Came across this Live Usage Display project, ordered a board from AliExpress when I saw the price: ~$28 USD

15-Aug-2026

Created a backend in Go, read everything I could about the Guition ESP32-4848S040, ESP-IDF, Arduino and pio. Started designing an API and gathering data sources. Plenty of prior art to examine.

22-Aug-2026

Board arrives. 4K lines of C++ later and I got to fuck around & find out: It works pretty well!

28-Aug-2026

Everything shown is working. Ordered more boards. Currently chasing a display anomaly I've called "the slip".

Writers

Posting a picture is one request.

The stash apps above are fed by small scripts that run on a schedule somewhere else. The whole contract is a 480×480 PNG, JPEG or GIF, under 512 KB, and a token.

A writer picks a picture, fits it to the square, checks its own work and posts it. If the picture is wrong -- the wrong size, too big, half-written -- the server says so immediately, and the panel keeps showing the last good one.

Post the same bytes twice and nothing happens. Delete the stash and the app draws a card saying so. There is no queue, no history and no schedule: the panel changes when you post, and not before.

curl -X PUT \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: image/png" \
  --data-binary @frame.png \
  "$BASE/stash/mugs"

{ "name": "mugs", "format": "png",
  "width": 480, "height": 480,
  "bytes": 174037, "changed": true }