<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="/sheet.xsl"?><rss version="2.0"><channel><title>Hacker News</title><link>https://news.ycombinator.com/</link><description>Links for the intellectually curious, ranked by readers.</description><item><title>Vulnerability reports are not special anymore</title><link>https://words.filippo.io/vuln-reports/</link><pubDate>Tue, 23 Jun 2026 23:42:46 +0000</pubDate><comments>https://news.ycombinator.com/item?id=48653216</comments><description>&lt;a href="https://news.ycombinator.com/item?id=48653216"&gt;Comments&lt;/a&gt;</description><ns0:encoded xmlns:ns0="http://purl.org/rss/1.0/modules/content/">&lt;article morss_own_score="6.371707317073171" morss_score="11.554465937762824"&gt;
&lt;time&gt;
            23 Jun 2026&lt;/time&gt;
&lt;h1&gt;Vulnerability Reports Are Not Special Anymore&lt;/h1&gt;
&lt;section morss_own_score="6.36551724137931" morss_score="58.22059212790314"&gt;
&lt;p&gt;A requirement for staying sane while working in public as an open source maintainer is realizing that every issue, PR, and piece of feedback is a present, not an obligation. You can accept it, ignore it, and use it partially or not at all.&lt;/p&gt;
&lt;p&gt;Except…&lt;/p&gt;
&lt;p&gt;For years, as lead of the Go Security team at the time,&lt;sup&gt;&lt;a href="https://words.filippo.io/vuln-reports/#fn:lead"&gt;1&lt;/a&gt;&lt;/sup&gt; I’ve told new team members that it doesn’t apply to vulnerability reports. No, vulnerability reports are special. Security researchers are doing us a favor by reporting things confidentially instead of doing full disclosure, so we owe them something, which is not true of regular issues opened on the issue tracker.&lt;sup&gt;&lt;a href="https://words.filippo.io/vuln-reports/#fn:coc"&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Different projects have different policies, but the general expectations are responsiveness and attribution. We’re supposed to acknowledge reports quickly, investigate them, keep the reporter posted, and eventually credit them with the discovery.&lt;/p&gt;
&lt;p morss_own_score="6.7142857142857135" morss_score="8.714285714285714"&gt;Why? Well, because the reporter is providing &lt;em&gt;us&lt;/em&gt; a service, not asking us to provide one (such as a bug fix or a feature implementation). In exchange for responsiveness and attribution, they are offering precious insight and the confidentiality we need to ship a fix before attackers ship an exploit.&lt;sup&gt;&lt;a href="https://words.filippo.io/vuln-reports/#fn:discl"&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Ultimately, it all stems from our responsibility to our users. The security researchers are not special, the insight and confidentiality are, and we need them to keep our users safe. Ignoring a security report communicates you don’t care about users’ security, and it’s rightly a reason for shame.&lt;/p&gt;
&lt;p&gt;Except…&lt;/p&gt;
&lt;p&gt;It’s 2026 and none of the premises are true anymore.&lt;/p&gt;
&lt;p&gt;LLMs are as good as almost any security researcher, and anyone&lt;sup&gt;&lt;a href="https://words.filippo.io/vuln-reports/#fn:ymmv"&gt;4&lt;/a&gt;&lt;/sup&gt; can run them. The maintainers can run them. The attackers can run them.&lt;/p&gt;
&lt;p&gt;The insight is not scarce and precious anymore. The bottleneck now is not finding potential issues but assessing which ones are real. Unless there’s already a trust relationship, external researchers can’t meaningfully contribute to that triage process, and picking through an LLM’s output or through a &lt;code&gt;security@&lt;/code&gt; inbox has approximately the same signal-to-noise ratio.&lt;/p&gt;
&lt;p&gt;Confidentiality, embargoes, and coordination also don’t matter nearly as much as they used to. The attackers don’t need to read the full disclosure post to learn about the vulnerability: they can ask their own LLM and, in fact, they also probably have the same triage bottleneck as the defenders do.&lt;/p&gt;
&lt;p&gt;The years of vulnerability reports being special might be over, as weird and uncomfortable&lt;sup&gt;&lt;a href="https://words.filippo.io/vuln-reports/#fn:uncomfy"&gt;5&lt;/a&gt;&lt;/sup&gt; as that feels. Triage, rapid remediation, and—as ever—prevention are the job now. And we should all figure out how to run LLM analysis in CI, I suppose.&lt;/p&gt;
&lt;p&gt;For more, subscribe or follow me on Bluesky at &lt;a href="https://bsky.app/profile/filippo.abyssdomain.expert"&gt;@filippo.abyssdomain.expert&lt;/a&gt; or on Mastodon at &lt;a href="https://abyssdomain.expert/@filippo"&gt;@filippo@abyssdomain.expert&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The picture&lt;/h2&gt;
&lt;p&gt;A few weeks ago, like every year, I ran the &lt;a href="https://centopassi.net"&gt;CENTOPASSI&lt;/a&gt;, a GPS-tracked motorcycle competition involving careful planning, 100 coordinates, and 1700 km of secondary roads over three days and a half. It always takes me to incredible places, like this abandoned bauxite mine in Puglia.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://assets.buttondown.email/images/1ec4ddf5-598f-4d72-8d55-10dc1328aa76.jpeg?w=960&amp;amp;fit=max"&gt;&lt;/p&gt;
&lt;p&gt;My work is made possible by &lt;a href="https://geomys.org"&gt;Geomys&lt;/a&gt;, an organization of professional Go maintainers, which is funded by &lt;a href="https://www.avalabs.org/"&gt;Ava Labs&lt;/a&gt;, &lt;a href="https://goteleport.com/"&gt;Teleport&lt;/a&gt;, &lt;a href="https://www.datadoghq.com/"&gt;Datadog&lt;/a&gt;, &lt;a href="https://tailscale.com/"&gt;Tailscale&lt;/a&gt;, and &lt;a href="https://sentry.io/"&gt;Sentry&lt;/a&gt;. Through our retainer contracts they ensure the sustainability and reliability of our open source maintenance work and get a direct line to my expertise and that of the other Geomys maintainers. (Learn more in the &lt;a href="https://words.filippo.io/geomys"&gt;Geomys announcement&lt;/a&gt;.)
Here are a few words from some of them!&lt;/p&gt;
&lt;p&gt;Teleport — For the past five years, attacks and compromises have been shifting from traditional malware and security breaches to identifying and compromising valid user accounts and credentials with social engineering, credential theft, or phishing. &lt;a href="https://goteleport.com/platform/identity/?utm=filippo"&gt;Teleport Identity&lt;/a&gt; is designed to eliminate weak access patterns through access monitoring, minimize attack surface with access requests, and purge unused permissions via mandatory access reviews.&lt;/p&gt;
&lt;p&gt;Ava Labs — We at &lt;a href="https://www.avalabs.org"&gt;Ava Labs&lt;/a&gt;, maintainer of &lt;a href="https://github.com/ava-labs/avalanchego"&gt;AvalancheGo&lt;/a&gt; (the most widely used client for interacting with the &lt;a href="https://www.avax.network"&gt;Avalanche Network&lt;/a&gt;), believe the sustainable maintenance and development of open source cryptographic protocols is critical to the broad adoption of blockchain technology. We are proud to support this necessary and impactful work through our ongoing sponsorship of Filippo and his team.&lt;/p&gt;

&lt;hr&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;A role I passed on to capable hands when I left Google, so despite still being involved in the maintenance of the Go project, none of this is the official position of the Go Security team. &lt;a href="https://words.filippo.io/vuln-reports/#fnref:lead" title="Jump back to footnote 1 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This gets messy quickly at the intersection of vulnerability report handling and Code of Conduct enforcement. If a security vulnerability is reported by someone who is also violating the CoC, what do you do? Do you ignore it? Fix it silently? Realistically, there’s no squaring the circle. It comes down to a judgment call based on how egregious the behavior is, on whether it is private or affecting the community, and on the resources available to the team members servicing &lt;code&gt;security@&lt;/code&gt;. It’s an interesting job. &lt;a href="https://words.filippo.io/vuln-reports/#fnref:coc" title="Jump back to footnote 2 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There’s actually a lot of complex history to disclosure practices, and in a different era it was genuinely dangerous to report security issues: well-intentioned researchers were frequently met with legal threats or prosecution. It took the full disclosure movement to make the industry internalize how counterproductive and unreasonable that was. Part of the coordinated disclosure (or “responsible” disclosure, a morally loaded term I dislike) trade was a promise, implicit or otherwise, not to go after researchers. Thankfully, that angle is mostly irrelevant to the reality of open source in 2026: no researcher fears prosecution in reporting a security vulnerability, and no project should even imply prosecution is on the table as the alternative to its documented reporting policy. &lt;a href="https://words.filippo.io/vuln-reports/#fnref:discl" title="Jump back to footnote 3 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Welp. Sort of. But give it 1-3 months and the open models will catch up. &lt;a href="https://words.filippo.io/vuln-reports/#fnref:ymmv" title="Jump back to footnote 4 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just a few days ago, at the Geomys retreat, I was arguing that &lt;a href="https://daniel.haxx.se/blog/2026/06/15/curl-summer-of-bliss/"&gt;curl’s month-long suspension of vulnerability reporting channels&lt;/a&gt; was going too far, because it feels viscerally wrong to drop a security report on the floor. And yet, as I write this, I have no argument for servicing vulnerability reports being the best way to spend time to protect users. Gotta change to keep up with what the job actually is. &lt;a href="https://words.filippo.io/vuln-reports/#fnref:uncomfy" title="Jump back to footnote 5 in the text"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;/section&gt;
&lt;/article&gt;
</ns0:encoded></item><item><title>Show HN: An ASCII 3D Rendering Engine</title><link>https://glyphcss.com</link><pubDate>Sat, 20 Jun 2026 19:10:41 +0000</pubDate><comments>https://news.ycombinator.com/item?id=48612025</comments><description>&lt;a href="https://news.ycombinator.com/item?id=48612025"&gt;Comments&lt;/a&gt;</description><ns0:encoded xmlns:ns0="http://purl.org/rss/1.0/modules/content/">&lt;div class="home astro-j7pv25f6" morss_own_score="2.7379310344827585" morss_score="15.499498222080824"&gt;            &lt;div&gt;Loading…&lt;/div&gt;     &lt;div class="hero-overlay astro-j7pv25f6" morss_own_score="2.275862068965517" morss_score="12.275862068965516"&gt; &lt;h1&gt; &lt;span&gt;glyph&lt;/span&gt;&lt;span&gt;css&lt;/span&gt; &lt;/h1&gt; &lt;p&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;
Render textured 3D meshes in the DOM with ASCII.
              No WebGL. No &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;. Each scene is a single
&lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; you can inspect, hover, and click.
&lt;/p&gt; &lt;p&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;
Supports OBJ, glTF, GLB, and MagicaVoxel VOX —
              including UV textures and material colors.
              Works with vanilla JS, React, and Vue.
&lt;/p&gt;  &lt;span&gt;runtimes:&lt;/span&gt; &lt;span&gt;vanilla js&lt;/span&gt; &lt;span&gt;react&lt;/span&gt; &lt;span&gt;vue&lt;/span&gt;  &lt;/div&gt;    &lt;span&gt;[ INSTALLATION ]&lt;/span&gt;    &lt;p&gt; &lt;span&gt;┌─&lt;/span&gt; package managers &lt;span&gt;─┐&lt;/span&gt; &lt;/p&gt;   &lt;span&gt;terminal&lt;/span&gt; &lt;pre&gt;&lt;span&gt;$&lt;/span&gt; &lt;code&gt;npm install glyphcss&lt;/code&gt;&lt;/pre&gt;  &lt;span&gt;terminal&lt;/span&gt; &lt;pre&gt;&lt;span&gt;$&lt;/span&gt; &lt;code&gt;npm install @glyphcss/react&lt;/code&gt;&lt;/pre&gt;  &lt;span&gt;terminal&lt;/span&gt; &lt;pre&gt;&lt;span&gt;$&lt;/span&gt; &lt;code&gt;npm install @glyphcss/vue&lt;/code&gt;&lt;/pre&gt;     &lt;p&gt; &lt;span&gt;┌─&lt;/span&gt; cdn &lt;span&gt;─┐&lt;/span&gt; &lt;/p&gt;   &lt;span&gt;index.html&lt;/span&gt; &lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;script&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"module"&lt;/span&gt; &lt;span&gt;src&lt;/span&gt;=&lt;span&gt;"https://esm.sh/glyphcss/elements"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;        &lt;span&gt;[ HOW IT WORKS ]&lt;/span&gt;     &lt;p&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;
glyphcss loads OBJ, glTF, GLB, STL, and VOX mesh files. Each scene
              renders into a single &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt;: the rasteriser
              projects every polygon, fills a &lt;code&gt;cols × rows&lt;/code&gt; character
              grid, and writes one string to &lt;code&gt;textContent&lt;/code&gt; per render.
              There are no per-polygon DOM nodes and no &lt;code&gt;matrix3d&lt;/code&gt;.
&lt;/p&gt; &lt;p&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;
Interactivity is opt-in and sparse: drop a &lt;code&gt;&amp;lt;GlyphHotspot&amp;gt;&lt;/code&gt;
at any 3D anchor and glyphcss emits one absolutely-positioned
&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; over the projected cell. Real DOM events,
              real &lt;code&gt;:hover&lt;/code&gt; styles, real &lt;code&gt;role="button"&lt;/code&gt;
accessibility — without one DOM node per polygon.
&lt;/p&gt; &lt;p&gt; &lt;a href="https://glyphcss.com/core-concepts"&gt;[ → core concepts ]&lt;/a&gt; &lt;/p&gt;     &lt;span&gt;[ HELLO WORLD ]&lt;/span&gt;   &lt;p&gt; &lt;span&gt;&amp;gt;&lt;/span&gt;
glyphcss provides custom elements (&lt;code&gt;&amp;lt;glyph-scene&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;glyph-mesh&amp;gt;&lt;/code&gt;),
              an imperative &lt;code&gt;createGlyphScene&lt;/code&gt; API, and optional React / Vue bindings.
              Use whichever entry point fits your stack.
&lt;/p&gt;    &lt;div class="term-editor-shell astro-j7pv25f6" morss_own_score="3.0" morss_score="12.0"&gt;   &lt;span&gt;~/project/&lt;/span&gt;    &lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;script&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"module"&lt;/span&gt; &lt;span&gt;src&lt;/span&gt;=&lt;span&gt;"https://esm.sh/glyphcss/elements"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;script&lt;/span&gt;&amp;gt;&lt;/span&gt;

&lt;span&gt;&amp;lt;&lt;span&gt;glyph-camera&lt;/span&gt; &lt;span&gt;rot-x&lt;/span&gt;=&lt;span&gt;"23"&lt;/span&gt; &lt;span&gt;zoom&lt;/span&gt;=&lt;span&gt;"1.3"&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;&lt;span&gt;glyph-scene&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;span&gt;glyph-orbit-controls&lt;/span&gt; &lt;span&gt;drag&lt;/span&gt; &lt;span&gt;wheel&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;glyph-orbit-controls&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;span&gt;glyph-mesh&lt;/span&gt; &lt;span&gt;geometry&lt;/span&gt;=&lt;span&gt;"dodecahedron"&lt;/span&gt;&amp;gt;&lt;/span&gt;
      &lt;span&gt;&amp;lt;&lt;span&gt;glyph-hotspot&lt;/span&gt; &lt;span&gt;at&lt;/span&gt;=&lt;span&gt;"0,1,0"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;glyph-hotspot&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;/&lt;span&gt;glyph-mesh&lt;/span&gt;&amp;gt;&lt;/span&gt;
  &lt;span&gt;&amp;lt;/&lt;span&gt;glyph-scene&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;/&lt;span&gt;glyph-camera&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt; &lt;a href="https://glyphcss.com/api/headless"&gt;[ → api reference ]&lt;/a&gt; &lt;/p&gt;    &lt;/div&gt; </ns0:encoded></item><item><title>Raspberry Pi Pico W as USB Wi-Fi Adapter</title><link>https://gitlab.com/baiyibai/pico-usb-wifi</link><pubDate>Wed, 24 Jun 2026 03:17:47 +0000</pubDate><comments>https://news.ycombinator.com/item?id=48654676</comments><description>&lt;a href="https://news.ycombinator.com/item?id=48654676"&gt;Comments&lt;/a&gt;</description></item><item><title>Jerry's Map</title><link>http://www.jerrysmap.com/the-map</link><pubDate>Tue, 23 Jun 2026 18:40:22 +0000</pubDate><comments>https://news.ycombinator.com/item?id=48649435</comments><description>&lt;a href="https://news.ycombinator.com/item?id=48649435"&gt;Comments&lt;/a&gt;</description><ns0:encoded xmlns:ns0="http://purl.org/rss/1.0/modules/content/">&lt;div class="sqs-html-content" data-sqsp-text-block-content="" morss_own_score="6.0" morss_score="49.0"&gt;
&lt;h2&gt;The Layers&lt;/h2&gt;&lt;p&gt;The Map is expressed, over time, in successive layers, each one replacing its predecessor. The process of developing and revising a panel results in several iterations of that panel.&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;Base Layer&lt;/strong&gt; is divided into four phases:&lt;/p&gt;&lt;p&gt;A. The &lt;strong&gt;blank page&lt;/strong&gt; is an 8 by 10 inch patchwork of paperboard or is a sheet of heavy paper on which is a photo or a lumen print.&lt;/p&gt;&lt;p&gt;B. The blank is gradually covered in successive &lt;strong&gt;bands of painted color&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;C. The paint is replaced by &lt;strong&gt;1" squares of paper collage&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;D. The collage is replaced by &lt;strong&gt;1" city squares&lt;/strong&gt; in:&lt;/p&gt;&lt;p&gt;1. &lt;strong&gt;Green&lt;/strong&gt; with 400 new inhabitants&lt;/p&gt;&lt;p&gt;2. &lt;strong&gt;Red&lt;/strong&gt; with 800 new inhabitants&lt;/p&gt;&lt;p&gt;3. &lt;strong&gt;Grey&lt;/strong&gt; with 1200 new inhabitants&lt;/p&gt;&lt;p&gt;4. &lt;strong&gt;Black&lt;/strong&gt; with 2400 new inhabitants&lt;/p&gt;&lt;p&gt;The next layer is &lt;strong&gt;The Void&lt;/strong&gt;. Its initial phase is composed of irregular pieces of &lt;strong&gt;plain, white collage&lt;/strong&gt;. That is followed by a layer of &lt;strong&gt;2" squares of black-and-white collage&lt;/strong&gt;. On that layer &lt;strong&gt;1" squares of grey city&lt;/strong&gt; form followed by &lt;strong&gt;1" squares of black city&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The third layer is called &lt;strong&gt;The Red Dimension&lt;/strong&gt; and is expressed by irregular flame-shaped solid red collage.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Black Ness&lt;/strong&gt;, composed of 2" squares of black collage, supercedes The Red Dimension.&lt;/p&gt;&lt;p&gt;Then follows &lt;strong&gt;The Ziggurat Phase&lt;/strong&gt; in which successively smaller squares of collage, starting with 2 by 2, are stacked on top of each other. That layer, and the ones that follow, have yet to manifest themselves on The Map.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The Flood&lt;/strong&gt;, represented by irregular pieces of blue collage, and &lt;strong&gt;Re-Birth&lt;/strong&gt;, composed of hand-torn pieces of kraft paper, are the final stages in the Map cycle.&lt;/p&gt;&lt;p&gt;Then the whole process starts over with new &lt;strong&gt;Paint Bands&lt;/strong&gt;.&lt;/p&gt;
&lt;/div&gt;
</ns0:encoded></item><item><title>FUTO Swipe – A new swipe typing model</title><link>https://swipe.futo.tech/</link><pubDate>Tue, 23 Jun 2026 17:50:22 +0000</pubDate><comments>https://news.ycombinator.com/item?id=48648619</comments><description>&lt;a href="https://news.ycombinator.com/item?id=48648619"&gt;Comments&lt;/a&gt;</description><ns0:encoded xmlns:ns0="http://purl.org/rss/1.0/modules/content/">&lt;body class="antialiased selection:bg-brand-accent selection:text-brand-dark" morss_own_score="5.943349463000118" morss_score="35.565783795223574"&gt;

&lt;img src="https://swipe.futo.tech/hero-2.webp"&gt;
&lt;img src="https://swipe.futo.tech/circles.webp"&gt;


&lt;img src="https://swipe.futo.tech/logo.png"&gt;

&lt;p&gt;
                Fast, accurate swipe typing system. Use it today in FUTO Keyboard, our fully offline Android keyboard app. Or download the models and build with it.
            &lt;/p&gt;



&lt;p&gt;This is a serverside demo to keep this webpage small. In production, it runs on-device, with much lower latency.&lt;/p&gt;



&lt;p&gt;
            For a long time, good mobile swipe typing was locked behind privacy-invasive keyboard apps or unlicensed private libraries.
            &lt;br&gt;&lt;/p&gt;
&lt;p&gt;
            FUTO Swipe is our family of open models and algorithms that aims to solve this problem. We developed this primarily for FUTO Keyboard, but we also welcome the broader community to make use of the FUTO Swipe models.
            As this has been a long-term investment for us, we ask that an attribution is made visible to end-users. &lt;a href="https://huggingface.co/futo-org/futo-swipe/blob/main/LICENSE.md"&gt;Read license&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;Dataset&lt;/h2&gt;



&lt;aside&gt;
&lt;blockquote&gt;
          We released a dataset of 1 million swipes under the MIT license
        &lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://huggingface.co/datasets/futo-org/swipe.futo.org"&gt;See dataset on HuggingFace&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://swipe.futo.org/"&gt;Contribute to our validation dataset&lt;/a&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;article&gt;
&lt;p&gt;
            In August 2024, we launched a dataset collection effort on the swipe.futo.org domain to collect QWERTY English swipes.
            Users would voluntarily visit the webpage on their mobile phone and be given instructions and information about the dataset. After consenting,
            they would be given sentences, primarily from Wikipedia, and would be asked to swipe them word-by-word.
        &lt;/p&gt;
&lt;p&gt;
            In the end, this produced over 1 million swipes. We filtered out a small set of low-quality swipes. In March 2025, we released a dataset of 1 million swipes under the MIT license, and it is available today on HuggingFace.
        &lt;/p&gt;
&lt;p&gt;
            We made heavy use of this data to train our models and to evaluate different swipe typing systems.
        &lt;/p&gt;
&lt;/article&gt;







&lt;aside&gt;
&lt;img src="https://swipe.futo.tech/quick-rundown.png"&gt;
&lt;/aside&gt;
&lt;article&gt;

&lt;h2&gt;Models&lt;/h2&gt;


&lt;p&gt;Our architecture includes three model types.&lt;/p&gt;
&lt;p&gt;The Encoder model is a universal layout-agnostic and language-agnostic, and is used for making swipe typing predictions in the general case. However, it does not offer cutting-edge accuracy.&lt;/p&gt;
&lt;p&gt;The ContextLM model is a very small language model that is trained for a single language. It's used to improve the quality of predictions by eliminating nonsensical words given the preceding words in the sentence. It only requires text data for training.&lt;/p&gt;
&lt;p&gt;Finally, the decoder is a language-specific and layout-specific model that learns layout's peculiarities and achieves leading accuracy. As it requires swipe typing data for a specific layout and language for training, we only have a QWERTY English decoder for now.&lt;/p&gt;
&lt;p&gt;With all 3 models and with a beam width of 300, we achieve a top-4 fail rate of only ~4% on our test set. Ignoring out-of-vocabulary cases, the error rate is below 1%.&lt;/p&gt;
&lt;/article&gt;







&lt;img src="https://swipe.futo.tech/benchmark.png"&gt;
&lt;p&gt;Note: These numbers heavily depend on the benchmark, so real-world use may vary, but we believe we match big tech's keyboards.&lt;/p&gt;







&lt;aside&gt;
&lt;img src="https://swipe.futo.tech/footprint.png"&gt;
&lt;/aside&gt;
&lt;article&gt;

&lt;h2&gt;Footprint&lt;/h2&gt;


&lt;p&gt;The encoder model is just 635,140 parameters, and the decoder is 304,155 extra. The biggest one is the ContextLM at 1.5 million, but 1.1 million of that is just embeddings. This brings us to 1,364,271 active parameters, or 2,494,767 total parameters.&lt;/p&gt;
&lt;p&gt;This means the footprint of the models are very small, and the model can run on low-end devices in milliseconds. In addition, the environmental costs involved in training the models were also very low, because we never needed more than 1 workstation GPU!&lt;/p&gt;
&lt;/article&gt;







&lt;h2&gt;C++ Library&lt;/h2&gt;



&lt;article&gt;
&lt;p&gt;The models themselves are only half of the story when going from a swipe to word predictions. The model predictions are not very useful on their own and it's necessary to perform a dictionary-constrained beam search to score a set of words and find the most likely candidates.&lt;/p&gt;
&lt;p&gt;For this, we release swipe-library, a library written in C++ that handles the entire inference, decoding, and beam search part so you can easily go from swipe paths to word predictions.&lt;/p&gt;
&lt;/article&gt;







&lt;h2&gt;Make something cool!&lt;/h2&gt;




&lt;p&gt;Swipe typing in VR...&lt;/p&gt;
&lt;a href="resrec:///U-1ndAnBjY9wm/R-DD05FBF5B7486A4F8DFCA48EE94527DB314B19FCA9FF4A8B676B0EF60B42AF93"&gt;
&lt;p&gt;resrec link for demo&lt;/p&gt;
&lt;/a&gt;


&lt;p&gt;...or on a laptop trackpad&lt;/p&gt;






&lt;h2&gt;Want to build with FUTO Swipe?&lt;/h2&gt;
&lt;p&gt;
                The FUTO Swipe models are available under the FUTO Model License, and the inference library is under GPL. We are working on a paper that will detail more on the training and architecture.
            &lt;/p&gt;


&lt;/body&gt;
</ns0:encoded></item></channel></rss>