Fugleramme: Turning Birdsong into a Living E-Ink Field Guide
A microphone by a window hears a robin. A few seconds later, software identifies the call, finds a hand-cut illustration from an old natural-history plate, and adds the bird to a framed sheet of electronic paper. Nothing is uploaded for classification. No camera watches the garden. The display does not animate, scroll, or demand attention. It simply changes when the local soundscape changes.
That is the appeal of Fugleramme, Arne Giacomo Munthe-Kaas’s open-source bird frame. The finished object looks more like a nineteenth-century field guide than a computer. Behind it is a carefully designed pipeline: BirdNET-Go performs continuous acoustic inference, Fugleramme turns detections into a stable set of species, a silhouette-aware packer composes the page, and a six-color e-paper panel holds the result without becoming another glowing screen.
The project is interesting because its constraints reinforce one another. Acoustic classification can run locally on modest hardware. E-paper is slow but persistent. Historical illustrations suit a limited palette. A picture frame should feel settled, so the renderer avoids unnecessary movement. Instead of fighting the hardware, the software makes the hardware’s limitations part of the product.
One object, two cooperating systems
Fugleramme does not classify audio itself. It treats BirdNET-Go as a separate detector and communicates with it through the /api/v2 HTTP interface. BirdNET-Go owns the microphone, inference, confidence thresholds, location filters, clips, and detection database. Fugleramme asks for recent detections and species summaries, then owns everything about the framed page.
That boundary is practical. The detector may run beside the frame in a container on the same Raspberry Pi, on another machine elsewhere in the house, or on an existing BirdNET-Go station. The page code does not care. It receives species, timestamps, counts, and confidence values through one protocol.
BirdNET-Go’s current default BirdNET v2.4 model covers more than 6,500 bird species and can run continuously on a Raspberry Pi. The wider BirdNET project describes its tools as local, open-source bioacoustics infrastructure, not merely a phone app. Its original 2021 research model used a 157-layer residual network with more than 27 million parameters and was tested on both single-species recordings and fully annotated soundscapes. Modern model coverage is broader, but the operating idea is the same: turn short windows of audio into ranked species predictions, then use geography, time, and thresholds to reduce implausible results.
Fugleramme narrows that rich detector into an intentionally small surface. It excludes non-bird classes, normalizes scientific names that changed across taxonomy releases, and distinguishes an empty result from an unavailable detector. That last distinction protects the physical object. “No birds were heard” may legitimately produce a bare perch. “The API timed out” must preserve the last good page. Treating both as an empty list would make a brief network failure erase the frame.
This separation also keeps private data local. BirdNET-Go can store clips and expose a detailed dashboard, but Fugleramme only needs structured detection results. A household can keep both services on its own network. The frame remains useful without a cloud account, and it can continue showing its last image if the detector briefly disappears.
The display changes the definition of “fast”
The recommended panel is Pimoroni’s 13.3-inch Inky Impression. Its board is exactly A4-sized, with a 1600×1200 Spectra 6 display capable of red, green, blue, yellow, black, and white. Pimoroni lists a 12-second core refresh at warm operating temperatures, while a complete real-world update can take roughly 20 to 35 seconds after data transfer and ready-state handling.
For a conventional interface, that would be painfully slow. For a picture frame, it creates a useful design rule: refresh only when the meaning of the page changes.
The service polls every five seconds, but polling does not imply repainting. Each display mode produces a state key derived from the facts that affect the page: selected species, artwork choices, dimensions, style, rotation, language, labels, and typeface. If the key is unchanged, no image is generated and the panel is untouched. The “latest bird” mode changes only when a different species becomes latest; repeated calls from the same bird do not churn the glass. “Newest arrival” can remain unchanged for weeks.
An optional refresh floor handles busy gardens. It is not a timer that forces periodic updates. It is a minimum interval before bird activity may change the page again. A settings edit bypasses that floor so an administrator sees the requested change immediately.
The error path is equally deliberate. If the detector is unavailable, the render loop keeps the last state key and the physical panel keeps its current pixels. If pushing an image to the panel fails, the already-rendered image remains pending and is retried on the next tick. It is not recomputed. The software behaves like a framed object with memory, not a web page that blanks whenever a request fails.
This is a broader lesson for ambient software. Responsiveness is not always the time between input and pixels. Sometimes it is the ability to ignore noise, preserve a trustworthy state, and update only when the user would perceive a meaningful change.
The collage is a packing problem, not a grid
The frame could have used equal rectangular cards, one bird per cell. That would have been easier and much less convincing. Natural-history plates work because specimens have irregular outlines, varied scales, and a visual rhythm that does not resemble a dashboard.
Fugleramme packs birds by their alpha silhouettes. Transparent margins may overlap, but opaque pixels may not. The renderer trims each source image, extracts its alpha channel, thresholds it into a collision mask, and slightly erodes the halo so neighboring birds can nestle close without their bodies touching. It places the largest birds first on an outward spiral from the center. If the full set does not fit, it shrinks every bird and tries again.
Size is not arbitrary. The repository includes body-mass data derived from AVONET. The renderer calculates each species’ mass relative to the geometric mean of the birds currently shown and compresses that ratio before turning it into a target dimension. A blackbird therefore reads as larger than a wren without allowing an eagle to consume the entire sheet. The largest silhouettes land near the center, where the composition can carry their visual weight.
Labels participate in packing too. The chosen typeface is rasterized into a mask and joined to the corresponding bird’s footprint before placement. That reserves actual space for the name, allowing it to tuck below a body or perch without colliding with a neighbor. A second language can stack beneath the first. On the e-paper version, label antialiasing is thresholded to pure black because gray edge pixels would dither into colored speckles.
This work happens at a fixed internal packing size based on a 1,200-pixel short edge. The resulting positions are then scaled to both the panel and the web kiosk. Packing separately at each final resolution would produce subtly different answers because the algorithm works in whole pixels: one collision rounded differently could move several birds. A shared coordinate system means the browser and the frame show the same page.
Packing is also expensive relative to drawing. Project notes estimate that it accounts for about 90 percent of a render. Fugleramme caches placements by species, artwork, dimensions, font, and resolved label strings. The panel render and kiosk render can then share the same layout while redrawing source sprites at their own target resolutions. According to the project’s measured example, this reduced the second path from 5.4 seconds to 0.5 seconds.
Small deterministic choices prevent visual churn. Whether a bird faces left or right comes from a hash of its scientific name, so adding another species does not make every existing bird flip. If several illustrations exist for one species, the frame chooses one and persists that choice while the bird remains in the lookback window. When the species leaves and returns another day, it may receive another plate. The page stays stable within a visit but gains variety over time.
Old illustrations need a modern asset pipeline
The repository contains more than 800 cut-outs representing over 400 species. The source plates are largely Scandinavian, British, and central European, which makes coverage strongest in those regions. The artwork is not generated imagery: each bird starts with a real historical plate and carries source and license information in the style manifest.
Preparing those assets is manual curation. A contributor finds a public-domain or compatibly licensed plate, cuts the bird away from the background, preserves antialiased feather edges, and adds a paper-colored halo. At render time, the halo is retinted to match the generated sheet and feathered into it. This hides unavoidable remnants between legs and fine plumage while avoiding the pasted-sticker look of a hard cut-out.
The committed assets use WebP with transparency to keep the repository and container smaller. Scientific names provide the durable join key between detector output, taxonomy aliases, body-mass data, localized names, and artwork filenames. That sounds straightforward until taxonomy changes. BirdNET-Go may store older and newer scientific names for the same species across an upgrade, while a model’s label list can retain the older spelling. Fugleramme canonicalizes those variants before counting or drawing, preventing one biological species from appearing twice.
Missing art is handled honestly. A species with no illustration is omitted from the collage, and the service logs which plate is absent. It does not substitute an unrelated bird or fabricate an image. If no drawable species remains, the frame selects a bare perch from the active style. The perch varies deterministically by day, so even a quiet garden changes gently without pretending that something was heard.
Six colors are a rendering target, not a downgrade
The browser kiosk receives a full-color page with textured paper. The physical display receives a flat-paper version, because paper grain would turn into noisy colored dots when quantized. Fugleramme reduces that image to the panel’s six colors with Floyd–Steinberg dithering.
There is a subtle integration detail here. Pimoroni’s driver will dither an ordinary RGB image again. Double-dithering would smear a composition that had already been carefully reduced. Fugleramme therefore creates a palette-mode image whose six indices match the driver’s expected order: black, white, yellow, red, blue, and green. The driver can remap those indices directly rather than processing the pixels a second time.
The palette used to measure color distance is blended between the driver’s nominal colors and duller colors closer to the panel’s physical appearance. That is a pragmatic calibration: the rendering algorithm should optimize for ink on glass, not for ideal RGB primaries on a laptop display.
The project still treats the web view as a first-class output. Without e-paper hardware it can run in web-only mode, serve the kiosk over HDMI, or be opened from another device. The connected panel determines the page’s aspect ratio when present; the web setting changes the kiosk height but not the composition’s shape. A differently shaped viewport is letterboxed rather than allowed to rearrange the birds.
A build that respects the room it enters
The full recommended build uses a Raspberry Pi 5 with 2 GB of RAM, a 32 GB or larger microSD card, active cooling, a microphone with a USB audio interface, the 13.3-inch Inky panel, and an A4 frame. The microphone matters more to recognition quality than adding memory to the Pi. BirdNET-Go classifies continuously, so cooling and a reliable power supply matter as well.
There is also a frame-only configuration. If BirdNET-Go already runs elsewhere, a Pi 4 or Pi Zero 2 W can drive the display and fetch detections over the network. Rendering will be slower on the Zero, but panel refresh is slow enough to hide much of that difference. This split makes the physical artifact easier to place: the microphone can remain in the best acoustic position while the frame hangs where it is pleasant to look at.
The enclosure has physical constraints software cannot abstract away. The A4 panel fits an inexpensive picture frame, but the mat must be cut to hide the bezel without covering the image. The back should remain open, or have a large ventilation cutout, because continuous inference heats the Pi. E-paper is glass and must be handled at the edges. The final product is a small embedded system, not merely a Python service with a pretty frontend.
Why the project feels complete
Fugleramme succeeds because each layer protects the illusion created by the next. The detector turns ambient sound into structured events. Taxonomy normalization turns messy histories into stable species identities. Artwork curation turns those identities into credible specimens. Silhouette packing turns assets into a plate. Change-aware rendering keeps the plate visually settled. E-paper makes that settled image feel native to a wall.
None of those pieces is individually exotic. Together, they replace a familiar smart-home pattern—a bright dashboard full of live metrics—with something closer to a window into the local ecosystem. The frame does not show every detection or expose every confidence score. BirdNET-Go already has a dashboard for that. The object in the room answers a simpler question: Who has been here?
That restraint is the real engineering achievement. A slower display led to fewer updates. A limited palette led to an archival visual language. Local inference led to a clean service boundary and private operation. Stable hashing, persisted illustration picks, cached placement, and last-good-state behavior remove the little discontinuities that would make the object feel computational.
The result is a useful model for ambient computing: collect continuously, decide locally, present selectively, and let silence remain silence.