The best Hacker News stories from Show from the past day
Latest posts:
Show HN: TinyPDF – 3kb pdf library (70x smaller than jsPDF)
I needed to generate invoices in a Node.js app. jsPDF is 229KB. I only needed text, rectangles, lines, and JPEG images.<p><pre><code> So I wrote tinypdf: <400 lines of TypeScript, zero dependencies, 3.3KB minified+gzipped.
What it does:
- Text (Helvetica, colors, alignment)
- Rectangles and lines
- JPEG images
- Multiple pages, custom sizes
What it doesn't do:
- Custom fonts, PNG/SVG, forms, encryption, HTML-to-PDF
That's it. The 95% use case for invoices, receipts, reports, tickets, and labels.
GitHub: https://github.com/Lulzx/tinypdf
npm: npm install tinypdf</code></pre>
Show HN: TinyPDF – 3kb pdf library (70x smaller than jsPDF)
I needed to generate invoices in a Node.js app. jsPDF is 229KB. I only needed text, rectangles, lines, and JPEG images.<p><pre><code> So I wrote tinypdf: <400 lines of TypeScript, zero dependencies, 3.3KB minified+gzipped.
What it does:
- Text (Helvetica, colors, alignment)
- Rectangles and lines
- JPEG images
- Multiple pages, custom sizes
What it doesn't do:
- Custom fonts, PNG/SVG, forms, encryption, HTML-to-PDF
That's it. The 95% use case for invoices, receipts, reports, tickets, and labels.
GitHub: https://github.com/Lulzx/tinypdf
npm: npm install tinypdf</code></pre>
Show HN: Hacker News, but every headline is hysterical clickbait
Show HN: A local-first memory store for LLM agents (SQLite)
Show HN: Composify – Open-Source Visual Editor / Server-Driven UI for React
Everyone's shipping AI tools right now, and here I am with a visual editor. Still, I think many teams are very familiar with the problem of "marketing wants to change the landing page again."<p>I've run into this for years. Campaign pages come in, engineers get pulled in, and tickets stack up. It's usually the same components, just rearranged.<p>A few years ago, at a startup I worked at, we built an internal tool to deal with this. You register your existing React components, they show up as drag-and-drop blocks, and the result is a JSX string. No schema to learn, no changes to your component code.<p>We used it in production, handling real traffic in a messy, legacy-heavy environment. It held up well. Over time, it powered roughly 60% of our traffic. Marketing shipped pages without filing tickets, and product teams ran layout-level A/B tests. That experience eventually led me to clean it up and open-source it.<p>Composify sits somewhere between a no-code page builder and a headless CMS. Page builders like Wix or Squarespace offer drag-and-drop, but lock you into their components. There are also solid tools like Builder.io, Puck, and Storyblok, but many require you to adapt your components to their model. Composify is intentionally minimal: it lets you use your actual production components as they are.<p>It's still early. The docs need work, and there are rough edges. But it's running in production and has solved a real problem for us. If you already have a component library and want non-devs to compose pages from it, it might be useful.<p>Homepage: <a href="https://composify.js.org" rel="nofollow">https://composify.js.org</a><p>Happy to answer questions or hear feedback!
Show HN: Learning a Language Using Only Words You Know
A proof-of-concept language learning app that uses LLMs to generate definitions of unknown words using only previously mastered vocabulary.
Show HN: Learning a Language Using Only Words You Know
A proof-of-concept language learning app that uses LLMs to generate definitions of unknown words using only previously mastered vocabulary.
Show HN: Picknplace.js, an alternative to drag-and-drop
I find that the drag and drop experience can quickly become a nightmare, especially on mobile.
To tap, hold, drag, and scroll, all at the same time, is both difficult to achieve, and prone to errors.
I've always had in mind this 2-step approach, where picking an element and placing it were two separate steps.
So I implemented this basic version to showcase my idea.<p>While it might take more time than a regular drag and drop, the benefit is for people who struggle with holding down the mouse button. With picknplace.js, you only need two clicks and some scrolling.<p>This solution is meant as an experiment, so I'm open to discussion.
Show HN: Picknplace.js, an alternative to drag-and-drop
I find that the drag and drop experience can quickly become a nightmare, especially on mobile.
To tap, hold, drag, and scroll, all at the same time, is both difficult to achieve, and prone to errors.
I've always had in mind this 2-step approach, where picking an element and placing it were two separate steps.
So I implemented this basic version to showcase my idea.<p>While it might take more time than a regular drag and drop, the benefit is for people who struggle with holding down the mouse button. With picknplace.js, you only need two clicks and some scrolling.<p>This solution is meant as an experiment, so I'm open to discussion.
Show HN: Picknplace.js, an alternative to drag-and-drop
I find that the drag and drop experience can quickly become a nightmare, especially on mobile.
To tap, hold, drag, and scroll, all at the same time, is both difficult to achieve, and prone to errors.
I've always had in mind this 2-step approach, where picking an element and placing it were two separate steps.
So I implemented this basic version to showcase my idea.<p>While it might take more time than a regular drag and drop, the benefit is for people who struggle with holding down the mouse button. With picknplace.js, you only need two clicks and some scrolling.<p>This solution is meant as an experiment, so I'm open to discussion.
Show HN: Stop AI scrapers from hammering your self-hosted blog (using porn)
Alright so if you run a self-hosted blog, you've probably noticed AI companies scraping it for training data. And not just a little (RIP to your server bill).<p>There isn't much you can do about it without cloudflare. These companies ignore robots.txt, and you're competing with teams with more resources than you. It's you vs the MJs of programming, you're not going to win.<p>But there is a solution. Now I'm not going to say it's a great solution...but a solution is a solution. If your website contains content that will trigger their scraper's safeguards, it will get dropped from their data pipelines.<p>So here's what fuzzycanary does: it injects hundreds of invisible links to porn websites in your HTML. The links are hidden from users but present in the DOM so that scrapers can ingest them and say "nope we won't scrape there again in the future".<p>The problem with that approach is that it will absolutely nuke your website's SEO. So fuzzycanary also checks user agents and won't show the links to legitimate search engines, so Google and Bing won't see them.<p>One caveat: if you're using a static site generator it will bake the links into your HTML for everyone, including googlebot. Does anyone have a work-around for this that doesn't involve using a proxy?<p>Please try it out! Setup is one component or one import.<p>(And don't tell me it's a terrible idea because I already know it is)<p>package: <a href="https://www.npmjs.com/package/@fuzzycanary/core" rel="nofollow">https://www.npmjs.com/package/@fuzzycanary/core</a>
gh: <a href="https://github.com/vivienhenz24/fuzzy-canary" rel="nofollow">https://github.com/vivienhenz24/fuzzy-canary</a>
Show HN: Stop AI scrapers from hammering your self-hosted blog (using porn)
Alright so if you run a self-hosted blog, you've probably noticed AI companies scraping it for training data. And not just a little (RIP to your server bill).<p>There isn't much you can do about it without cloudflare. These companies ignore robots.txt, and you're competing with teams with more resources than you. It's you vs the MJs of programming, you're not going to win.<p>But there is a solution. Now I'm not going to say it's a great solution...but a solution is a solution. If your website contains content that will trigger their scraper's safeguards, it will get dropped from their data pipelines.<p>So here's what fuzzycanary does: it injects hundreds of invisible links to porn websites in your HTML. The links are hidden from users but present in the DOM so that scrapers can ingest them and say "nope we won't scrape there again in the future".<p>The problem with that approach is that it will absolutely nuke your website's SEO. So fuzzycanary also checks user agents and won't show the links to legitimate search engines, so Google and Bing won't see them.<p>One caveat: if you're using a static site generator it will bake the links into your HTML for everyone, including googlebot. Does anyone have a work-around for this that doesn't involve using a proxy?<p>Please try it out! Setup is one component or one import.<p>(And don't tell me it's a terrible idea because I already know it is)<p>package: <a href="https://www.npmjs.com/package/@fuzzycanary/core" rel="nofollow">https://www.npmjs.com/package/@fuzzycanary/core</a>
gh: <a href="https://github.com/vivienhenz24/fuzzy-canary" rel="nofollow">https://github.com/vivienhenz24/fuzzy-canary</a>
Show HN: Stop AI scrapers from hammering your self-hosted blog (using porn)
Alright so if you run a self-hosted blog, you've probably noticed AI companies scraping it for training data. And not just a little (RIP to your server bill).<p>There isn't much you can do about it without cloudflare. These companies ignore robots.txt, and you're competing with teams with more resources than you. It's you vs the MJs of programming, you're not going to win.<p>But there is a solution. Now I'm not going to say it's a great solution...but a solution is a solution. If your website contains content that will trigger their scraper's safeguards, it will get dropped from their data pipelines.<p>So here's what fuzzycanary does: it injects hundreds of invisible links to porn websites in your HTML. The links are hidden from users but present in the DOM so that scrapers can ingest them and say "nope we won't scrape there again in the future".<p>The problem with that approach is that it will absolutely nuke your website's SEO. So fuzzycanary also checks user agents and won't show the links to legitimate search engines, so Google and Bing won't see them.<p>One caveat: if you're using a static site generator it will bake the links into your HTML for everyone, including googlebot. Does anyone have a work-around for this that doesn't involve using a proxy?<p>Please try it out! Setup is one component or one import.<p>(And don't tell me it's a terrible idea because I already know it is)<p>package: <a href="https://www.npmjs.com/package/@fuzzycanary/core" rel="nofollow">https://www.npmjs.com/package/@fuzzycanary/core</a>
gh: <a href="https://github.com/vivienhenz24/fuzzy-canary" rel="nofollow">https://github.com/vivienhenz24/fuzzy-canary</a>
Show HN: GitForms – Zero-cost contact forms using GitHub Issues as database
got tired of paying $29–99/month for simple contact forms on landing pages and side projects (Typeform, Tally, etc.).So I built GitForms: an open-source contact form that stores submissions as GitHub Issues.How it works:Form runs on your Next.js 14 site (Tailwind + TypeScript)
On submit → creates a new Issue in your repo via GitHub API
You get instant email notifications from GitHub (free)<p>Zero ongoing costs:No database, no backend servers
Deploy on Vercel/Netlify free tier in minutes
Configurable via JSON (themes, text, multi-language)<p>Perfect for MVPs, landing pages, portfolios, or any low-volume use case.Repo: <a href="https://github.com/Luigigreco/gitforms" rel="nofollow">https://github.com/Luigigreco/gitforms</a>
License: CC-BY-NC-SA-4.0 (non-commercial only – fine for personal projects, not client work).Curious what HN thinks: would you use this? Any obvious improvements or edge cases I missed?Thanks!
Show HN: GitForms – Zero-cost contact forms using GitHub Issues as database
got tired of paying $29–99/month for simple contact forms on landing pages and side projects (Typeform, Tally, etc.).So I built GitForms: an open-source contact form that stores submissions as GitHub Issues.How it works:Form runs on your Next.js 14 site (Tailwind + TypeScript)
On submit → creates a new Issue in your repo via GitHub API
You get instant email notifications from GitHub (free)<p>Zero ongoing costs:No database, no backend servers
Deploy on Vercel/Netlify free tier in minutes
Configurable via JSON (themes, text, multi-language)<p>Perfect for MVPs, landing pages, portfolios, or any low-volume use case.Repo: <a href="https://github.com/Luigigreco/gitforms" rel="nofollow">https://github.com/Luigigreco/gitforms</a>
License: CC-BY-NC-SA-4.0 (non-commercial only – fine for personal projects, not client work).Curious what HN thinks: would you use this? Any obvious improvements or edge cases I missed?Thanks!
Show HN: I built a WebMIDI sequencer to control my hardware synths
Hey HN,<p>I’m an ex-Google engineer trying to get back into music production.<p>I needed a way to sequence my hardware synths using AI contexts without constantly switching windows, so I built this.<p>It runs entirely in the browser using WebMIDI. No login required.
It connects to your local MIDI devices (if you're on Chrome/Edge) and lets you generate patterns.<p>Tech stack: [React / WebMIDI API / etc].<p>Link: www.simplychris.ai/droplets<p>Code is a bit messy, but it works. Feedback welcome.
Show HN: Titan – JavaScript-first framework that compiles into a Rust server
Hi HN,<p>I built Titan, a backend framework where you write routes and logic in JavaScript, and the CLI compiles everything into a single Rust + Axum binary using the Boa JS engine. No Node.js is required in production.<p>The idea is to keep JS developer experience while getting Rust performance and a self-contained deployable server.<p>Current features:<p>JS route DSL<p>Action system mapped to Rust<p>esbuild bundling<p>Generated Rust server with Axum<p>Hot-reload dev server<p>Single-binary output<p>Repo: <a href="https://github.com/ezet-galaxy/-ezetgalaxy-titan" rel="nofollow">https://github.com/ezet-galaxy/-ezetgalaxy-titan</a><p>Would love feedback on the architecture, DX, and whether this hybrid JS→Rust approach is useful.<p>Thanks for reading!
Show HN: High-Performance Wavelet Matrix for Python, Implemented in Rust
I built a Rust-powered Wavelet Matrix library for Python.<p>There were surprisingly few practical Wavelet Matrix implementations available for Python, so I implemented one with a focus on performance, usability, and typed APIs. It supports fast rank/select, top-k, quantile, range queries, and even dynamic updates.<p>Feedback welcome!
Show HN: High-Performance Wavelet Matrix for Python, Implemented in Rust
I built a Rust-powered Wavelet Matrix library for Python.<p>There were surprisingly few practical Wavelet Matrix implementations available for Python, so I implemented one with a focus on performance, usability, and typed APIs. It supports fast rank/select, top-k, quantile, range queries, and even dynamic updates.<p>Feedback welcome!
Show HN: High-Performance Wavelet Matrix for Python, Implemented in Rust
I built a Rust-powered Wavelet Matrix library for Python.<p>There were surprisingly few practical Wavelet Matrix implementations available for Python, so I implemented one with a focus on performance, usability, and typed APIs. It supports fast rank/select, top-k, quantile, range queries, and even dynamic updates.<p>Feedback welcome!