The best Hacker News stories from Show from the past day
Latest posts:
Show HN: QBasic Gorillas (Repeeled)
I've found the most engaging way to practice techniques for AI-assisted development and test models is to build fun side projects in vanilla JS.<p>I spent many hours playing (and studying and editing) QBasic Gorillas, and this is a vanilla JS implementation using Fable and Opus.<p>Play 1-on-1 hotseat or against the computer. A bit of extra camera snazz as well.
Show HN: Be the ChatBOT
I made this experimental art project/game that's an LLM chat assistant, but where <i>you're</i> the AI.<p>I wanted people to get a visceral sense of what it's like to answer the kinds of things that people prompt their chatbots day in and day out.<p>If you're interested, I wrote up some more info on how I made it, including how the "user" prompts are generated with an eye for realism: <a href="https://bethechatbot.com/about" rel="nofollow">https://bethechatbot.com/about</a><p>Hope you enjoy it! I'd love to hear people's takeaways.
Show HN: A zoomable timeline of 4M Wikipedia events
I'm building a journal app in Kotlin Multiplatform and for this purpose I have created a zoomable timeline interface.<p>This is a side-project where I reuse the timeline interface to display 4 million events imported from Wikipedia / Wikidata, scored using PageRank. There is more information on the about page.<p>If you're interested in the stack: I use Kotlin Multiplatform extensively, with Compose Multiplatform for the UI, communicates with the backend using Kotlinx-RPC and behind the hood a simple Postgres database on a Hetzner machine.
Show HN: Mojibake – A low-level Unicode library written in C
I've written Mojibake because I don't like the other Unicode libraries for Unicode support.<p>It consists of only two amalgamation files: mojibake.h and mojibake.c. I've added all the most important Unicode algorithms, such as normalization, case conversion, segmentation, bidirectional text, collation, confusable, and others.<p>I regularly test it in these OSes: Linux, macOS, FreeBSD, OpenBSD, NetBSD, and Windows 11.<p>You can find a WASM demo on that site of all the public API functions and the documentation. If you want to participate, feel free to do it. Any kind of help is welcome. Check the CONTRIBUTING.md and API.md files in the GitHub repository for instructions on how to do it.
Workspaces – Explore the workspaces of modern creators
Want to see what items show up in these setups time and time again?<p>I compiled all of the data from 500+ interviews into one easy to read report: <a href="https://workspaces.xyz/gear-report" rel="nofollow">https://workspaces.xyz/gear-report</a>
Show HN: Watch bots interact with an SSH honeypot in real time
Show HN: E-- – A language you dial between English and Python
Show HN: Low-latency local LLM runner via OpenJDK Panama FFM (Java 22)
I wanted to run AI from inside the JVM. I started out with the standard REST sidecar, ripped that out to use Project Panama (Foreign Function & Memory API) in the new JDK versions to interface directly with llama.cpp. I still wasn't happy with how that functioned, so I built libargus.cc to get a clean ABI to expose a structured API up in the JVM landscape. It still uses Project Panama to interface directly with llama.cpp, whisper.cpp, and ggml compute graphs.<p>I have zero-allocation on the hot paths, memory segments for prompts and tokens are allocated once inside confined Arenas. Raw pointers pass straight through down to the low C level. This avoids primitive array cloning and heap churn.<p>I mapped out the native structures from llama.cpp and whisper.cpp while matching the compiler's padding to maintain safe memory access.<p>I bundle pre-compiled native binaries in the jar for easy deployment.<p>This execution engine provides the foundation I need for work I'm doing on a spatio-temporal memory layer (L-TABB) to replace RAGs. I'd love to get technical feedback to polish any issues while I continue working on the next layer.
Deep-dives from anyone hacking on Project Panama or low-latency systems in modern JDK would be very appreciated!<p>I'm much better with code than prose, so I'll let the code do most of the talking.<p>Happy Hacking!
/David<p>Code: <a href="https://libargus.cc" rel="nofollow">https://libargus.cc</a>
Project Landing Page: <a href="https://projectargus.cc" rel="nofollow">https://projectargus.cc</a>
Show HN: Clx – Compile Lua to Native Executables Through C++20
Hi HN,<p>clx is an ahead-of-time compiler for standard Lua that generates C++20 and produces standalone native executables through GCC, Clang or MSVC.<p>The project started as an experiment to see whether modern C++ could be used as a portable compiler backend instead of LLVM or direct machine code generation. The generated code is then compiled and optimized by the host toolchain.<p>The latest release replaces the previous NaN-tagged value representation with a new shadow-types implementation, adds full int64 support, improves native arithmetic code generation and adds ARM64 macOS coroutine support.<p>Performance is typically much faster than the Lua interpreter and can outperform LuaJIT on some computation-heavy workloads while remaining fully ahead-of-time compiled.<p>The repository also contains graphical examples written in Lua, including a Pong game and a Mandelbrot explorer using a Sokol binary module (using the clx C++ API)<p>I'd be very interested in feedback on clx :)
Show HN: Clx – Compile Lua to Native Executables Through C++20
Hi HN,<p>clx is an ahead-of-time compiler for standard Lua that generates C++20 and produces standalone native executables through GCC, Clang or MSVC.<p>The project started as an experiment to see whether modern C++ could be used as a portable compiler backend instead of LLVM or direct machine code generation. The generated code is then compiled and optimized by the host toolchain.<p>The latest release replaces the previous NaN-tagged value representation with a new shadow-types implementation, adds full int64 support, improves native arithmetic code generation and adds ARM64 macOS coroutine support.<p>Performance is typically much faster than the Lua interpreter and can outperform LuaJIT on some computation-heavy workloads while remaining fully ahead-of-time compiled.<p>The repository also contains graphical examples written in Lua, including a Pong game and a Mandelbrot explorer using a Sokol binary module (using the clx C++ API)<p>I'd be very interested in feedback on clx :)
Show HN: Leaves – A text-UI disk usage treemap visualizer
GUI disk analyzers are great for figuring out what's filling up your laptop/desktop drive.<p>On containers or remote servers, the options are limited to purely text based
utilities (e.g. du) or list-centric TUIs (e.g. ncdu) which are usually limited
to viewing one directory at a time.<p>I created <i>leaves</i> to fill that gap.<p>Inspired by classic utilities like WinDirStat and KDirStat, it uses a
2-dimensional treemap^1 visualization to show the entire directory hierarchy
with proportionally sized rectangles.<p>It's performant enough to handle millions of files, thanks to Rust and
multi-threading. However, block characters aren't as suited as pixels for
resolving a large number of items. Leaves can show file-type summaries per
directory or partition the top-level directories by extension, allowing you to
see not only where space is being used, but also how.<p>For instance, I can see the largest chunk of my home directory is taken up by
uv caches for python and old Linux ISOs that I could easily re-download if
needed. Or in a particular container, +600MB is used by standard Rust
documentation and tutorials, and that it is the only location with HTML/JS files,
when only the libraries and build tools are needed (note to self: remember to
use the <i>minimal</i> profile next time).<p>^1: <a href="https://github.com/shundhammer/qdirstat/blob/master/doc/Treemap.md" rel="nofollow">https://github.com/shundhammer/qdirstat/blob/master/doc/Tree...</a>
Show HN: Leaves – A text-UI disk usage treemap visualizer
GUI disk analyzers are great for figuring out what's filling up your laptop/desktop drive.<p>On containers or remote servers, the options are limited to purely text based
utilities (e.g. du) or list-centric TUIs (e.g. ncdu) which are usually limited
to viewing one directory at a time.<p>I created <i>leaves</i> to fill that gap.<p>Inspired by classic utilities like WinDirStat and KDirStat, it uses a
2-dimensional treemap^1 visualization to show the entire directory hierarchy
with proportionally sized rectangles.<p>It's performant enough to handle millions of files, thanks to Rust and
multi-threading. However, block characters aren't as suited as pixels for
resolving a large number of items. Leaves can show file-type summaries per
directory or partition the top-level directories by extension, allowing you to
see not only where space is being used, but also how.<p>For instance, I can see the largest chunk of my home directory is taken up by
uv caches for python and old Linux ISOs that I could easily re-download if
needed. Or in a particular container, +600MB is used by standard Rust
documentation and tutorials, and that it is the only location with HTML/JS files,
when only the libraries and build tools are needed (note to self: remember to
use the <i>minimal</i> profile next time).<p>^1: <a href="https://github.com/shundhammer/qdirstat/blob/master/doc/Treemap.md" rel="nofollow">https://github.com/shundhammer/qdirstat/blob/master/doc/Tree...</a>
Show HN: I've built a words game based on binary search
Show HN: I've built a words game based on binary search
Show HN: For 10 World Cups, my model's 2 favorites had the champion every time
Show HN: One More Letter
Show HN: Make senders work to get into your inbox
Hi HN :) really excited to share this with you.<p>The one thing AI reliably does is generate noise. Half the tools I see launch are just machines for producing more noise across more channels. And people are starting to see this in the form of emails in their inboxes as spam filters are struggling.<p>There used to be a useful signal in email: the effort a sender put into customizing a message was a rough proxy for how relevant it actually was. AI killed that. Now it's customized slop with the appearance of effort with none of the cost. It is painful that the open internet / open channels have been abused like this.<p>Captchainbox applies the idea of proof-of-work to email. If a sender is willing to do a bit of work to reach you, the message is more likely to be worth your time and the sender more likely to be real. The work is a traditional captcha. You can also set a pay-to-deliver amount if you want more friction. The proceeds of the delivery payment after transaction costs go to the Internet Archive and the EFF. The tool currently works by authing with your Gmail or Outlook and during launch time I make this completely free as a lifetime deal (with optional payment if you wanna support).<p>How it works: Captchainbox builds a whitelist automatically from the metadata of your past correspondence. If you've emailed an individual address, that sender can reach you. If you talk to several people at the same domain, we whitelist the whole domain. If one transactional-looking sender has sent you more than 10 emails, we treat it as a transactional domain and let it through. This whitelist is for you to change whenever you want. It continues to build organically as you converse with more addresses.<p>Incoming mail is checked against that whitelist. Senders already on it land in your inbox as normal. Anyone else gets archived (never deleted) and is sent a challenge. This can be the captcha or the payment link. Once they solve it, their email is pulled out of the archive and put back into your inbox.<p>if you want to see what this looks like from a sender's point of view, send me an email here: doerpfelix15@gmail.com<p>The service only ever reads metadata, never message content. And since nothing is ever deleted, you can't lose a message. There is a legitimate risk / downside: if you sign up to a new service, these emails also land in the archive. Since we do not process the content, a first-time sender who can't solve the challenge (say an automated activation email) will sit in your archive until you spot it.<p>Happy to answer anything! :)
Show HN: Make senders work to get into your inbox
Hi HN :) really excited to share this with you.<p>The one thing AI reliably does is generate noise. Half the tools I see launch are just machines for producing more noise across more channels. And people are starting to see this in the form of emails in their inboxes as spam filters are struggling.<p>There used to be a useful signal in email: the effort a sender put into customizing a message was a rough proxy for how relevant it actually was. AI killed that. Now it's customized slop with the appearance of effort with none of the cost. It is painful that the open internet / open channels have been abused like this.<p>Captchainbox applies the idea of proof-of-work to email. If a sender is willing to do a bit of work to reach you, the message is more likely to be worth your time and the sender more likely to be real. The work is a traditional captcha. You can also set a pay-to-deliver amount if you want more friction. The proceeds of the delivery payment after transaction costs go to the Internet Archive and the EFF. The tool currently works by authing with your Gmail or Outlook and during launch time I make this completely free as a lifetime deal (with optional payment if you wanna support).<p>How it works: Captchainbox builds a whitelist automatically from the metadata of your past correspondence. If you've emailed an individual address, that sender can reach you. If you talk to several people at the same domain, we whitelist the whole domain. If one transactional-looking sender has sent you more than 10 emails, we treat it as a transactional domain and let it through. This whitelist is for you to change whenever you want. It continues to build organically as you converse with more addresses.<p>Incoming mail is checked against that whitelist. Senders already on it land in your inbox as normal. Anyone else gets archived (never deleted) and is sent a challenge. This can be the captcha or the payment link. Once they solve it, their email is pulled out of the archive and put back into your inbox.<p>if you want to see what this looks like from a sender's point of view, send me an email here: doerpfelix15@gmail.com<p>The service only ever reads metadata, never message content. And since nothing is ever deleted, you can't lose a message. There is a legitimate risk / downside: if you sign up to a new service, these emails also land in the archive. Since we do not process the content, a first-time sender who can't solve the challenge (say an automated activation email) will sit in your archive until you spot it.<p>Happy to answer anything! :)
Show HN: misa77 - a codec that decodes 2x faster than LZ4 (at better ratios)
I've spent the last few months working on this codec.<p>It has the following characteristics:<p><pre><code> - SOTA decompression throughput in its ratio class
- Decent ratios (comparable to LZ4 at high effort levels)
- Slow compression
</code></pre>
Most of the gains can be attributed to reducing branches and making decompression very friendly to out-of-order cores, by using a smart format.<p>Results on the tarred Silesia corpus on Intel x86-64 follow:<p><pre><code> codec decode ratio encode
misa77 -0 5219 MB/s 42.64% 54.5 MB/s
misa77 -1 4274 MB/s 39.65% 51.2 MB/s
lz4 2505 MB/s 47.59% 371 MB/s
lz4hc -12 2531 MB/s 36.45% 7.31 MB/s</code></pre>
Show HN: misa77 - a codec that decodes 2x faster than LZ4 (at better ratios)
I've spent the last few months working on this codec.<p>It has the following characteristics:<p><pre><code> - SOTA decompression throughput in its ratio class
- Decent ratios (comparable to LZ4 at high effort levels)
- Slow compression
</code></pre>
Most of the gains can be attributed to reducing branches and making decompression very friendly to out-of-order cores, by using a smart format.<p>Results on the tarred Silesia corpus on Intel x86-64 follow:<p><pre><code> codec decode ratio encode
misa77 -0 5219 MB/s 42.64% 54.5 MB/s
misa77 -1 4274 MB/s 39.65% 51.2 MB/s
lz4 2505 MB/s 47.59% 371 MB/s
lz4hc -12 2531 MB/s 36.45% 7.31 MB/s</code></pre>