Fugleramme: The Local AI E-Ink Frame That Recognizes Birds by Sound in 2026
Hello HaWkers, a Raspberry Pi 5 listens to the garden, recognizes a bird's song without sending audio to the cloud, and updates an e-ink frame with a 19th-century naturalist illustration. That is the idea behind Fugleramme, an open source project that drew attention in September 2026 by combining local AI, home hardware, and historical art in a product that looks ready to live on the wall.
The most interesting detail is that the image does not come from a generator. The collection contains more than 800 cutouts covering over 400 species, extracted from real plates and curated by hand. But how does the audio become a visual composition, what is required to reproduce the experience, and which limitations need to be part of the plan? In this article, we will break down the architecture, test the web mode, and draw practical lessons for any connected physical product.
What Is Fugleramme and Why Did It Attract Attention?
“Fugleramme” means something close to “bird frame” in Norwegian. The project was created by Arne Giacomo Munthe-Kaas and maintains a live installation connected to his kitchen window in Bergen, Norway. When a bird is heard, the system associates the species with an illustration and rearranges the scene displayed on the panel.
It is a simple idea to explain, yet it is full of good product decisions. The frame does not show a technical dashboard with probabilities, spectrograms, and logs. It turns classification into a calm experience: textured paper, birds arranged like an antique plate, and updates only when the set of visitors changes.
According to the official Fugleramme repository, the project is still in early development. That means expecting rough edges and possible bugs, not a finished household appliance. Even so, it already provides hardware documentation, automated installation, containerized execution, an admin panel, and a kiosk mode accessible through the browser.
The demonstration's success also reveals a broader trend: local AI becomes more convincing when it disappears from the interface. The user does not need to talk to a model. They only need to look at the wall and notice that a new species has appeared.
From the Window to the Frame: The Architecture in Four Parts
The flow starts at the microphone. BirdNET-Go classifies the audio as a separate service that runs the BirdNET model and records detections. Fugleramme queries that service's API, receives the identified species, and looks for the corresponding illustration in its catalog.
Next, the compositor removes layout concerns from the rest of the system. It positions the birds on a textured page, places larger animals closer to the center, and uses real body-mass data from the AVONET dataset to define proportions. Finally, it reduces the composition to the e-ink panel's palette and redraws only when the displayed species change.
This separation creates four easy-to-understand layers:
- capture, with a microphone and ambient audio;
- classification, performed locally by BirdNET-Go;
- composition, handled by Fugleramme with Python, Pillow, and NumPy;
- presentation, on the e-ink panel or in the web kiosk.
The decoupling matters because the detector can run on the same Raspberry Pi or on another machine on the network. Anyone who already maintains a BirdNET-Go station does not need to duplicate the classifier: simply point the frame to the existing URL. It follows the same logic as local AI and edge computing: processing close to the source reduces external dependencies, preserves private context, and leaves the interface free to perform a specific task.
A minimal API query can be represented like this, adapting the route to the contract of your installation:
import os
import requests
DETECTOR_URL = os.environ.get("DETECTOR_URL", "http://birdnet.local:8080")
def buscar_deteccoes():
# The timeout prevents a network failure from freezing the entire interface.
resposta = requests.get(f"{DETECTOR_URL}/api/v2/detections", timeout=5)
resposta.raise_for_status()
return resposta.json()
if __name__ == "__main__":
for deteccao in buscar_deteccoes():
# The scientific name serves as a stable key between services.
print(deteccao.get("scientific_name", "espécie desconhecida"))The example illustrates the architectural pattern; it does not promise that every BirdNET-Go version will use the same route or format. Before integrating it, check the documentation for the installed version and inspect a real response.
Recommended Hardware and Possible Alternatives
The reference build uses a Raspberry Pi 5, a microphone, an A4 frame, and a 13.3-inch Pimoroni Inky Impression panel with Spectra 6 technology. Its size allows the display to feel like an illustration, while the six colors fit the natural-history aesthetic. The slow refresh stops being a drawback because the content does not need animation.
E-ink, however, is not required. The software also serves the same composition in a web kiosk. You can open the page on another device on the network, connect a regular display via HDMI, or validate the entire experience before buying the panel. This is an excellent prototyping order: prove the detection, data, and layout first, then invest in the physical finish.
For audio, placement usually matters more than sophistication. A microphone protected from rain and kept away from constant household noise tends to provide a more useful signal. Ventilation, power, card access, and cable routing also matter. A beautiful frame that must be dismantled for every update stops being a product and becomes decorative maintenance.
Because the official documentation warns that a fresh installation may require a reboot, set aside time to test automatic startup and recovery after a power outage. For a wall-mounted device, “it works when I open the terminal” is not a sufficient definition of ready.
How to Test It Without Buying an E-Ink Panel
The least expensive path is to run Fugleramme in web mode. The project publishes a container image and persists its configuration in /data. If BirdNET-Go is already accessible on your network, the command documented by the author is straightforward:
# Replace birdnet.local with the actual address of your detector.
docker run -d \
--name fugleramme \
--restart unless-stopped \
-p 8080:8080 \
-v fugleramme:/data \
-e FUGLERAMME_DETECTOR_URL=http://birdnet.local:8080 \
ghcr.io/arnegiacomo/fuglerammeThe kiosk is then available on port 8080, while the admin area uses /admin. The most important rule here is not to copy the example URL without checking name resolution, the firewall, and the detector's port. On a home network, reserving the address in DHCP prevents the service from disappearing after the router restarts.
To confirm that the container is active and the page responds, a simple health check is enough:
#!/usr/bin/env bash
set -euo pipefail
URL="${FUGLERAMME_URL:-http://localhost:8080}"
# Exits with a nonzero code if the interface does not respond within 5 seconds.
curl --fail --silent --show-error --max-time 5 "$URL" >/dev/null
printf 'Fugleramme respondeu em %s\n' "$URL"The repository also provides a fake detector for development. With uv sync, uv run fugleramme-fake-detector, and uv run fugleramme-dev, you can simulate visitors without a microphone or Raspberry Pi. This shortens the interface-tuning cycle and makes it possible to test states such as an empty window, a few birds, and a full composition.
The Historical Collection Is Not AI-Generated Art
One of the easiest details to miscommunicate is the origin of the images. No bird is generated from a prompt at runtime. The more than 800 cutouts come from real naturalist plates, largely from the 19th century, and each file was selected for the project. Some elements received AI-assisted touch-ups, but the visual catalog is historical and human-curated.
The available works provide the best coverage for Scandinavia, the British Isles, and Germany. The documentation acknowledges that other regions still have gaps, while European and North American coverage is being expanded. For an installation in Brazil, therefore, the first test should focus on the catalog: how many detected local species actually have an illustration?
That absence can become an opportunity to contribute. The project documents the manual cutout process and maintains manifests with the source of each plate. Just do not treat “public domain” as a synonym for “every file in the repository can be used without conditions.” The code uses the MIT license; the classic image style is under CC BY-SA 4.0; fonts, body-mass data, and taxonomic aliases have their own licenses; BirdNET-Go is distributed under CC BY-NC-SA 4.0 and restricts commercial use.
Before turning the prototype into a product for sale, create a component and license matrix:
const componentes = [
{ nome: 'Fugleramme', licenca: 'MIT', usoComercial: true },
{ nome: 'BirdNET-Go', licenca: 'CC BY-NC-SA 4.0', usoComercial: false },
{ nome: 'Arte clássica', licenca: 'CC BY-SA 4.0', usoComercial: true },
]
// Blocks the commercial proposal until every dependency has been reviewed.
const bloqueios = componentes.filter((item) => !item.usoComercial)
console.table(bloqueios)This small inventory prevents a technically functional prototype from being mistaken for a product that can legally be distributed.
Local Privacy, Maintenance, and Real Limitations
Running classification locally reduces the continuous transmission of audio to external services. That is valuable for a microphone that remains active near a home. Even so, “local” does not mean “risk-free.” The admin panel should be restricted to a trusted network, container images need updates, and persistent volumes deserve backups.
It is also wise to record only what is necessary. If the goal is to show recent species, you may not need to store raw audio. Define retention, protect credentials, and avoid exposing port 8080 directly to the internet. The author's public demonstration is a deliberate operational choice; it is not an instruction to open your Raspberry Pi to the router.
Classification has limits. Wind, conversations, traffic, and overlapping songs can produce poor results. The minimum confidence, time window, and update frequency need to be calibrated for the environment. An occasional false positive on a decorative screen may be acceptable; in scientific research, the same rate could invalidate conclusions.
E-ink itself imposes another healthy constraint: redrawing unnecessarily costs time and energy. Fugleramme updates only when the set of birds changes. This event-driven rule is better than a blind interval and can be reused in dashboards for energy, transportation, air quality, or home sensors.
What This Project Teaches About AI Products
Fugleramme does not try to do everything. A classifier recognizes the sound, a service composes the scene, and a display presents the information. Each part can change without destroying the central idea. This modularity makes it easier to test in the browser, move the detector to another machine, and switch the output device.
The second lesson is to use constraints as a visual language. Six colors, slow updates, and historical illustrations create coherence. A faster LCD display might deliver more features, but it would lose the feeling of a living illustration. A good product is not a sum of capabilities; it is a disciplined selection.
The third lesson is to explain AI precisely. Machine learning classifies the bird song, but birds are not generated during use. Saying that clearly values human curation, avoids a false promise, and makes the system auditable.
Finally, the project shows how a prototype gains quality when it includes operations from the start: installation, containers, an automatic service, a configuration panel, a development mode, and license documentation. The object on the wall is the elegant tip of a system that also needs to survive the next power outage.
Outlook: From Birdwatching to Environmental Interfaces
In 2026, Fugleramme is still a young project, but its direction is mature. Local models can interpret the environment without turning every interaction into a chat, and discreet displays can present results without competing for attention with notifications. The same pattern can recognize machine sounds, monitor wildlife, show energy consumption, or translate sensors into a readable home interface.
If you want to try it, start with web mode and the fake detector. Then connect a real BirdNET-Go instance, validate the species in your region, and only then choose the microphone, display, and frame. This sequence separates decorative ambition from technical feasibility and reduces premature purchases.
The most interesting frame is not the one with “AI” written on the packaging. It is the one whose technology disappears and leaves behind a new relationship with the place: you hear a song, look at the wall, and learn who visited the garden.
Let's go! 🦅
📚 Want to Keep Up With What Is Coming?
This article covered Fugleramme and its local AI architecture, but the ecosystem changes every week, and not everything becomes an article here.
On X, I share what I am testing, behind-the-scenes details from my projects, and news that appears before it becomes a post.
Follow Me There
💡 Daily content about development, careers, and the tools I actually use

