Show HN: FrameOS – operating system for single function smart frames
frameos.net
frameos.net
I ended up getting that same person an Aura frame this year because remotely adding photos ended up miserable
(Hi, I wrote most of the Inky driver and your project is the kind of awesome I wish the Pico/RP2040-based Inky Frame devices could pull off.)
I always say "if it's stupid and it works, it's not stupid". Your approach to get the dithering right sounds brilliant to me :D.
The current inky driver works great, and that fact that it's in Python is what made me develop the original FrameOS software in Python. However now that I rewrote it in Nim, the Python driver is a bit of a crutch. While I could use the C drivers for the Waveshare displays, I'm forced to install a python wrapper on the Pi as a workaround to get the Inky drivers working.
Do you have any idea if there are any C, or even Nim drivers available for the Inky Impression boards? The Python workaround works, but isn't really elegant. If not, I'm considering porting them myself at some point...
I'm also lurking on the Pimoroni discord, and was meaning to ask there about it as well.
https://github.com/daniel-j/nim-pimoroni-pico/blob/master/sr...
I have planned to write GPIO/SPI/I2C "drivers" in Nim that interfaces with the Linux drivers. So far I have made a wrapper for libgpiod. https://github.com/daniel-j/nim-gpiod
Not needing a Python wrapper would definitely help slim down FrameOS into something you could stuff into a fast-loading initrd I guess?
I did something similar with Keybow, static binaries and a custom build system (2) to make a sort-of Pi (Zero) based appliance.
1. https://github.com/daniel-j/nim-pimoroni-pico/tree/master
The digital art thing is big in hospitals (Source: I was the technology designer for SFGH, UCSF, and the technology implementation manager for El Camino Hospital - and director of OPs for Vizio (TV))
Ive evaluated, purchased and installed systems such as this, and wayfinding in hospitals - paying hundreds of thousands for digital artwork to be looped in elevator lobbies, room screens etc - they, like you said - had rubbish software.
For the lobbies in El Camino Hospital, I had to replace some units with Mac Mini's playing an MP$ on loop via VLC because the digital signage system was so crappy.
So, having this with a piZero would be great.
However - wayfinding would also be elegant with this - so long as when you say "interactive" surely it could display a webapp/app via the PI, and "screen-saver" to your digital art loop when idle...
But - seriously, the digital art/signage/wayfinding market needs a fiesty upstart like you to ruffle their muffins - I dont have any PIs currently else, I'd be using this....
I wonder if I could install it on my shitty android TCL tablet from T-Mobile...?
(Also look at controlling Feit Electric bulbs)
EDIT:
I think the most lucrative option for a device/OS like this would be travel signage at BART, any 'regional transit' -- find the dumbest person at that organization and train them to install and configure and display something in a fool-proof manner...
Look at Sacramento (california) regional transit - they have so many screens with zero usable information...
Have you been in a train in APAC? THey have LCD screens with status maps on the upper walls...
Have you been in a train in the US? THey have pee and poo on the upper walls, and zero map status anyplace.
It sounds like installing screens on US trains would just end up with pee and poo on the screens...
It's crazy how much money is wasted in the US, where other people are begging for food on the streets.
I believe in such places the cost of service and maintenance is many multiples the cost of the initial installation. A $20 "720p hdmi stick" from aliexpress vs a $300 mac mini is a no brainer. 100 mac minis will work reliably and predictably for years to come, whereas 100 random $20-$50 sticks sounds like something that needs constant supervision and maintenance.
That said, a RPi might be enough, depends on the software. That's why FrameOS has HDMI support, to work for such cases. It's still pretty far from being a turnkey solution today, but we could easily get there with some focus at the right time.
Your comment made me worried that I am doing something wrong. Maybe I can clarify something?
There are two privacy policies, one applies to users of the website only, while the other one applies to users of the product. Which is the one that you are referring to?
> As described in our Privacy Policy, we collect personal information from your interactions with us and our website, including through cookies and similar technologies. We may also share this personal information with third parties, including advertising partners. We do this in order to show you ads on other websites that are more relevant to your interests and for other reasons outlined in our privacy policy.
> To opt out of the “sale” or “sharing” of your personal information collected using cookies and other device-based identifiers as described above, you must be browsing from one of the applicable US states referred to above.
I’m currently in the EU and your policy is a clear breach of the RGPD. You have no right to collect and share my information for any purpose that’s not strictly needed for your service without my explicit consent.
I admit that’s on me and I should clarify the policy.
I want to switch away from Shopify anyways, and then I will also try to find a way to attribute clicks to marketing campaigns that doesn’t involve 3rd party cookies.
I just didn’t have the time yet.
But yeah if you want to keep that shit in than you should put a cookie banner and make everyone annoyed at you.
I’m trying to run a small business.
Building a custom store page is definitely on the list, but until then, I have to make do with what I can buy off the shelf.
Third party cookies exist because that’s how Facebook tracks ad conversions. That’s why they exist, I am not selling web traffic data or anything like that.
The alternative is not advertising on Facebook or building my own link-based attribution integration with Facebook. But see above: I am trying to run a small hardware business.
Do you really have no way of opting users out by default if you want to use fb advertising?
The display is 7.5 inches.
I’ll update the description to make this more prominent.
https://www.crystalfontz.com/product/cfap640384a00750-640x38...
I also don’t have time to figure it out, so I’m probably just going to buy a used iPad and put it on the wall. I’ll get a nice bright screen and anything I want to see just needs to be viewable in a web browser.
Old android tablets are notoriously unpatched against all kinds of things. It's easy to be paranoid that some passing foot traffic will infect it with a bluetooth worm, and you'll be none the wiser.
I'm accepting the risk for now, as I do enjoy configuring Home Assistant on it, and looking at the rainmap, but there are times when when a full tablet is overkill. FrameOS is for those cases.
I've just completed a dashboard project which I'm about to release and I was also thinking of switching my frame drivers to ESP32 to run them on batteries, since they consume far less energy than even a Pi Zero. So +1 for ESP32 compatibility if time allows!
I find the costs to be reasonable, but I just bought a Waveshare e-ink ESP32 controller to try boosting battery life, since I don't need a fully fledged OS. All I'm doing on the frame is pulling an image from an URL or displaying a local image if the connection fails.
Currently I transmute some images (XKCD and NASA APOD) via a scheduled GitHub action into something fit for the various display sizes. An even more extreme approach would be to convert into the packed (4bpp for 7-colour E-ink) framebuffer format server-side. Less network efficient, but more predictable memory usage.
We’ve had JPEG support for a while, but I brought up a PNG decoder (Larry Bank’s PNGdec) recently(ish) and it’s a much better fit than JPEG for palette-based images. It uses a 32K sliding window, however, which can get spicy if you’re not careful.
In my case, massaging images into a specific size and format prior to sending them into the ESP32/Display is easier and more reliable than trying to have the ESP libraries display any arbitrary image.
> Diagram Editor: A drag-and-drop interface to combine Nim apps into scenes. Fork and edit existing apps like "OpenAI image", and "Text overlay" to suit your needs. Overwrite all fields with inline code snippets.
This looks really slick. It feels like it must be a huge effort! I wonder what they used to build this. Is the editor written in Nim?
What do you run once you write a scene: a runtime similar-ish to the editor but with a presentation mode, or does it spit out a new Nim program to run the other nim programs? Do apps get once-off invoked or is there persistent communication for apps to keep running? What triggers a frame to start, how does composting happen?
I feel like they've built a very cool generic flow-based programming system here, that happens to be used for smart frames.
Edit: I’m wrong, it’s actually React Flow!
https://github.com/FrameOS/frameos/blob/037af53e94a3b47ce5df...
The editor/controller itself is just a React+Kea app using React Flow for the diagramming part, and Flask for the backend.
For now to test that the app you built works, you must deploy it on a frame. I have a fast RPi 5 for testing, and the feedback loop is typically ~30sec. It's about a minute with a Zero W2, and about 2min with a Zero W. This is not ideal, and I'd like to improve that.
Ideally I'd like to use Nim's JS backend to build a "frame" that can be run directly in the browser for testing.
As for the other questions, the FrameOS system runs at boot, and all the apps are compiled in to that one binary and run as the scene dictates. New frames get rendered when a render event is dispatched, which can happen automatically on an interval, or as requested. Frames send logs back to their controller, but can otherwise operate completely independently.
FrameOS is a compiled binary that runs on top of Linux. At present you need to install the "Raspberry Pi OS Lite" (without the desktop environment) on a SD card before you can install FrameOS itself on top of that. So it's "just an application".
However, this is mostly because it's an early project, and this was the fastest way to get going. The next step is to see how much can be removed. Since FrameOS is a statically compiled single binary, it shouldn't need that much more than the Linux kernel? Will FrameOS be a true OS then? Android seems to be considered its own OS despite using the Linux kernel.
Once activated, FrameOS takes over your entire system, has its own `apps/` and `drivers/` folders, and in many ways already behaves like an Operating System. I'm also pondering about getting it running on an ESP32 (will need to add `drivers/wifi/`?). Without any OS below it, will it then be worthy of being called an OS? You all tell me. :shrug:
Thus is it an Operating System? It is to me, but you can choose to disagree.
At my actual job (PostHog), we sometimes call ourselves the "Product OS". This annoys me more, as a suite of webapps definitely isn't an "Operating System" in its traditional sense. I've seen -OS at the end of other things as well that aren't pure Operating Systems. It slightly bothers me, but mostly because I was around when "what OS you're using" was a defining question. Language is evolving, and "operating system" seems to describe more things to different people, than it does to you and me.
FrameOs uses Nim, which means it can be ported to run on bare-metal with no kernel. The async dispatch means that Nim also provides some light-weight co-operative multitasking.
I'd say that FrameOs is an OS (or userpsace if you prefer) that currently only runs on top of the linux kernel, but there's no reason it couldn't be ported to run directly on a microcontroller.
In your "Why FrameOS" post, you have a photo that looks like an e-ink display displaying a HomeAssistant dashboard, and under it you say "However the software side of things was rubbish." What exactly were the issues you had before writing FrameOS? It looks like it's working great in the picture at least!
I'm also curious what this actually means:
> GPT4 Support: Ask your favourite LLM to write and debug FrameOS apps for you.
I look forward to seeing this project cited as one of the first frameworks/OSs to offer first party developer assistants.
It's really basic, but has already been useful: https://frameos.net/blog/gpt4-support
It doesn't mean the value isn't overstated.
My first thought seeing this was that it validates that new apps from now on will be LLM-integrated from the start. Why not, right? LLMs used right are a great UX-improvement for almost any app.
Well, any apps that you can actually build yourself. This excludes the vast majority of them.
I dunno, I don't really have an urge to talk to my computer for most tasks. There's already language built-in to the computer that's just as natural to me as English is.
But regardless, more likely we'll just get something that's "good enough" and we'll be stuck with it regardless of actual demand—that seems to be how industry works.
Not that it matters anyway - it's MediaTek. Their partition layout and driver model from those eras is generally a disaster. There's no way you'd be able to make FrameOS in a reasonably elegant way work on that hardware.
EDIT: Yes, I meant physically de-solder/replace of the ROM - is that a nightmare?
What if you could find the economics of having people ship you their devices and either donating (to schools (NOT UNIVERSITY SLURPS)) or paying for their device to be up-ROM'd or e-cycled?
(My first job as a freshman in Highschool was desoldering ROMs and soldering new ROM chips into the boards of Amigas and Apple ][e's -- I had tons of these new ROMs on a strip and in tubes - but I never had any use for them... I with I had kept them.)
((Also, just to let you know the difficulty level - replacing a ROM chip on an Apple ][e etc was as simple as receiving an instruction set:
"Desolder the red guys. Resolder with these green guys."
That was the extent of my knowledge to ROMs in ][Es
I had no Idea at the time what I was doing.
FWIW, I had an older Fire tablet that I had loaded Android onto and it wasn’t great. It would crash randomly and the battery life was awful. These days I have a newer Fire tablet. It’s a few years old now but I still use it all the time for reading e-books from the library, and I have a few Android apps loaded onto it that I use for working on my car and they all work fine. In other words, there’s not really any reason to reflash them, the stock OS is fine.
You can potentially replace the OS image (confusingly, often referred to as a "ROM") on the flash storage, but unless the bootloader agrees to boot it (either due to it being signed correctly, or due to the bootloader being unlocked) you're SOL.
Personally, I use Amazon Fire Tablets as audio drivers around my house for Snapcast. Each tablet has USB, wifi, 3.5mm Aux, and a built in battery, which make them great for this task, especially on sale at $45 a tablet
Selfishly, I’d love support for the lower power eINK devices, like the InkPlate series which has a built in ESP32, but this is making me consider swapping them to a Pi.
Indirectly related, but I'm in the market for a 32inch+ screen which can be used for a photo frame. With the exception of Samsung's Frame, I haven't been able to find other products which is surprising to me because it seems like such a simple use case. Here's what I've found so far:
- TVs and monitors: downside is keeping these on 24-hours isn't great for energy consumption
- color e-ink: these are of course usually a maximum of 13 or so inches
- Samsung the frame - alas, has good features and a good look, but downsides are expensive(!) and Samsung(!!)
Do you have any recommendations?
I might be wrong, but that's an assumption.
A 'feature' of the Samsung TV that copes with this is that it has a motion sensor and turns off when no one is around. Would love an open hardware version of this.
Where I would download the sdram binary image and flash with Balena then boot on the Pi.
Great work anyway! It was a nice opportunity to read up on Nim language too.
However for now, the RPi imager, with its built in "enter your wifi credentials and SSH key" dialog was the best and easiest way to get started.
On a serious note, yes, it's planned. The ESP is a very limited chip. If you want to display a BMP from a HTTP source, or a quick calendar, it's great. Try doing HTTPS, image downscaling or any serious processing though. Forget about things like browser screenshots, which you can't even do on 32bit linux anymore. Forget the 60fps mode over HDMI we can now do.
I'll try to get it working regardless, but it's but not a personal priority today over the other items in the todo list. You're free to lend a helping hand of course.
FrameOS is also targeting 60+FPS LCD and other screens, which will be hard for ESP to run. Thus it's for the raspberry. I'd love to scale it down though, and deliberately chose Nim so that it would at least be theoretically possible.
I also need to get doom running on it...
Seems to require a pi. Wonder if it can work with this: https://amazon.com/dp/B0C4TS1NMS
Generally this is solved by displaying more than one image and rotating between images on a time interval.
> It's designed for both screens that update 60 seconds per frame, and for screens that update 60 frames per second.
Or that's what at least I infer from that, because I don't know of 60 fps eInk displays :).
It should be really easy to build a FrameOS app that does this. Add one node at the start of the render loop to increase the image accordingly, and one at the end to crop it back down. I was planning to use a similar technique to display smooth scrolling animations/slideshows, but it can definitely be used to prevent burnin.
Take a $15 Pi Zero W 2, and a screen costing anywhere between $50 to $200. 3d-print a case around them both, and for a third of the price of a new iPad, you'll have a simple and secure single function screen in your house...
One of the next items on my todo list [2] is to add back support for all the different waveshare drivers out there. They all follow a similar pattern, so I should be able to generate "best guess" drivers for most of them.
Which display do you have?
[1] https://github.com/FrameOS/frameos/tree/main/frameos/src/dri... [2] https://github.com/FrameOS/frameos/issues/1
If you're fine with just displaying an image from an URL, it'll work today. If you want nicer slideshows or rotating images, you'd have to write some code to make it work, but it's all possible today.
A nicer interface tailored specifically for shop windows slideshows is something that could come at a later date.