Skip to main content
HomeProjectsNeuposter

NeuPoster — AI Classroom Posters on a $3 Display

Published Aug 30, 2025
Updated Jul 30, 2026
1 minutes read

Where the idea came from

Season 1, episode 3 of Abbott Elementary, about four minutes in. The teachers are underfunded and cannot afford to decorate their classroom walls — which the show calls the soul of the classroom.

Then it clicked, because it is true here too. Walk into most Singapore classrooms and the walls are student-decorated, teacher-funded, and a term out of date. What if the wall could generate itself, and stay relevant to what is actually being taught this week?

I started with kindergarten and ages 0–6 deliberately. Those posters are computationally lighter than a secondary-school infographic, and the dataset is small enough to be trainable and checkable.

How it works

More workflow than agent, and I want to be precise about that.

  1. Teacher types a topic into a lightweight HTML/CSS/JS frontend. One word is enough — "Photosynthesis".
  2. A Groq LLM expands that into a rich, structured image-generation prompt with system constraints and a poster description.
  3. Replicate / Hugging Face synthesises the image from the enhanced prompt — Stable Diffusion and Flux.1, chosen for instruction-following at zero cost.
  4. FastAPI converts the result into an ESP32-friendly format: 1-bit bitmap or XBM, 128×64.
  5. An HTTP endpoint exposes it, and the ESP32 connects to Wi-Fi, polls, and renders onto a 0.96" SSD1306 OLED.

I wrote the prompt before I wrote the code. Giving Groq multiple refined example keywords gets you few-shot behaviour out of the image model without touching weights, which is the cheapest performance you will ever buy.

What broke

The hardware–software join. Everything up to "the bitmap exists" works. Getting that .xbm onto the display autonomously — common server, POST and GET wired correctly, ESP32 fetching on its own schedule — is where I ran out of hackathon.

I also started in the Espressif IDE and moved to the Arduino IDE partway through, because WiFi.h and HTTPClient.h were all the project needed and the heavier toolchain was buying me nothing.

What I took away

Scope early. I spent the first hours fighting complexity I had chosen for myself. The lesson is not "aim lower" — it is that an unbounded scope makes the early stage feel like failure when it is just breadth.

This was my first project that touched full-stack app development, text and image generation, and hardware in the same repo. Nothing here is elegant. It is the first time I saw the whole chain end to end, which is worth more to me than a clean submission would have been.