<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: jcupitt</title><link>https://news.ycombinator.com/user?id=jcupitt</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Sat, 19 Sep 2026 13:25:17 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=jcupitt" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by jcupitt in "Government Rails Site Hit Hours After CVE Patch"]]></title><description><![CDATA[
<p>The fix is pretty easy -- you should call `block_untrusted` to stop loaders like matlab from running:<p><a href="https://www.rubydoc.info/gems/ruby-vips/Vips.block_untrusted" rel="nofollow">https://www.rubydoc.info/gems/ruby-vips/Vips.block_untrusted</a><p>You can also set the env var `VIPS_BLOCK_UNTRUSTED`, which might be easier.<p>You can block or allow specific load operations, so you can limit format support to just the types you need:<p><a href="https://www.rubydoc.info/gems/ruby-vips/Vips#block-class_method" rel="nofollow">https://www.rubydoc.info/gems/ruby-vips/Vips#block-class_met...</a><p>That might be even better.<p>There was a post on libvips.org about this a while ago:<p><a href="https://www.libvips.org/2022/05/28/What's-new-in-8.13.html" rel="nofollow">https://www.libvips.org/2022/05/28/What's-new-in-8.13.html</a><p>And a note about it in the checklist for devs:<p><a href="https://www.libvips.org/API/current/developer-checklist.html#security" rel="nofollow">https://www.libvips.org/API/current/developer-checklist.html...</a></p>
]]></description><pubDate>Sat, 05 Sep 2026 09:04:41 +0000</pubDate><link>https://news.ycombinator.com/item?id=49574691</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=49574691</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49574691</guid></item><item><title><![CDATA[New comment by jcupitt in "RipGrep musl binaries occasionally segfault during very-large searches"]]></title><description><![CDATA[
<p>libvips shouldn't be calling imagemagick for heif decode, it has a nice one built in. Unless you were using a very old libvips!<p>I've found jemalloc works best for long running libvips processes, fwiw.</p>
]]></description><pubDate>Sat, 01 Aug 2026 17:36:17 +0000</pubDate><link>https://news.ycombinator.com/item?id=49136538</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=49136538</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49136538</guid></item><item><title><![CDATA[New comment by jcupitt in "Show HN: Kiln – a fast, native batch image processor"]]></title><description><![CDATA[
<p>Hello, looks nice! I had a few thoughts:<p>- I'd consider adding support for libvips smartcrop, ICC colour management, HDR, image alpha<p>- can you join pipelines? you could have one making a background, one making a foreground, then composite them, for example<p>- your benchmarks don't measure peak memory use, it can be a useful thing to test, especially if people are processing large images (eg. the output of every modern smartphone sigh)<p>- have you benchmarked against nip4, the official libvips GUI? it has a CLI mode  you can run with GNU parallel<p>- I agree, a CLI mode for your tool sounds useful</p>
]]></description><pubDate>Tue, 28 Jul 2026 10:03:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=49081677</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=49081677</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=49081677</guid></item><item><title><![CDATA[New comment by jcupitt in "Malicious npm packages detected across Red Hat Cloud Services"]]></title><description><![CDATA[
<p>Some packages with native code components (like sharp) will use these hooks to download the correct precompiled native binary for you.</p>
]]></description><pubDate>Tue, 02 Jun 2026 10:55:00 +0000</pubDate><link>https://news.ycombinator.com/item?id=48368527</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=48368527</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48368527</guid></item><item><title><![CDATA[New comment by jcupitt in "Malicious npm packages detected across Red Hat Cloud Services"]]></title><description><![CDATA[
<p>sharp downloads over https and checks the sha256 (I think?) of the archive.</p>
]]></description><pubDate>Tue, 02 Jun 2026 10:51:06 +0000</pubDate><link>https://news.ycombinator.com/item?id=48368496</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=48368496</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48368496</guid></item><item><title><![CDATA[New comment by jcupitt in "Malicious npm packages detected across Red Hat Cloud Services"]]></title><description><![CDATA[
<p>sharp does this too:<p><a href="https://sharp.pixelplumbing.com/install/#prebuilt-binaries" rel="nofollow">https://sharp.pixelplumbing.com/install/#prebuilt-binaries</a><p>it can sometimes need to compile the C++ shim that sits between node and libvips, but that's rare.</p>
]]></description><pubDate>Tue, 02 Jun 2026 10:49:58 +0000</pubDate><link>https://news.ycombinator.com/item?id=48368485</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=48368485</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48368485</guid></item><item><title><![CDATA[New comment by jcupitt in "Malicious npm packages detected across Red Hat Cloud Services"]]></title><description><![CDATA[
<p>sharp does not rebuild libvips, it downloads a pre-compiled libvips for your platform.<p><a href="https://sharp.pixelplumbing.com/install/#prebuilt-binaries" rel="nofollow">https://sharp.pixelplumbing.com/install/#prebuilt-binaries</a><p>It can usually also download a precompiled binary for the C++ shim that sits between node and libvips, but if your node / arch / etc. is not supported, it'll compile that (that's what the build.js file you linked does).</p>
]]></description><pubDate>Tue, 02 Jun 2026 10:48:29 +0000</pubDate><link>https://news.ycombinator.com/item?id=48368471</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=48368471</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=48368471</guid></item><item><title><![CDATA[New comment by jcupitt in "Okmain: How to pick an OK main colour of an image"]]></title><description><![CDATA[
<p>Hello, libvips author here, you can get it to do the OKLab averaging for you. For example, using pyvips (ahem, untested):<p>image = pyvips.Image.new_from_file(filename, access="sequential")<p>scale = min(200 / image.width, 200 / image.height)<p>thumbnail = image.colourspace("oklab").resize(scale).extract_bands(0, n=3)<p>rgbf = thumbnail.write_to_memory()<p>That'll stream the source image and make a RGBRGBRGB memory buffer of single precision floats. You could perhaps use kernel="linear" and avoid any ringing from lanczos3.<p>I think I would downsample in a linear light space, like scRGB. Averaging there means averaging photons, which will surely be better than OKLab. Maybe switch to OKLab for clustering. Though of course I've not tested it.</p>
]]></description><pubDate>Sat, 14 Mar 2026 08:01:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=47374375</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=47374375</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47374375</guid></item><item><title><![CDATA[New comment by jcupitt in "Show HN: An asset management platform built with Kotlin, Ktor, and libvips"]]></title><description><![CDATA[
<p>libvips uses imagemagick (via libMagick) for BMP load and save, fwiw</p>
]]></description><pubDate>Thu, 19 Feb 2026 16:37:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=47075646</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=47075646</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=47075646</guid></item><item><title><![CDATA[New comment by jcupitt in "Ask HN: How are most people converting HEIC to jpg?"]]></title><description><![CDATA[
<p>It's just `vips copy src.heic dst.jpg`.</p>
]]></description><pubDate>Mon, 22 Dec 2025 18:15:37 +0000</pubDate><link>https://news.ycombinator.com/item?id=46356868</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=46356868</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46356868</guid></item><item><title><![CDATA[New comment by jcupitt in "Sharp: High performance Node.js image processing/optimization"]]></title><description><![CDATA[
<p>libvips, the library behind sharp, has just released version 8.18.0: <a href="https://www.libvips.org/2025/12/04/What's-new-in-8.18.html" rel="nofollow">https://www.libvips.org/2025/12/04/What's-new-in-8.18.html</a><p>It includes support for UltraHDR (HDR and SDR in one JPEG file), camera RAW images, and the Oklab colourspace. This should all be coming to sharp in the next six month or so.</p>
]]></description><pubDate>Sun, 21 Dec 2025 10:44:07 +0000</pubDate><link>https://news.ycombinator.com/item?id=46343868</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=46343868</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=46343868</guid></item><item><title><![CDATA[New comment by jcupitt in "Defer: Resource cleanup in C with GCCs magic"]]></title><description><![CDATA[
<p>Cleanup can be very useful if you depend on a library that does not support arenas.</p>
]]></description><pubDate>Wed, 01 Oct 2025 07:52:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=45435379</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=45435379</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45435379</guid></item><item><title><![CDATA[New comment by jcupitt in "Defer: Resource cleanup in C with GCCs magic"]]></title><description><![CDATA[
<p>`free(NULL);` will crash on some platforms that gcc supports, I believe.</p>
]]></description><pubDate>Wed, 01 Oct 2025 07:50:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=45435368</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=45435368</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45435368</guid></item><item><title><![CDATA[New comment by jcupitt in "LLMs are still surprisingly bad at some simple tasks"]]></title><description><![CDATA[
<p>I'm the libvips author, I should have said, so I'm not very neutral. But at least on that test it's usefully quicker and less memory hungry.</p>
]]></description><pubDate>Sun, 21 Sep 2025 14:03:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=45322848</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=45322848</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45322848</guid></item><item><title><![CDATA[New comment by jcupitt in "LLMs are still surprisingly bad at some simple tasks"]]></title><description><![CDATA[
<p>pyvips (the libvips Python binding) is quite a bit better than pillow-simd --- 3x faster, 10x less memory use, same quality. On this benchmark at least:<p><a href="https://github.com/libvips/libvips/wiki/Speed-and-memory-use" rel="nofollow">https://github.com/libvips/libvips/wiki/Speed-and-memory-use</a></p>
]]></description><pubDate>Sun, 21 Sep 2025 14:01:13 +0000</pubDate><link>https://news.ycombinator.com/item?id=45322827</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=45322827</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45322827</guid></item><item><title><![CDATA[New comment by jcupitt in "Resizing images in Rust, now with EXIF orientation support"]]></title><description><![CDATA[
<p>Ah no problem! I'm glad it's useful.<p>`govips` was a pretty early binding and wasn't really done the libvips way. It doesn't expose all the operations or options, it's mostly done by hand, and there are a number of leaks and misfeatures.<p>It's been replaced by `vipsgen`:<p><a href="https://github.com/cshum/vipsgen" rel="nofollow">https://github.com/cshum/vipsgen</a><p>Which is an automatically generated 100% binding. It should have the complete API, it should be very stable and leak-free, and it should be simple to maintain.<p>`autorot` is pretty expensive. You'll see much better performance if you flip x and y in your crop instead.</p>
]]></description><pubDate>Tue, 16 Sep 2025 11:31:12 +0000</pubDate><link>https://news.ycombinator.com/item?id=45260812</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=45260812</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45260812</guid></item><item><title><![CDATA[New comment by jcupitt in "Resizing images in Rust, now with EXIF orientation support"]]></title><description><![CDATA[
<p>Hello, libvips author here, the JPEG loader has a flag to do this for you. You can write:<p>VipsImage *image = vips_image_new_from_file("something.jpg", "autorotate", TRUE, NULL);<p>and it'll flip it upright for you and remove any EXIF orientation tag. It isn't the default since it has (obviously) a large memory and cpu cost.<p>For simple resize and crop it's much better to use the exif tag to adjust the resize and crop parameters (the vipsthumbnail command does this).</p>
]]></description><pubDate>Mon, 15 Sep 2025 13:06:24 +0000</pubDate><link>https://news.ycombinator.com/item?id=45249217</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=45249217</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45249217</guid></item><item><title><![CDATA[New comment by jcupitt in "Resizing images in Rust, now with EXIF orientation support"]]></title><description><![CDATA[
<p>Applying rotation can have a large performance penalty (both cpu and memory), so you want to be able to avoid it if possible.</p>
]]></description><pubDate>Mon, 15 Sep 2025 13:00:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=45249148</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=45249148</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=45249148</guid></item><item><title><![CDATA[New comment by jcupitt in "Jemalloc Postmortem"]]></title><description><![CDATA[
<p>Those three all use libvips as the image processing engine, fwiw, so it's maybe not a very wide survey.<p>libvips is fairly highly threaded and does a lot of alloc/free, so it's challenging for most heap implementations.</p>
]]></description><pubDate>Sun, 15 Jun 2025 16:08:35 +0000</pubDate><link>https://news.ycombinator.com/item?id=44283046</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=44283046</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44283046</guid></item><item><title><![CDATA[New comment by jcupitt in "Jemalloc Postmortem"]]></title><description><![CDATA[
<p>Hello, libvips author here. This is probably the canonical thread about libvips and memory fragmentation, and the funniest graph:<p><a href="https://github.com/lovell/sharp/issues/955#issuecomment-545825607">https://github.com/lovell/sharp/issues/955#issuecomment-5458...</a><p>(that specific graph is for switching from glib to the musl memory allocator, but jemalloc gives a very similar result)</p>
]]></description><pubDate>Sun, 15 Jun 2025 14:16:26 +0000</pubDate><link>https://news.ycombinator.com/item?id=44282405</link><dc:creator>jcupitt</dc:creator><comments>https://news.ycombinator.com/item?id=44282405</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=44282405</guid></item></channel></rss>