@log4j Full end-to-end samsung remote protocol + ESP32 capture source code is here:
github.com/ngxson/samsung-tv-root/blob/master/sam…
37 likes · 3 reposts · 748 views
Coding is solved* (exclusions apply)
Good news, everyone! Having been inspired to revolutionize the field of computer science, I can now report that coding is solved! Sure, only if you care about x86 Linux binaries that print and exit, but "big journeys" and "small steps" and what not.
CRAP (Compiler Replacement for Assembling Programs) is a Gemma 4 E2B fine tune that takes prompts like generate a Linux x86_64 binary that prints 'boop' and emits a working ELF binary (as hex, most of the time, every time). See, since programs end up as a binary anyway, why not just skip the middleman and write the binary itself? No compiler, no assembler, no tool calls. v1.1 is out with improved multi turn and out of distribution performance. Trust me, I know, this is super important work.
preview.redd.it
v1.1 eval numbers for the nerds (eval is scored on behavior: the binary has to run, print the right string and exit with the right code):
- Held out legacy set: 20/23, same as v1
- Novel strings: 26/40 (v1: 8/40)
- Multi turn (~3 turns): 10/12 (v1: 0/12)
- Doubled character strings (boom, etc.): 18/24 (v1: 2/24)
- Random jank exit codes it never trained on: 23/25
An interesting tidbit: one training run hit 0.038 loss while still failing 11 of its 12 trained exit codes, so gradient descent != task completion ascent.
Aaannndddnd it runs in your browser.
preview.redd.it
The demo loads the Q6_K GGUF (~3.6 GiB) through wllama on WebGPU, streams the hex, parses it and hands you the ELF to run yourself (naturally, you need to download and run the actual binary, the browser won't do that). Q6_K scores 109/144 against the full f16's 114/144 (the five additional failed for Q6 are wrong values, not totally broken binaries). Q4_K_M scored 3/144, so the demo doesn't use it (that quant is crap, not CRAP) ... concerning. Also, tested in Chrome on an M4 Pro Mac; Firefox loads it but generates slowly and nothing else has been tested.
- Demo: huggingface.co
- Weights (v1.1): huggingface.co
- "Paper": github.com/matthewhaynesonline/crap-public/blob/m…
- Code: matthewhaynesonline/crap-public
- Blog post: blog.studiohaynes.com
- Video: youtu.be
Fine print for the buzzkills: only programs that print a string and exit can be generated. Obviously, a compiler does that deterministically, correctly and in milliseconds; CRAP does it with several gigabytes of weights, slower and occasionally incorrectly.
449 points · 65 comments
Ouija Offline - A Séance Where the Ghost Lives on Your Phone
This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine
What I Built
Ouija Offline is a Ouija board you carry in your pocket. You ask a question, and a planchette slides across a candlelit wooden board, spelling out an answer one glowing letter at a time. The phone buzzes as it lands on each letter, and a low drone hums underneath.
The "spirit" is an open-weight language model running entirely on your phone, inside the browser. There's no server, no account, and no API key. Once the model has downloaded, you can put the phone in airplane mode, turn off the lights, and the board still answers. That's how I read the theme: the ghost is literally in the machine.
You can call:
- 🕯️ Eleanor Vance, a governess who drowned in Blackwater Lake in 1893 and is still looking for the children
- 💾 COBOL, a programming language declared dead every decade since 1980 that still runs your bank (it has opinions about JavaScript)
- 🌊 Ezra Holloway, the lighthouse keeper whose lamp went dark the night the Margaret Anne hit the rocks
- 🌼 Doña Catrina, a Día de los Muertos visitor who follows the marigold petals home and mostly wants pan de muerto
- 🕊️ Someone you remember: type in a loved one's name and a few memories, and call them home for the night. It's a small digital ofrenda.
Every Ouija board comes with one rule:
> Always say goodbye.
If you leave the board without saying goodbye, the next time you open the app Something is waiting at the top of the list. It won't let any other spirit through until you sit down with it and close the board properly. Shake your phone and the spirits notice. Stay silent too long and the planchette starts moving by itself.
Demo
🔗 Try it: samarthsubramanya.github.io
For the full effect, open it on your phone, tap Add to Home Screen, download a vessel, switch on airplane mode, and ask, "Is anyone here?"
<!-- Add a short screen recording here: the airplane-mode toggle, then the planchette spelling an answer. -->
| Choose a vessel | Someone you remember | Doña Catrina |
| --- | --- | --- |
| !Choosing an open-weight model | !A séance with a remembered grandmother | !Doña Catrina spelling an answer |
Code
{% github samarthsubramanya/Hacktoberfest26_W4 %}
How I Built It
The engine is wllama v3, the WebAssembly build of llama.cpp. That one open-source runtime does all the heavy lifting:
- It runs on WebGPU when the phone's browser supports it and falls back to multi-threaded CPU when it doesn't, so almost any phone can hold a séance. If a phone advertises WebGPU but its driver fails, the app quietly retries on the CPU.
- It loads standard GGUF files, so swapping models just means changing a URL. I ship three "vessels", all open-weight and quantized to Q4_K_M:
- The Medium: Qwen2.5 0.5B Instruct, 398 MB, Apache-2.0 (the default)
- The Wisp: SmolLM2 360M Instruct, 271 MB, Apache-2.0, for older phones
- The Oracle: Llama 3.2 1B Instruct, 808 MB, the most eloquent ghost
- …or bring your own: pick any .gguf file on your phone and it speaks through the board.
- It caches the weights in the browser's Origin Private File System, so each phone downloads them once.
flowchart LR
Q[Your question] --> P[Spirit prompt + examples + recent history]
P --> W["wllama (llama.cpp in WebAssembly)"]
W -->|WebGPU or CPU| T[Token stream]
T --> C[Clean into board words]
C --> B[Planchette moves letter by letter]
HF[(Hugging Face: one-time GGUF download)] -.-> OPFS[(On-device model cache)] --> W
The rest is deliberately plain open web tech, with no build step and no dependencies: ES modules, CSS for the board, synthesized WebAudio for the drone and the wooden "tock" of the planchette, and the open IM Fell English fonts bundled in the repo. A service worker keeps the app and the 9 MB llama.cpp runtime on the device. It also adds the cross-origin isolation headers that GitHub Pages can't set, which lets llama.cpp use every CPU core.
Three things I learned getting a 0.5B model to haunt a board
1. Tiny models follow examples more than rules. A list of rules ("answer in at most 6 words, uppercase, stay in character") only gets you part of the way with a 0.5B model. With the examples pasted into the system prompt, it still drifted into long, lowercase sentences. What worked best was giving each spirit three example exchanges as real chat turns (user: Where are you? → assistant: UNDER THE ICE). Small models copy the shape of a conversation remarkably well.
2. One bad answer ruins the séance. My first build opened every séance with a stage direction: "(The living person has opened the board. Announce yourself.)" The model answered with gibberish, the gibberish went into the chat history, and every later answer got worse. Opening with a plain "Is anyone here?" fixed the whole session. With small models, the history is part of the prompt.
3. Streaming turns latency into suspense. Tokens stream into a word queue, and the planchette starts moving as soon as the first word is complete, while the model is still generating the rest. Output is cleaned on the fly into what a board can spell (A–Z, 0–9, YES, NO, GOOD BYE). Tiny models also love to say GOODBYE in their very first answer, so a spirit isn't allowed to leave until it has answered a few questions.
Why Does Open Innovation Matter?
It works with the lights and the internet off. This is a séance app, and the best place to use it is a dark room with no signal. With a closed API, the most atmospheric moment (airplane mode on, planchette still moving) would be an error message. With open weights running locally, the spirits don't need a network.
Your dead stay yours. The Someone you remember spirit asks for the name of a person you lost and the things they loved. That's about as personal as data gets. Here, those memories stay in the phone's local storage and are only ever read by a model running on the same phone. There's no server they could leak from, because there's no server.
It costs nothing to run, so it can't be switched off. There are no per-token charges, no rate limits, and no key to rotate. Every token is computed on the user's own device. The app is static files on GitHub Pages and the weights are openly licensed. If I stop maintaining it tomorrow, it keeps working on every phone that has already opened it, which suits a holiday about things that outlive us.
I control how the ghost behaves. Because I own the runtime and choose the weights, I can pick a model per device, tune sampling for eerie answers, cap tokens to fit a board, and let users bring their own GGUF: a fine-tune, another language, or a horror-tuned model. A closed endpoint allows none of that.
Where open beat closed: a frontier API would give smarter answers, but a Ouija spirit is supposed to be terse, cryptic, and a little wrong. A 400 MB open model that runs offline, privately, and for free on a phone suits the job better than a far bigger model that needs a connection and a credit card.
My Agent Session
I designed and built this with an AI coding agent. It weighed mobile approaches, smoke-tested three models in a headless browser, found the history problem above, and verified the offline mode end to end.
<!-- Save the session with DevRelay and embed it here with the agent_session tag, or link to it. -->
The Spirit of It
<!-- Swap in your own moment if you have one: try "Someone you remember" on your phone, in airplane mode, for someone you miss. -->
During testing I gave Someone you remember a grandmother's name and two lines of memories: tamales every Christmas, called me mijo. Then I asked, "Do you remember the tamales?" The planchette crawled across the board and spelled out YES I REMEMBER THE TAMALES.
It's a half-billion-parameter model doing next-token prediction. But it's running on the phone in your hand, with no one else listening, and for a second the line between past and present does feel a little thinner.
¡Feliz Día de los Muertos! And remember: always say goodbye. 🕯️
Prize Categories
Best Use of Gemma
<!-- No partner technology is used yet, so this entry competes for the overall prize. If a Gemma vessel is added, list "Best Use of Gemma" here; otherwise delete this section before publishing. -->
Entering the overall prize.
Топ-10 GitHub за 3 дня: tongjiang-lab, MiniCPM-OCR
Обзор: топ-10 новых репозиториев GitHub за 26–29 октября 2026 — open-source проекты, которые быстрее всех набрали звёзды.
В выпуске: 54 офлайн-3D-урока по школьным предметам; OCR-модель MiniCPM с проверкой качества; океан на three.js с волнами FFT.
1. smithjohn78390/tongjiang-lab — 54 интерактивных 3D-урока по физике, химии, биологии и географии (HTML, +742 ★)
2. OpenBMB/MiniCPM-OCR — OCR-модель MiniCPM-OCR 1.0 на 1,3 млрд параметров и оценщик Jev (Python, +405 ★)
3. MiniMax-AI/mcode-stack — Набор скиллов и рабочих правил команды MiniMax Code для ИИ-агентов (Python, +359 ★)
4. haydenschmitty/floorplan — Плагин для Claude Code и Codex: интерактивная карта кодовой базы (JavaScript, +314 ★)
5. toyxyz/toyxyz_RGBMocap — Захват движения с видео в Windows: тело и кости в 3D локально (Python, +267 ★)
6. brainstormity/LightPost — Самостоятельный планировщик постов в соцсети с одного дашборда (Python, +217 ★)
7. Humpalumps/Ultra-Water — Океан в реальном времени для three.js: волны FFT, буруны, пена, каустика (JavaScript, +195 ★)
8. ngxson/esp32-usb-to-airprint — ESP32-S3 превращает старый USB-принтер в сетевой с AirPrint и сканером (C, +177 ★)
9. molence/Mol-1 — Открытая модель предсказания структур белков, ДНК, РНК и лигандов (Python, +173 ★)
10. oxnw/ai-phone — SIP-телефон с локальными речевыми моделями на Apple Silicon (Python, +160 ★)
Источник: GitHub Search API, репозитории созданы с 2026-10-26, отсортированы по звёздам.
Лидер: smithjohn78390/tongjiang-lab
Остальные: OpenBMB/MiniCPM-OCR, MiniMax-AI/mcode-stack, haydenschmitty/floorplan, toyxyz/toyxyz_RGBMocap, brainstormity/LightPost, Humpalumps/Ultra-Water, ngxson/esp32-usb-to-airprint, molence/Mol-1, oxnw/ai-phone
#GitHub #opensource #программирование
Каждые 3 дня — 10 новых open-source проектов GitHub, быстрее всех набравших звёзды. Подписывайся, чтобы не пропустить следующий выпуск.
1 like · 6 views
用一块 ESP32-S3 把只有 USB 接口的旧打印机接入 Wi-Fi,提供 AirPrint、Mopria 和浏览器扫描入口。
ngxson/esp32-usb-to-airprint
ESP32 USB to AirPrint 是运行在 ESP32-S3 上的打印机与扫描仪网关,板子一端连接 USB 打印机,另一端加入 Wi-Fi,让 iPhone、iPad、Mac、Android 和 Linux 无需额外驱动即可打印。
15 likes · 4 reposts · 925 views
(How) Can LLMs run in the browser?
A big push here at NobodyWho is to get language models running in the browser using WebAssembly.
After working on it for a few weeks we've gotten a good idea of the landscape. One thing that's very clear, and this will come as a surprise, is that browsers are actually kinda complicated.
First, we use Rust at NobodyWho, and there are (at least) three different compilation targets for Rust for WASM: Emscripten, WASI, and wasm32-unknown-unknown with wasm-bindgen. All with different levels of support in various dependencies and within Rust itself.
Second, there are (at least) three different hardware backends: CPU, WebGPU, and WebNN, with the last two being the only reasonably fast ones and both being very new or experimental.
Third, there's the question of whether the LLM will be running in a website or a browser extension.
Fourth, and importantly, there are many different browsers and many different browser versions. Many of the features needed for running LLMs in a browser are relatively new, and browser support can be spotty, especially if your users haven't updated for a while.
Spoiled for choice
Fortunately, many of these dimensions can get flattened by technical constraints or a specific use case.
At NobodyWho we use both llama.cpp and the ONNX Runtime as inference engines, and they both assume a system library. That's an issue for wasm-bindgen, since the second unknown in wasm32-unknown-unknown means "unknown OS", i.e. no system library. This leaves WASI and Emscripten, with Emscripten being the obvious choice given that WASI in the browser is… experimental.¹
The story for hardware backends is just as clear: run with WebGPU when available and fall back to CPU when WebGPU isn't available (or when on Firefox, since apparently GPU is slower there). Why not WebNN? Again because it's… experimental.²
At NobodyWho we're focusing on running LLMs in a website rather than a browser extension, since that's what we have a use case for, but there are some interesting tradeoffs between the two. A big issue with running an LLM in the browser is that useful models are _big_. Even the small models are typically a few hundred MB, which is much more than a typical website. Given how important load times are, that can be a huge blocker. For an extension, you download the model once, deliberately, when you install the extension, so it taking some time is less of an issue,³ while website use is generally more ephemeral. This is less true for websites that users typically return to often, since the site can then cache the model so the download cost is only paid once.
Lastly we have browsers, and it's a mess. The most relevant features are WebGPU, Memory64 (see my previous post), and SharedArrayBuffer (for multi-threading). All of these have patchy support across browsers and platforms. Often, support just isn't implemented yet. Other times it is, but requires a feature flag to be turned on in the browser (good luck getting your non-technical users to do that). Sometimes, it is officially supported, but just works really poorly. The best example of this is Firefox's WebGPU support mentioned above.
Multi-threading and SharedArrayBuffer is its own can of worms because it requires strict cross-origin headers (COOP/COEP) which can be a real problem for some sites. And of course the easiest way to meet these requirements are different for each browser. On top of that, browsers vary wildly in how much storage they allow for websites, what their eviction policies are, how aggressive they are in killing workers, etc. The only good news is that of the large number of different browsers, in practice most people use Chromium-based browsers like Chrome and Edge,⁴ and that is where support is by far the best.
LLMs do run in the browser
But not cleanly. There are a lot of options and target platforms/browsers/use cases all requiring you to handle stuff differently. Until browser support for the necessary features becomes much more mature, a library for browser LLM inference that just works in all browsers, on all platforms, for most use cases, will require a _lot_ of work on top of the basic browser APIs. A bit ironic given that part of the dream of WASM is to _not_ depend on specific platforms so heavily.
I think incorporating such a general web LLM library into NobodyWho as part of our mission to support all platforms would be super cool, but for now we're exploring a few specific use cases where Emscripten and WebGPU with CPU fallback are the right choice. We haven't figured out how to handle the spotty browser support yet, but we'll get to that in time. Hopefully you'll see a release announcement right here within the next few weeks!
---
Notes
¹ Everything is shimmed ATM, which makes it pretty damn slow.
² It's supported nowhere. But at least there's a bug report on that for Chromium!
³ Extensions have other issues though. Browsers generally aggressively kill background processes like those an extension would hold an LLM in, so without some hacky solutions (e.g. offscreen documents) to keep them alive you'd need to constantly reload the multi-GB model from disk.
⁴ I'm not saying this is a _good_ thing, just that it is the case, unless you're targeting some specific demographics. E.g. iOS browsers are all WebKit based (like Safari) while the proportion of Firefox users is higher among Google hating skeptical tech-nerds.
一块廉价 ESP32‑S3,即可为老式打印机添加 AirPrint/AirScan 支持。
👉 ngxson/esp32-usb-to-airprint t.co
5 likes · 338 views
The de-enshitifcation of everything continues
Here's an open source project that allows you to print documents with Apple's AirPrint, on USB-only printers
ngxson/esp32-usb-to-airprint
27 likes · 1 repost
@log4j got the app; I'm plugging it into the TV, will wait for until tmr to report:
github.com/ngxson/samsung-tv-root/tree/master/fli…
24 likes · 960 views
Alright, public my progress so far: open source bootloader for the printer is done!
Now just a loop of RE the stock fw --> reimplement --> flash over USB --> validate, until we have all the functionalities
ngxson/canon-mg2550s-firmware
19 likes · 3 reposts · 419 views
Mentions
@log4j Full end-to-end samsung remote protocol + ESP32 capture source code is here: github.com/ngxson/samsung-tv-root/blob/master/sam…
Coding is solved* (exclusions apply) Good news, everyone! Having been inspired to revolutionize the field of computer science, I can now report that coding is solved! Sure, only if you care about x86 Linux binaries that print and exit, but "big journeys" and "small steps" and what not. CRAP (Compiler Replacement for Assembling Programs) is a Gemma 4 E2B fine tune that takes prompts like generate a Linux x86_64 binary that prints 'boop' and emits a working ELF binary (as hex, most of the time, every time). See, since programs end up as a binary anyway, why not just skip the middleman and write the binary itself? No compiler, no assembler, no tool calls. v1.1 is out with improved multi turn and out of distribution performance. Trust me, I know, this is super important work. preview.redd.it v1.1 eval numbers for the nerds (eval is scored on behavior: the binary has to run, print the right string and exit with the right code): - Held out legacy set: 20/23, same as v1 - Novel strings: 26/40 (v1: 8/40) - Multi turn (~3 turns): 10/12 (v1: 0/12) - Doubled character strings (boom, etc.): 18/24 (v1: 2/24) - Random jank exit codes it never trained on: 23/25 An interesting tidbit: one training run hit 0.038 loss while still failing 11 of its 12 trained exit codes, so gradient descent != task completion ascent. Aaannndddnd it runs in your browser. preview.redd.it The demo loads the Q6_K GGUF (~3.6 GiB) through wllama on WebGPU, streams the hex, parses it and hands you the ELF to run yourself (naturally, you need to download and run the actual binary, the browser won't do that). Q6_K scores 109/144 against the full f16's 114/144 (the five additional failed for Q6 are wrong values, not totally broken binaries). Q4_K_M scored 3/144, so the demo doesn't use it (that quant is crap, not CRAP) ... concerning. Also, tested in Chrome on an M4 Pro Mac; Firefox loads it but generates slowly and nothing else has been tested. - Demo: huggingface.co - Weights (v1.1): huggingface.co - "Paper": github.com/matthewhaynesonline/crap-public/blob/m… - Code: matthewhaynesonline/crap-public - Blog post: blog.studiohaynes.com - Video: youtu.be Fine print for the buzzkills: only programs that print a string and exit can be generated. Obviously, a compiler does that deterministically, correctly and in milliseconds; CRAP does it with several gigabytes of weights, slower and occasionally incorrectly.
Ouija Offline - A Séance Where the Ghost Lives on Your Phone This is a submission for the Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine What I Built Ouija Offline is a Ouija board you carry in your pocket. You ask a question, and a planchette slides across a candlelit wooden board, spelling out an answer one glowing letter at a time. The phone buzzes as it lands on each letter, and a low drone hums underneath. The "spirit" is an open-weight language model running entirely on your phone, inside the browser. There's no server, no account, and no API key. Once the model has downloaded, you can put the phone in airplane mode, turn off the lights, and the board still answers. That's how I read the theme: the ghost is literally in the machine. You can call: - 🕯️ Eleanor Vance, a governess who drowned in Blackwater Lake in 1893 and is still looking for the children - 💾 COBOL, a programming language declared dead every decade since 1980 that still runs your bank (it has opinions about JavaScript) - 🌊 Ezra Holloway, the lighthouse keeper whose lamp went dark the night the Margaret Anne hit the rocks - 🌼 Doña Catrina, a Día de los Muertos visitor who follows the marigold petals home and mostly wants pan de muerto - 🕊️ Someone you remember: type in a loved one's name and a few memories, and call them home for the night. It's a small digital ofrenda. Every Ouija board comes with one rule: > Always say goodbye. If you leave the board without saying goodbye, the next time you open the app Something is waiting at the top of the list. It won't let any other spirit through until you sit down with it and close the board properly. Shake your phone and the spirits notice. Stay silent too long and the planchette starts moving by itself. Demo 🔗 Try it: samarthsubramanya.github.io For the full effect, open it on your phone, tap Add to Home Screen, download a vessel, switch on airplane mode, and ask, "Is anyone here?" <!-- Add a short screen recording here: the airplane-mode toggle, then the planchette spelling an answer. --> | Choose a vessel | Someone you remember | Doña Catrina | | --- | --- | --- | | !Choosing an open-weight model | !A séance with a remembered grandmother | !Doña Catrina spelling an answer | Code {% github samarthsubramanya/Hacktoberfest26_W4 %} How I Built It The engine is wllama v3, the WebAssembly build of llama.cpp. That one open-source runtime does all the heavy lifting: - It runs on WebGPU when the phone's browser supports it and falls back to multi-threaded CPU when it doesn't, so almost any phone can hold a séance. If a phone advertises WebGPU but its driver fails, the app quietly retries on the CPU. - It loads standard GGUF files, so swapping models just means changing a URL. I ship three "vessels", all open-weight and quantized to Q4_K_M: - The Medium: Qwen2.5 0.5B Instruct, 398 MB, Apache-2.0 (the default) - The Wisp: SmolLM2 360M Instruct, 271 MB, Apache-2.0, for older phones - The Oracle: Llama 3.2 1B Instruct, 808 MB, the most eloquent ghost - …or bring your own: pick any .gguf file on your phone and it speaks through the board. - It caches the weights in the browser's Origin Private File System, so each phone downloads them once. flowchart LR Q[Your question] --> P[Spirit prompt + examples + recent history] P --> W["wllama (llama.cpp in WebAssembly)"] W -->|WebGPU or CPU| T[Token stream] T --> C[Clean into board words] C --> B[Planchette moves letter by letter] HF[(Hugging Face: one-time GGUF download)] -.-> OPFS[(On-device model cache)] --> W The rest is deliberately plain open web tech, with no build step and no dependencies: ES modules, CSS for the board, synthesized WebAudio for the drone and the wooden "tock" of the planchette, and the open IM Fell English fonts bundled in the repo. A service worker keeps the app and the 9 MB llama.cpp runtime on the device. It also adds the cross-origin isolation headers that GitHub Pages can't set, which lets llama.cpp use every CPU core. Three things I learned getting a 0.5B model to haunt a board 1. Tiny models follow examples more than rules. A list of rules ("answer in at most 6 words, uppercase, stay in character") only gets you part of the way with a 0.5B model. With the examples pasted into the system prompt, it still drifted into long, lowercase sentences. What worked best was giving each spirit three example exchanges as real chat turns (user: Where are you? → assistant: UNDER THE ICE). Small models copy the shape of a conversation remarkably well. 2. One bad answer ruins the séance. My first build opened every séance with a stage direction: "(The living person has opened the board. Announce yourself.)" The model answered with gibberish, the gibberish went into the chat history, and every later answer got worse. Opening with a plain "Is anyone here?" fixed the whole session. With small models, the history is part of the prompt. 3. Streaming turns latency into suspense. Tokens stream into a word queue, and the planchette starts moving as soon as the first word is complete, while the model is still generating the rest. Output is cleaned on the fly into what a board can spell (A–Z, 0–9, YES, NO, GOOD BYE). Tiny models also love to say GOODBYE in their very first answer, so a spirit isn't allowed to leave until it has answered a few questions. Why Does Open Innovation Matter? It works with the lights and the internet off. This is a séance app, and the best place to use it is a dark room with no signal. With a closed API, the most atmospheric moment (airplane mode on, planchette still moving) would be an error message. With open weights running locally, the spirits don't need a network. Your dead stay yours. The Someone you remember spirit asks for the name of a person you lost and the things they loved. That's about as personal as data gets. Here, those memories stay in the phone's local storage and are only ever read by a model running on the same phone. There's no server they could leak from, because there's no server. It costs nothing to run, so it can't be switched off. There are no per-token charges, no rate limits, and no key to rotate. Every token is computed on the user's own device. The app is static files on GitHub Pages and the weights are openly licensed. If I stop maintaining it tomorrow, it keeps working on every phone that has already opened it, which suits a holiday about things that outlive us. I control how the ghost behaves. Because I own the runtime and choose the weights, I can pick a model per device, tune sampling for eerie answers, cap tokens to fit a board, and let users bring their own GGUF: a fine-tune, another language, or a horror-tuned model. A closed endpoint allows none of that. Where open beat closed: a frontier API would give smarter answers, but a Ouija spirit is supposed to be terse, cryptic, and a little wrong. A 400 MB open model that runs offline, privately, and for free on a phone suits the job better than a far bigger model that needs a connection and a credit card. My Agent Session I designed and built this with an AI coding agent. It weighed mobile approaches, smoke-tested three models in a headless browser, found the history problem above, and verified the offline mode end to end. <!-- Save the session with DevRelay and embed it here with the agent_session tag, or link to it. --> The Spirit of It <!-- Swap in your own moment if you have one: try "Someone you remember" on your phone, in airplane mode, for someone you miss. --> During testing I gave Someone you remember a grandmother's name and two lines of memories: tamales every Christmas, called me mijo. Then I asked, "Do you remember the tamales?" The planchette crawled across the board and spelled out YES I REMEMBER THE TAMALES. It's a half-billion-parameter model doing next-token prediction. But it's running on the phone in your hand, with no one else listening, and for a second the line between past and present does feel a little thinner. ¡Feliz Día de los Muertos! And remember: always say goodbye. 🕯️ Prize Categories Best Use of Gemma <!-- No partner technology is used yet, so this entry competes for the overall prize. If a Gemma vessel is added, list "Best Use of Gemma" here; otherwise delete this section before publishing. --> Entering the overall prize.
Топ-10 GitHub за 3 дня: tongjiang-lab, MiniCPM-OCR Обзор: топ-10 новых репозиториев GitHub за 26–29 октября 2026 — open-source проекты, которые быстрее всех набрали звёзды. В выпуске: 54 офлайн-3D-урока по школьным предметам; OCR-модель MiniCPM с проверкой качества; океан на three.js с волнами FFT. 1. smithjohn78390/tongjiang-lab — 54 интерактивных 3D-урока по физике, химии, биологии и географии (HTML, +742 ★) 2. OpenBMB/MiniCPM-OCR — OCR-модель MiniCPM-OCR 1.0 на 1,3 млрд параметров и оценщик Jev (Python, +405 ★) 3. MiniMax-AI/mcode-stack — Набор скиллов и рабочих правил команды MiniMax Code для ИИ-агентов (Python, +359 ★) 4. haydenschmitty/floorplan — Плагин для Claude Code и Codex: интерактивная карта кодовой базы (JavaScript, +314 ★) 5. toyxyz/toyxyz_RGBMocap — Захват движения с видео в Windows: тело и кости в 3D локально (Python, +267 ★) 6. brainstormity/LightPost — Самостоятельный планировщик постов в соцсети с одного дашборда (Python, +217 ★) 7. Humpalumps/Ultra-Water — Океан в реальном времени для three.js: волны FFT, буруны, пена, каустика (JavaScript, +195 ★) 8. ngxson/esp32-usb-to-airprint — ESP32-S3 превращает старый USB-принтер в сетевой с AirPrint и сканером (C, +177 ★) 9. molence/Mol-1 — Открытая модель предсказания структур белков, ДНК, РНК и лигандов (Python, +173 ★) 10. oxnw/ai-phone — SIP-телефон с локальными речевыми моделями на Apple Silicon (Python, +160 ★) Источник: GitHub Search API, репозитории созданы с 2026-10-26, отсортированы по звёздам. Лидер: smithjohn78390/tongjiang-lab Остальные: OpenBMB/MiniCPM-OCR, MiniMax-AI/mcode-stack, haydenschmitty/floorplan, toyxyz/toyxyz_RGBMocap, brainstormity/LightPost, Humpalumps/Ultra-Water, ngxson/esp32-usb-to-airprint, molence/Mol-1, oxnw/ai-phone #GitHub #opensource #программирование Каждые 3 дня — 10 новых open-source проектов GitHub, быстрее всех набравших звёзды. Подписывайся, чтобы не пропустить следующий выпуск.
用一块 ESP32-S3 把只有 USB 接口的旧打印机接入 Wi-Fi,提供 AirPrint、Mopria 和浏览器扫描入口。 ngxson/esp32-usb-to-airprint ESP32 USB to AirPrint 是运行在 ESP32-S3 上的打印机与扫描仪网关,板子一端连接 USB 打印机,另一端加入 Wi-Fi,让 iPhone、iPad、Mac、Android 和 Linux 无需额外驱动即可打印。
(How) Can LLMs run in the browser? A big push here at NobodyWho is to get language models running in the browser using WebAssembly. After working on it for a few weeks we've gotten a good idea of the landscape. One thing that's very clear, and this will come as a surprise, is that browsers are actually kinda complicated. First, we use Rust at NobodyWho, and there are (at least) three different compilation targets for Rust for WASM: Emscripten, WASI, and wasm32-unknown-unknown with wasm-bindgen. All with different levels of support in various dependencies and within Rust itself. Second, there are (at least) three different hardware backends: CPU, WebGPU, and WebNN, with the last two being the only reasonably fast ones and both being very new or experimental. Third, there's the question of whether the LLM will be running in a website or a browser extension. Fourth, and importantly, there are many different browsers and many different browser versions. Many of the features needed for running LLMs in a browser are relatively new, and browser support can be spotty, especially if your users haven't updated for a while. Spoiled for choice Fortunately, many of these dimensions can get flattened by technical constraints or a specific use case. At NobodyWho we use both llama.cpp and the ONNX Runtime as inference engines, and they both assume a system library. That's an issue for wasm-bindgen, since the second unknown in wasm32-unknown-unknown means "unknown OS", i.e. no system library. This leaves WASI and Emscripten, with Emscripten being the obvious choice given that WASI in the browser is… experimental.¹ The story for hardware backends is just as clear: run with WebGPU when available and fall back to CPU when WebGPU isn't available (or when on Firefox, since apparently GPU is slower there). Why not WebNN? Again because it's… experimental.² At NobodyWho we're focusing on running LLMs in a website rather than a browser extension, since that's what we have a use case for, but there are some interesting tradeoffs between the two. A big issue with running an LLM in the browser is that useful models are _big_. Even the small models are typically a few hundred MB, which is much more than a typical website. Given how important load times are, that can be a huge blocker. For an extension, you download the model once, deliberately, when you install the extension, so it taking some time is less of an issue,³ while website use is generally more ephemeral. This is less true for websites that users typically return to often, since the site can then cache the model so the download cost is only paid once. Lastly we have browsers, and it's a mess. The most relevant features are WebGPU, Memory64 (see my previous post), and SharedArrayBuffer (for multi-threading). All of these have patchy support across browsers and platforms. Often, support just isn't implemented yet. Other times it is, but requires a feature flag to be turned on in the browser (good luck getting your non-technical users to do that). Sometimes, it is officially supported, but just works really poorly. The best example of this is Firefox's WebGPU support mentioned above. Multi-threading and SharedArrayBuffer is its own can of worms because it requires strict cross-origin headers (COOP/COEP) which can be a real problem for some sites. And of course the easiest way to meet these requirements are different for each browser. On top of that, browsers vary wildly in how much storage they allow for websites, what their eviction policies are, how aggressive they are in killing workers, etc. The only good news is that of the large number of different browsers, in practice most people use Chromium-based browsers like Chrome and Edge,⁴ and that is where support is by far the best. LLMs do run in the browser But not cleanly. There are a lot of options and target platforms/browsers/use cases all requiring you to handle stuff differently. Until browser support for the necessary features becomes much more mature, a library for browser LLM inference that just works in all browsers, on all platforms, for most use cases, will require a _lot_ of work on top of the basic browser APIs. A bit ironic given that part of the dream of WASM is to _not_ depend on specific platforms so heavily. I think incorporating such a general web LLM library into NobodyWho as part of our mission to support all platforms would be super cool, but for now we're exploring a few specific use cases where Emscripten and WebGPU with CPU fallback are the right choice. We haven't figured out how to handle the spotty browser support yet, but we'll get to that in time. Hopefully you'll see a release announcement right here within the next few weeks! --- Notes ¹ Everything is shimmed ATM, which makes it pretty damn slow. ² It's supported nowhere. But at least there's a bug report on that for Chromium! ³ Extensions have other issues though. Browsers generally aggressively kill background processes like those an extension would hold an LLM in, so without some hacky solutions (e.g. offscreen documents) to keep them alive you'd need to constantly reload the multi-GB model from disk. ⁴ I'm not saying this is a _good_ thing, just that it is the case, unless you're targeting some specific demographics. E.g. iOS browsers are all WebKit based (like Safari) while the proportion of Firefox users is higher among Google hating skeptical tech-nerds.
一块廉价 ESP32‑S3,即可为老式打印机添加 AirPrint/AirScan 支持。 👉 ngxson/esp32-usb-to-airprint t.co
The de-enshitifcation of everything continues Here's an open source project that allows you to print documents with Apple's AirPrint, on USB-only printers ngxson/esp32-usb-to-airprint
@log4j got the app; I'm plugging it into the TV, will wait for until tmr to report: github.com/ngxson/samsung-tv-root/tree/master/fli…
Alright, public my progress so far: open source bootloader for the printer is done! Now just a loop of RE the stock fw --> reimplement --> flash over USB --> validate, until we have all the functionalities ngxson/canon-mg2550s-firmware