10 interesting stories served every morning and every evening.
10 interesting stories served every morning and every evening.
Skip to content
Navigation Menu
AI CODE CREATIONGitHub CopilotWrite better code with AIGitHub SparkBuild and deploy intelligent appsGitHub ModelsManage and compare promptsMCP RegistryNewIntegrate external toolsView all features
AI CODE CREATIONGitHub CopilotWrite better code with AIGitHub SparkBuild and deploy intelligent appsGitHub ModelsManage and compare promptsMCP RegistryNewIntegrate external tools
AI CODE CREATION
GitHub CopilotWrite better code with AI
GitHub CopilotWrite better code with AI
GitHub SparkBuild and deploy intelligent apps
GitHub SparkBuild and deploy intelligent apps
GitHub ModelsManage and compare prompts
GitHub ModelsManage and compare prompts
MCP RegistryNewIntegrate external tools
MCP RegistryNewIntegrate external tools
View all features
Pricing
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
Appearance settings
Notifications
You must be signed in to change notification settings
Fork
39.7k
Star
185k
Star
185k
Merged
Conversation
Pull request overview
This PR changes the Git extension’s git.addAICoAuthor setting so that AI co-author trailers are enabled by default, making the default behavior automatically add a Co-authored-by trailer when AI-generated code contributions are detected.
Changes:
Updates git.addAICoAuthor configuration default from “off” to “all”.
Copilot’s findings
Files reviewed: 1/1 changed files
Comments generated: 1
Screenshot Changes
Base: 3c1b53dd Current: eec3f9cf
Changed (3)
blocks-ci screenshots changed
Replace the contents of test/componentFixtures/blocks-ci-screenshots.md with:
<!– auto-generated by CI — do not edit manually –>
#### editor/codeEditor/CodeEditor/Dark

#### editor/codeEditor/CodeEditor/Light

NoiceBroice
referenced
this pull request
in ThomasSnowden37/Harmoniq-Charts
Co-authored-by: Copilot <copilot@github.com>
Closed
srid
mentioned this pull request
Merged
Open
microsoft
locked as spam and limited conversation to collaborators
Labels
None yet
The NetHack DevTeam is announcing the release of NetHack 5.0.0 on
May 2, 2026
NetHack 5.0 is an enhancement to the dungeon exploration game NetHack,
which is a distant descendent of Rogue and Hack, and a direct descendent
of NetHack 3.6.
NetHack 5.0.0 is a release of NetHack. As a .0 version, there may be some
bugs encountered. Constructive suggestions, GitHub pull requests, and bug
reports are all welcome and encouraged.
Along with the game improvements and bug fixes, NetHack 5.0 strives to make
some general architectural improvements to the game or to its building
process. Among them, 5.0:
Has its source code compliant with the C99 standard.
Removes barriers to building NetHack on one platform and operating system,
for later execution on another (possibly quite different) platform and/or
operating system. That capability is generally known as “cross-compiling.”
See the file “Cross-compiling” in the top-level folder for more information
on that.
The build-time “yacc and lex”-based level compiler, the
“yacc and lex”-based dungeon compiler, and the quest text file processing
previously done by NetHack’s “makedefs” utility, have been replaced with
Lua text alternatives that are loaded and processed by the game during play.
A list of over 3100 fixes and changes can be found in the game’s sources
in the file doc/fixes5 – 0-0.txt. The text in there was written for the
development team’s own use and is provided “as is”. Some entries might be
considered “spoilers”, particularly in the “new features” section.
Existing saved games and bones files will not work with NetHack 5.0.0.
Checksums (sha256) of binaries that you have downloaded from nethack.org
can be verified on Windows platforms using:
certUtil -hashfile nethack-500-win-x64.zip SHA256
or
certUtil -hashfile nethack-500-win-arm64.zip SHA256
The following command can be used on most platforms to help confirm the location of
various files that NetHack may use:
nethack –showpaths
As with all releases of the game, we appreciate your feedback. Please submit any
bugs using the problem report form. Also, please check the “known bugs” list
before you log a problem - somebody else may have already found it.
Happy NetHacking!
Many CLI tools, SDKs, and frameworks collect telemetry data by default. Each one has its own way to opt out:
You get the idea. There are too many, and they are all different.
A single, standard environment variable that clearly and unambiguously expresses a user’s wish to opt out of any of the following:
Non-essential-to-functionality requests to the creator of the software or third-party
We just want local software.
Add the line above to your shell configuration file so it applies to all your terminal sessions:
If you develop tools that collect telemetry, analytics, or make non-essential network requests, please check for this variable:
If DO_NOT_TRACK is set to 1, disable all tracking
Consider making telemetry opt-in rather than opt-out
Hello friends! In April we merged 333 PRs from 35 contributors, 7 of whom made their first-ever commit to Ladybird! Here’s what we’ve been up to.
Ladybird is entirely funded by the generous support of companies and individuals who believe in the open web. This month, we’re excited to welcome the following new sponsors:
Human Rights Foundation (via the “AI for Individual Rights” program) with $50,000
Jakub Stęplowski with $1,000
We’re incredibly grateful for their support. If you’re interested in sponsoring the project, please contact us.
Inline PDF viewer
PDFs now render inline through the bundled pdf.js viewer (#9132). pdf.js is a full-featured PDF viewer written entirely in JavaScript, HTML, and CSS, with page navigation, text selection, zoom, and find-in-document. Profiling pdf.js loading the Intel ISA Manual also drove improvements to our typed-array view cache and :has() invalidation.
Browsing history and rich address bar autocomplete
Type in the address bar and you now get rich, history-aware suggestions: previously visited pages with favicons and titles, a search-engine shortcut, and plain URL completions (#8933). Behind the scenes, a SQLite-backed HistoryStore persists every navigation along with its title, favicon, visit count, and last-visit time, and “Clear browsing history” is wired up in the Privacy settings page. Both the Qt and AppKit UIs render the new rich rows.
Speculative and incremental HTML parsing
The HTML parser now consumes the response body incrementally (#9151). Bytes flow through a streaming text decoder into the tokenizer one chunk at a time, the tokenizer pauses when it runs out of input, and resumes when more arrives. This replaces a model where we waited for the full body before starting to parse.
We also implemented the speculative HTML parser (#9114). When the main parser blocks on a synchronous external script, a separate tokenizer scans ahead through the unparsed input and issues speculative fetches for the resources it finds: <script src>, <link rel=stylesheet|preload>, and <img src>. It tracks <base href> and skips into templates and foreign content correctly. A follow-up wired the speculative parser into the document’s preload map (#9164), so resources discovered speculatively get deduplicated against the regular parser’s later fetches instead of being requested twice.
Off-thread JavaScript compilation
Bytecode generation for fetched scripts’ top-level code now runs on a background thread pool (#9118). Worker threads produce the bytecode and the data needed to build an Executable, while everything that touches the VM or GC heap stays on the main thread. This covers classic scripts, modules, and top-level IIFEs, and shifts roughly 200ms of main thread time onto background threads while loading YouTube alone.
Per-Navigable rasterization
Each Navigable now rasterizes independently on its own thread (#8793). Previously, iframes were painted synchronously as nested display lists inside their parent’s display list, which meant only the top-level traversable’s rendering thread was ever active. The parent’s display list now references each iframe’s rasterized output through an ExternalContentSource, so iframe invalidations no longer require re-recording the parent. Beyond the parallelism, this is prep work for moving iframes into separate sandboxed processes.
JavaScript engine
With the C++/Rust transition behind us, we spent April cashing in.
Faster JS-to-JS calls. A multi-part series (#8891, #8909, #8912) made Call, Return, and End instructions stay entirely in the AsmInt assembly interpreter for the common case, with hand-tuned ARM64 paired load/store (ldp/stp) for register save/restore. Native function calls also dispatch directly from AsmInt now, via a new RawNativeFunction variant that holds a plain function pointer instead of an AK::Function (#8922).
O(1) bytecode register allocator. Generator::allocate_register used to scan the free pool to find the lowest-numbered register. We were spending ~800ms in this function alone while loading x.com. With the C++/Rust pipeline parity period over, the allocator is now a plain LIFO stack (#9007).
Cached for-in iteration. for (key in obj) sites now cache the flattened enumerable key snapshot and reuse it as long as the receiver’s shape, indexed storage, and prototype chain still match (#8856). Speedometer 2 went from 67.7 to 73.6, and Speedometer 3 from 4.11 to 4.22!
A grab-bag of other improvements:
The parser uses zero-copy identifier name sharing across the lexer, parser, and scope collector. On a corpus of website JS, parsing is 1.14x faster and uses 282 MB less RSS. (#8801)
Short string concatenations skip the rope representation when the result is going to be observed as a flat string anyway. 2.13x speedup on a tight a + b loop. (#9184)
Lexical-this arrow functions no longer allocate a function environment per call. Another 2.13x on a microbenchmark. (#9192)
Sparse arrays no longer pay an eager cost for their holes: Array(20_000_000) stays mostly metadata instead of doing work proportional to twenty million imaginary elements. (#8847)
A new lazy JS::Substring type backs regexp captures and string builtins like slice, split, and indexed access, gaining 1.066x on Octane’s regexp benchmark. (#8863)
Source positions are preserved end-to-end in bytecode source maps, saving ~250ms on x.com. (#9027)
Zero-copy TransferArrayBuffer saves ~130ms on YouTube load. (#9088)
Cached typed-array views switched from a WeakHashSet to an intrusive list, saving ~250ms loading the Intel ISA PDF in pdf.js. (#9180)
Every Promise allocated two PromiseResolvingFunction cells with AK::Function closures that didn’t actually capture anything. They’re now static functions dispatched by a Kind enum, dropping a per-resolver allocation across every promise the engine creates. (#9188)
Skipping property-table marking for non-dictionary shapes cut 1.3 seconds off GC time while loading maptiler.com. (#9044)
A fast path for Array.prototype.indexOf on packed arrays (#9123)
Array.prototype.sort reuses cached UTF-16 instead of re-transcoding on every comparison (#9036)
Imports for WASM, JSON, and CSS modules (#6029)
Removed ShadowRealm support, since the proposal has stalled in the standards process (#8753)
GTK4 / libadwaita frontend
Ladybird has a new Linux frontend built on GTK4 and libadwaita, sitting alongside the existing Qt frontend (#8691). It’s inspired by GNOME Web (Epiphany) and follows GNOME’s design guidelines: no menubar, a hamburger menu, and AdwTabView for tabs. Out of the box you get autocomplete and security icons in the URL bar, find-in-page, fullscreen, context menus, alert/confirm/prompt/color/file dialogs, clipboard, multi-window, light/dark theme, and DPR scaling. It’s still early, so not yet at feature parity with the Qt and AppKit frontends.
Bookmarks
Last month we got bookmarks. This month they got a proper management UI:
An about:bookmarks page for managing bookmarks and folders (#8825)
Bookmark import and export from the new page (#8938)
Context menus for editing bookmarks and folders (#8715)
A date_added timestamp on every bookmark and folder (#8867)
Bookmarks bar QoL: open in new tab, copy URL, middle-click and Ctrl/Cmd+click to open in new tab (#8758)
The HTML5 drag-and-drop API is now wired up (#8783). about:bookmarks uses it for reordering, and it works on regular web pages too.
Cache and CacheStorage
We implemented Cache and CacheStorage end to end, with all nine methods (open, has, delete, keys, match, matchAll, add, addAll, put) backed by an ephemeral in-memory store (#8745).
CSS features
image-set() : Basic support for the standard and -webkit- prefixed forms. At paint time we pick the candidate whose resolution best matches the device pixel ratio, skipping unsupported MIME types. This makes header images show up on gocomics.com. (#9090)
position-anchor and CSS anchor positioning : Initial support for anchor-positioned elements, fixing the hand and gun positioning on cssdoom.wtf. (#8686)
Color interpolation rewrite : Aligned with css-color-4. We now interpolate in float instead of u8, handle missing and powerless components correctly, deal with out-of-gamut sRGB, and apply alpha multipliers consistently. (#8934)
Color interpolation rewrite : Aligned with css-color-4. We now interpolate in float instead of u8, handle missing and powerless components correctly, deal with out-of-gamut sRGB, and apply alpha multipliers consistently. (#8934)
Presentational hints through the cascade : Legacy presentational HTML attributes (align, bgcolor, etc.) used to bypass the regular CSS cascade and write directly into the element’s cascaded properties. They now go through the cascade as normal author declarations, so var() substitution and the invalid-at-computed-value-time fallback work correctly. Fixes a crash on html.spec.whatwg.org. (#9176)
Presentational hints through the cascade : Legacy presentational HTML attributes (align, bgcolor, etc.) used to bypass the regular CSS cascade and write directly into the element’s cascaded properties. They now go through the cascade as normal author declarations, so var() substitution and the invalid-at-computed-value-time fallback work correctly. Fixes a crash on html.spec.whatwg.org. (#9176)
align on table sections and rows : <thead>, <tbody>, <tfoot>, and <tr> honor the align presentational attribute, fixing button placement on bricklink.com. (#9177)
BeforeAfter
align on table sections and rows : <thead>, <tbody>, <tfoot>, and <tr> honor the align presentational attribute, fixing button placement on bricklink.com. (#9177)
stroke-dasharray interpolation : SVG dashes finally animate smoothly. (#9133)
stroke-dasharray interpolation : SVG dashes finally animate smoothly. (#9133)
autofocus : Elements with the autofocus attribute actually receive focus on page load now. (#9016)
autofocus : Elements with the autofocus attribute actually receive focus on page load now. (#9016)
List markers in RTL text : Bullets now sit on the right side of right-to-left text, fixing list rendering on Arabic Wikipedia. (#9099)
BeforeAfter
List markers in RTL text : Bullets now sit on the right side of right-to-left text, fixing list rendering on Arabic Wikipedia. (#9099)
Inline flex/grid baselines : An inline flex or grid container now derives its baseline from its child’s first line box, not its last wrapped line. Fixes link text and icon alignment on nos.nl. (#9183)
BeforeAfter
Inline flex/grid baselines : An inline flex or grid container now derives its baseline from its child’s first line box, not its last wrapped line. Fixes link text and icon alignment on nos.nl. (#9183)
Networking
getaddrinfo no longer blocks the event loop. LibDNS now runs lookups on a thread pool, fires A and AAAA queries in parallel (RFC 8305-ish), and coalesces concurrent lookups for the same name. RequestServer’s preconnect path was sneaking past our resolver and letting libcurl spawn its own threaded resolver that would pthread_join us on the main thread; that’s now routed through the same DNS pool. (#9109)
Profile of loading x.com when DNS is slow, before and after:
Over in RequestServer, draining queued response data was O(n²) when WebContent was slower than the network. RequestServer was spending ~30 seconds in memcpy and 3 seconds in Vector::remove while opening a YouTube video! Switching AllocatingMemoryStream to a singly-linked chunk list made consumption O(1). (#9028)
We now advertise AVIF and WebP in our Accept header for image requests, matching other engines. Some CDNs use the Accept header to decide whether to serve modern formats or fall back to JPEG. (#9046)
Style invalidation
Selector invalidation used to be straightforward: selectors always looked downward. :host ruined that. :has() made it way worse. Any descendant change can now force you to walk up the tree finding ancestors whose :has() arguments just flipped, and a lot of this month’s invalidation work is about making that walk less wasteful.
Four big wins this month:
Reddit rule cache rebuilds: 13.2s → 3.2s. Stylesheet mutations no longer rebuild every style scope’s cache when only one scope changed. (#9138)
Reddit infinite scroll: 11% fewer pointless recomputes. Sibling structural invalidation stopped fanning out to descendants that don’t observe the position. (#9155)
:has() mutation invalidation skips unaffected anchors , with substantial reductions measured on azure.com. (#9168)
:has() child-list visits on the Intel ISA PDF: 71k → 1.6k. Coalesced when pending data already covers every concrete feature bucket the scope cares about, saving ~650ms on the pdf.js load. (#9179)
A large new structural-invalidation test battery exposed and fixed several invalidation holes (#9095), and a string of smaller tightenings landed around hover, stylesheet mutation scope, custom-property maps, and computed-style diffing (#9077, #9049, #9079, #9080, #9141).
Linux GPU painting via dmabuf
On Linux Vulkan builds, GPU-backed painting was being secretly undone every frame: WebContent painted into a GPU-backed Skia surface, but the buffer it shared with the UI process was a CPU bitmap, which forced a full GPU-to-CPU readback on every flush. SharedImage can now carry a Linux dmabuf handle, so the front and back buffers stay GPU-resident the whole way to the UI process. (#8917, #8920)
mimalloc as the main allocator
Our C++ and Rust code now share a single allocator instance, mimalloc v2, instead of each going through the system allocator separately (#8752). We don’t override malloc() system-wide, so third-party libraries keep their own allocator contracts. JS benchmarks improved across the board.
Sites that work better
The biggest visible wins this month are on Reddit and YouTube.
Reddit image gallery carousels actually work now, after fixing two unrelated layout bugs around ::slotted() matching and absolutely positioned descendants of split inlines (#9148). And thanks to TextDecoderStream, the SPA stops swallowing link clicks, so you can finally open the comments! Infinite scroll also benefits from the structural-invalidation work covered above.
YouTube benefits from a stack of unrelated improvements: off-thread top-level JS compile, off-thread WOFF2 decompression (saves ~170ms on Gmail too, #8976), reduced @font-face fetch fanout (177 → ~9 fetches on initial load, #9032), the RequestServer memory churn fix, and zero-copy TransferArrayBuffer.
A handful of smaller fixes:
gocomics.com : Header images show up, thanks to image-set().
yandex.com/maps : Vector-tile WebGL rendering works after a small pile of WebGL fix-ups, including the WEBGL_debug_renderer_info extension (#9043).
strava.com : Login works now that Navigator.getBattery throws the spec-mandated error type instead of one of our own (#8770).
GitHub Insights : Loads ~100ms faster thanks to the Element.matches() and .closest() selector cache (#8987).
tweakers.net : The laptop comparison page is ~31% faster from indexed HTMLFormElement property name lookups (#9009).
neon.com : No longer crashes (#8812).
channel4.com : Vertically misaligned category text fixed in flex auto-margin resolution (#9050).
Cloudflare Turnstile : Still doesn’t pass, but we fail it much faster now thanks to auth-scheme handling, Array.prototype.shift() optimizations, and a pile of UA event handler hardening on <input> range and number elements (#9063).
Web Platform Tests (WPT)
Our WPT score went from 2,003,537 to 2,067,263 this month, a headline gain of 63,726 subtests. There’s an asterisk on that number: WPT imported test262, the official ECMAScript conformance suite, upstream this month, which added 53,207 JavaScript subtests to the count. We pass 52,045 of them (a 97.8% pass rate), since we’ve been running test262 independently for years and LibJS conformance is in great shape. So roughly 52k of the 63.7k gain is from the import, and the remaining ~11.7k is genuine new browser-platform progress, in the same ballpark as January’s 13,690.
View PDF
HTML (experimental)
Abstract:As artificial intelligence (AI) tools become widely adopted, large language models (LLMs) are increasingly involved on both sides of decision-making processes, ranging from hiring to content moderation. This dual adoption raises a critical question: do LLMs systematically favor content that resembles their own outputs? Prior research in computer science has identified self-preference bias — the tendency of LLMs to favor their own generated content — but its real-world implications have not been empirically evaluated. We focus on the hiring context, where job applicants often rely on LLMs to refine resumes, while employers deploy them to screen those same resumes. Using a large-scale controlled resume correspondence experiment, we find that LLMs consistently prefer resumes generated by themselves over those written by humans or produced by alternative models, even when content quality is controlled. The bias against human-written resumes is particularly substantial, with self-preference bias ranging from 67% to 82% across major commercial and open-source models. To assess labor market impact, we simulate realistic hiring pipelines across 24 occupations. These simulations show that candidates using the same LLM as the evaluator are 23% to 60% more likely to be shortlisted than equally qualified applicants submitting human-written resumes, with the largest disadvantages observed in business-related fields such as sales and accounting. We further demonstrate that this bias can be reduced by more than 50% through simple interventions targeting LLMs’ self-recognition capabilities. These findings highlight an emerging but previously overlooked risk in AI-assisted decision making and call for expanded frameworks of AI fairness that address not only demographic-based disparities, but also biases in AI-AI interactions.
arXiv-issued DOI via DataCite
Submission history
From: Jiannan Xu [view email] [v1]
Sat, 30 Aug 2025 11:40:11 UTC (3,032 KB)
[v2]
Thu, 11 Sep 2025 16:59:36 UTC (3,032 KB)
[v3]
Mon, 9 Feb 2026 13:24:26 UTC (5,723 KB)
19 hours ago
Grace Eliza Goodwin
Getty Images
Driverless cars are becoming more common in some California cities, but when the autonomous vehicles violate traffic laws, police haven’t been able to ticket them - until now.
The state’s Department of Motor Vehicles (DMV) has announced new regulations on autonomous vehicles (AVs), including a process for police to issue a “notice of AV noncompliance” directly to the car’s manufacturer.
The new rules, which will go into effect 1 July, are part of a larger 2024 law that imposed deeper regulation on the technology.
There have been a number of reports of the cars breaking traffic laws, including during a San Francisco blackout last year.
The California DMV is calling the new rules “the most comprehensive AV regulations in the nation”.
Under the new rules, police can cite AV companies when their vehicles commit moving violations. The rules will also require the companies to respond to calls from police and other emergency officials within 30 seconds, and will issue penalties if their vehicles enter active emergency zones.
“California continues to lead the nation in the development and adoption of AV technology, and these updated regulations further demonstrate the state’s commitment to public safety,” DMV Director Steve Gordon said in a press release.
Waymo is one of the main operators of fully self-driving robotaxis in the San Francisco Bay Area and Los Angeles County, but several companies, including Tesla, also have permits to test their AVs in some California cities. The BBC has contacted Waymo and Tesla for comment.
When the vehicles violate traffic laws, some police have been stumped as to how to hold the driverless cars accountable.
In an incident last September, police officers in San Bruno - a city south of San Francisco - noticed a Waymo AV making an illegal U-turn at a light directly in front of them, the San Bruno Police Department said at the time. But when officers stopped the car, they were not able to issue a ticket without a driver to give it to. Instead, they contacted the company about the “glitch”.
San Francisco Fire Department officials have also repeatedly complained about robotaxis getting in the way of emergency responses.
I love going on wilderness adventures. I am rarely happier than when I am far off into the mountains without a soul in sight. As a result, I have spent a lot of time learning how to safely explore and navigate when I’m away from civilization. The most important habit I’ve found for not getting lost is to be very regular in checking your location as you go, and the best way I’ve found to do that is to have a map on my wrist.
For more than six years I’ve been working towards creating the best possible mapping experience on the Apple Watch. With yesterday’s launch of Pedometer++ 8, I feel like this design journey has reached a meaningful destination. I would contend that Pedometer++’s watchOS mapping support is the absolute best available on the App Store.
So I wanted to walk through the journey it took to get here.
Early Efforts
I have wanted a good map on my wrist since the Apple Watch launched. This wasn’t realistically possible until watchOS 6, which brought SwiftUI to the platform and, for the first time, made “real” apps possible. But in those early days, the screens were tiny, and the processors slow. I couldn’t quite get to where I wanted.
This was my very first attempt that shipped in Pedometer++. These maps were generated completely on the server, which involved sending the relevant workout data roundtrip every time I wanted to refresh the display. This system let me validate the idea, but it was never going to be practically useful for navigation or regular use, and could never work offline.
Custom Mapping Engine
I knew that if I wanted to make progress towards this goal, I’d need to work at a lower level, so I got to work building a fully SwiftUI-native map rendering engine. SwiftUI was the only choice because it’s all that watchOS supported, and proved to be helpful for putting maps into widgets, which also only support SwiftUI.
In 2021, I got this engine to a place where I could reliably and performantly render a map on watchOS. With it, I can render any tile-based maps and overlay location information on top.
Map Designs
Next came the question of how best to surface data to users. App design on watchOS is a really fun — but frustrating — challenge. You are designing for a relatively tiny screen, which must be operated one-handed. In this case, I want the user to be able to read the map and use it to navigate, while also having access to other workout-related information.
This began a long series of design attempts, most of which (if I’m being honest) were kinda awful.
In the end, I settled on a “modal” approach where the user can switch between a map screen and a metrics screen using a button on the top-left corner.
This interface provides one context where the user can freely pan/zoom around the map and another where I can use the more standard watchOS tabbed page interface for metrics and controls. I shipped this to Pedometer++, but there was always something that didn’t quite sit right with me about it.
This design felt like a compromise, and not in a good way. I felt that in order to achieve the goal of making the map interactive, I couldn’t have the map be part of any UI structure that involved swipes. As the screens on Apple Watches got larger, it felt less needed in order to give the map enough space to be useful.
So I set about trying alternative designs. SO many designs.
For a while, I thought that I needed to find a way to put the metrics at the bottom of the screen. However, that would lead to other problems on longer outings or for workouts that aren’t navigation-focused. So I kept iterating and came up with even more designs.
All of these designs suffered from the same fundamental issue: they required the app to display only a fixed set of fields at a time.
I could make the interface configurable, but one of the fundamental rules of watchOS design is that you should avoid any interaction that takes more than a few seconds on the watch. Any user-configurable setup is inherently fiddly, so I didn’t like this approach.
Dark Mode, Liquid Glass, & Cartography
Around the same time I was still wrestling with the design challenges of how best to structure the app, Apple announced watchOS 26, and the arrival of Liquid Glass. One of the core design aspects of Liquid Glass is layering stacking elements on top of each other, but another is the types of colors that work best with each other.
I was previously using Thunderforest Outdoors as my basemap for the app. I love the content this map includes, but when I started overlaying glassy elements over it I found that it wasn’t well-suited for Liquid Glass.
So… I commissioned a custom map. Working with the incredible cartographer Andy Allen, we created a completely new basemap that would look fantastic with Liquid Glass.1
We simplified the map visually, increased the contrast of the elements, and made the map elements more saturated to prevent them from becoming a muddy mess when shown below glass.
With this work done, I had another opportunity: I could finally have a dark mode variant of the map tiles. While helpful on iOS, this really shines on watchOS. Andy and I really worked toward something which would be incredibly legible at arm’s length.
The result of these efforts is that now I have a great map for watchOS… but a design that didn’t match that greatness.
Striving for Great
I kept trying. To get me out of my design rut, I enlisted the help of the fantastic designer Rafa Conde. I needed a fresh set of eyes on this and very quickly, this partnership paid off. They proposed a variety of alternative layouts, but when I saw this one I knew it was the one.
The layering of the metrics on the top-left corner, with the map being the top page of a vertical stack, was the correct answer. This design handles interactivity by requiring a tap on the map first to enter “browse mode”.
Tweaking and Polishing
Now that I had the overall concept locked in, the real fun began, actually building the app and dialing in all the details. I fairly quickly took Rafa’s concept and turned it into a working prototype. This let me validate the idea in the field… literally. After walking a few hundred miles with it, I was confident it was the correct approach.
Next, I needed to dial in the font and make more subtle design choices.
After a bit more iteration, I arrived at the design that shipped yesterday. It is legible, useful, and (in my humble opinion) beautiful.
It feels really good to be able to cap off this six-year journey with a design I couldn’t be more proud of. This screen represents so much accumulated effort and learning. It finally gives me a design which feels native on the platform, but also novel and unique.
Here is the evolution of this design over the last six years:
Postscript: Considering MapKit
While my work on watchOS mapping massively predates the arrival of Apple’s MapKit onto the platform, it is probably worth explaining why I decided to do all of this custom work to avoid using it.
Fundamentally, I find that MapKit is great for basic uses, but doesn’t provide nearly the level of configurability and utility which I want Pedometer++ to offer. For example:
MapKit on watchOS always shows in dark mode, which generally is a good default, but closes the door on some accessibility and user choice reasons. I needed it to be a user-selectable option.
While MapKit on watchOS has gotten better over time in terms of what you can do with it, I still find it a bit limiting in terms of animations and overlays.
MapKit’s coverage is improving with regards to topographic contours and trail marking, but there are far too many places where the MapKit map is essentially blank, but I know there should be more rich details available. For example, here is my map vs MapKit at the trailhead of one of my favorite hikes in Scotland.
I still find it so cool that my work on this allows me to say that I “commissioned a cartographer” to work on something for me. 😁 ↩
I still find it so cool that my work on this allows me to say that I “commissioned a cartographer” to work on something for me. 😁 ↩
By Rohana Rezel
I’m running the ongoing AI Coding Contest where I pit major language models against each other in real-time programming tasks with objective scoring. Day 12 was the Word Gem Puzzle. Ten models entered. The results were not what most people would have predicted.
Kimi K2.6, an open-weights model from Chinese startup Moonshot AI, won the challenge outright: 22 match points, 7 – 1-0. MiMo V2-Pro from Xiaomi came second. GPT-5.5 was third. Claude Opus 4.7 finished fifth. Every model from the Western frontier labs landed below the top two.
The challenge
The Word Gem Puzzle is a sliding-tile letter puzzle. The board is a rectangular grid (10×10, 15×15, 20×20, 25×25, or 30×30) filled with letter tiles and one blank space. Bots can slide any adjacent tile into the blank and at any point claim valid English words formed in straight horizontal or vertical lines. Diagonals don’t count. Backwards doesn’t count.
The scoring rewards longer words and punishes short ones. Words under seven letters cost points: a five-letter word loses you one point, a three-letter word costs three. Seven letters or more score their length minus six, so an eight-letter word is worth two points. The same word can only be claimed once; if another bot gets there first, you get nothing. Each pair of models played five rounds, one per grid size, with a ten-second wall-clock limit per round.
The grids are seeded with real dictionary words in a crossword-style layout, then the remaining cells are filled with letters weighted by Scrabble tile frequencies, and finally the blank is scrambled, more aggressively on larger boards. On a 10×10, many seed words survive intact. On a 30×30, almost none do. That turns out to matter a lot.
The code produced by Nvidia’s Nemotron Super 3 contained a syntax error, so it never connected to the game server. Nine models actually competed.
Kimi K2.6 is open-weights, publicly available from Moonshot AI, a Chinese startup founded in 2023. MiMo V2-Pro is currently API-only; the tweet linked here is Xiaomi confirming that weights for their newer V2.5 Pro model are dropping soon.[1]https://x.com/XiaomiMiMo/status/2047840164777726076 The models from Anthropic, OpenAI, Google, and xAI placed third through seventh. GLM 5.1, from Chinese lab Zhipu AI, placed fourth. DeepSeek finished eighth. This isn’t a clean China-beats-West story; it’s two specific models that won.
What I saw
The move logs tell the story. Kimi won by sliding aggressively. Its approach was greedy: score each possible move by what new positive-value words it unlocks, execute the best one, repeat. When no move unlocked a positive word, it fell back to the first legal direction alphabetically. This caused some inefficient edge-oscillation, a 2-cycle pattern where the bot bounced the blank back and forth without progress. On smaller grids where seed words were still largely intact, that hurt. On the 30×30 grids, where the scramble had broken up nearly everything and reconstruction was the only path to points, the sheer slide volume eventually paid off. Kimi’s cumulative score of 77 was the highest in the tournament.
MiMo’s sliding code exists in the repo, but its “best value greater than zero” threshold never triggered, so in practice it never slid once. It went straight to scanning the initial grid for words of seven letters or more and blasted all its claims in a single TCP packet. Brittle strategy: entirely dependent on the scramble leaving intact seed words. On grids where words survived, MiMo cleaned up fast. On grids where they didn’t, it scored nothing. Final tally: 43 cumulative points, second place.
Claude also didn’t slide. The move logs show it holding up well on 25×25 boards where scramble density was still manageable, then falling apart on 30×30 where actual tile movement was needed. Not sliding is a real limitation in a puzzle built around sliding.
GPT-5.5 was more conservative, roughly 120 slides per round with a cap to avoid thrashing, and showed the strongest numbers on 15×15 and 30×30 grids. Grok never slid either, yet scored reasonably on the larger boards. GLM was the most aggressive slider in the whole tournament, over 800,000 total slides, but stalled badly whenever it ran out of positive moves.
DeepSeek sent malformed data every round. Zero useful output. At least it didn’t make things worse by playing.
Muse made things worse by playing.
The scoring penalizes short words: three-letter words cost three points, four-letter words cost two, five-letter words cost one. The intent is to stop bots from carpet-bombing the board with “the” and “and” and “it.” Every serious competitor filtered their dictionary to words of seven letters or more. Muse claimed everything. Every word it could find, regardless of length, fired off as a claim. On a 30×30 grid with hundreds of short valid words visible at any moment, Muse found them all and claimed every one.
Its cumulative score was −15,309. It lost all eight matches and won zero rounds. There is a version of Muse that simply connected to the server and did nothing, and that version would have scored zero, a 15,309-point improvement. The gap between Muse and eighth place was larger than the gap between eighth and first.
DeepSeek’s malformed output tells you something about how it handles novel protocol specs under time pressure. Muse’s spiral tells you something different: it saw valid words and claimed them, with no apparent model of what “valid” meant given the scoring rules. It read the task partially and executed that partial reading in full. Worth noting for anyone deploying these models on structured tasks with penalties.
What surprised me
I design these challenges, so I have a reasonable sense of what they test. What I didn’t fully anticipate was how starkly the 30×30 grids would separate the field. On smaller boards, the difference between a static scanner and an active slider was modest. At full scale, models that could only find what was already there ran out of road. Kimi’s greedy loop, flawed as it was, kept producing output when the static scanners had nothing left to claim.
The other thing worth noting: MiMo and Kimi finished two points apart despite doing almost opposite things. Two different theories of the same puzzle, nearly identical results. That means the gap between first and second was partly seed variance, not just capability difference.
The bigger picture
One fair counterargument: this scoring system rewards aggressive word claiming, and heavily safety-tuned models may be more conservative about that kind of carpet-bombing. If so, the results reflect a mismatch between task design and aligned model behaviour, not raw capability. It’s a reasonable objection. It doesn’t change the outcome.
One challenge doesn’t overturn general benchmarks. This puzzle tests real-time decision-making and whether a model can write clean functional code that connects to a TCP server and plays a novel game correctly. It doesn’t test long-context reasoning or code generation from a spec.
But I’ve been running these challenges long enough to notice what’s changing. A year ago, the assumption was that the Western frontier labs had a capability lead open-weights couldn’t close. Kimi K2.6 now scores 54 on the Artificial Analysis Intelligence Index. GPT-5.5 scores 60, Claude 57. That’s not parity, but it’s close, and it’s coming from a model anyone can download.
When models within a few index points of the frontier are also freely available to run locally, that’s a different competitive situation than the one that existed a year ago. This challenge is one data point in that shift. The gap is small enough now that it shows up in results like this one.
Rohana Rezel runs the AI Coding Contest and is a technologist, researcher, and community leader based in Vancouver, BC.
References
***Please take out a membership to support the light of truth.***
As AI chatbots continue to advance, Russia is infecting them with Kremlin-manipulated content tailored to influence the global internet, distorting the public’s understanding of facts and ability to make well-informed decisions.—Exposing Pravda: How pro-Kremlin forces are poisoning AI models and rewriting Wikipedia, Atlantic Council
Yesterday, I read a Wikipedia page for a book I’m about to review. I am still unsettled.
The page was stripped of reality, and in its place was a sanitized fairytale where Putin is good and the book — a brutal and damning historic account of Soviet abuses — is subtly and not so subtly undermined from every direction.
Once I got over the shock of what I had just read — it was like being forced into an alternate reality — I began investigating Russia’s relationship to Wikipedia. Perhaps not surprisingly, the Russian state has been steadily distorting truth, exploiting the platform’s crowd-sourcing architecture to influence public knowledge.
Malign Activity
In a report by the Institute for Strategic Dialogue titled Identifying Sock Puppets on Wikipedia, its authors used a ‘semantic clustering’ approach to focus on the “English-language Wikipedia entry for the Russo-Ukrainian war, and 48 other pages about Ukraine that link directly to it.”
The authors wrote:
Malign activity has targeted a number of information environments, including every major social media platform: Twitter, Facebook, YouTube, Instagram, TikTok, standalone websites and many others. This paper, however, is dedicated to possible platform manipulation on a venue that tends to be much less researched than mainstream social media: Wikipedia.This report presents work that set out to create, trial and evaluate a method to try to detect covert and organised manipulation of Wikipedia at scale.
Malign activity has targeted a number of information environments, including every major social media platform: Twitter, Facebook, YouTube, Instagram, TikTok, standalone websites and many others. This paper, however, is dedicated to possible platform manipulation on a venue that tends to be much less researched than mainstream social media: Wikipedia.
This report presents work that set out to create, trial and evaluate a method to try to detect covert and organised manipulation of Wikipedia at scale.
As I quickly learned, multiple reports have explored “organized manipulation” on Wikipedia’s entries on Russia’s invasion of Ukraine.
Portal Kombat
Between September and December 2023, the French defense agency Vigilance and Protection Service against Foreign Digital Interference (VIGINUM) analyzed “information portals” disseminating pro-Russian content and targeting several western countries, including France.
In the VIGINUM report, PORTAL KOMBAT: A structured and coordinated pro-Russian propaganda network, researchers investigated a network of 193 sites that initially covered news from “Russian and Ukrainian localities.”
According to the research, the coverage changed the day after Russia invaded Ukraine and began to target occupied Ukrainian territories and western countries supporting Ukraine and its population.
The sites in this network produce “no original content but massively relay publications from sources that are primarily three types: social media accounts of Russian or pro-Russian actors, Russian news agencies, and official websites of local institutions or actors.”
“The main objective seems to be to cover the Russo-Ukrainian conflict by presenting positively ‘the special military operation’ and denigrating Ukraine and its leaders. Very ideologically oriented, this content repeatedly presents inaccurate or misleading narratives. As for the portal targeting France, pravda-fr[.]com, it directly contributes to polarize the Francophone digital public debate.”
“The main objective seems to be to cover the Russo-Ukrainian conflict by presenting positively ‘the special military operation’ and denigrating Ukraine and its leaders. Very ideologically oriented, this content repeatedly presents inaccurate or misleading narratives. As for the portal targeting France, pravda-fr[.]com, it directly contributes to polarize the Francophone digital public debate.”
VIGINUM caught an insertion of the site pravda-fr[.]com being used as a source for a Wikipedia article about a “geopolitical situation” in the Red Sea.
In a footnote, they wrote: “The Wikipedia article titled ‘Operation Guardian of Prosperity’ created on December 22, 2023, was edited the next day by user ‘@ Lataupefr,’ who inserted two articles from pravda-fr[.]com with sources being Russian-pro Telegram channels ‘@ BrainlessChanel’ and ‘@ kompromatmedia.’”
See modifications: https://fr.wikipedia.org/w/index.php?title=Opération_Gardien_de_la_prospérité&diff=prev&oldid=210810683
Foreign Digital Interference
The precise selection of these pro-Russian sources…proves there’s a real targeting effort to disseminate the strategic narratives… Given its technical characteristics, the processes implemented and the pursued purpose, this network constitutes foreign digital interference.—VIGINUM
Those words — foreign digital interference — are very important.
The West has neglected to fight on the battlefield that has been right in front of them the entire time — the internet.
This week, we learned JD Vance and Marjorie Taylor Greene promoted a fake story by the Russian disinformation network — Storm-1516 — which is linked to the GRU and believed to employ workers from the Internet Research Agency, the St. Petersburg operation that attacked American minds to help install Donald Trump in 2016 and whose output was promoted by members of Trump’s 2016 campaign, which I recap in this series:
The story Vance and Greene promoted was an obvious fake — a lie about yachts being purchased with military aid to Ukraine. It’s important to never forget that Vance is Peter Thiel’s replicant and together, they backed Rumble, which is a full-throated Russian propaganda network.
A decade after the 2016 US election, we are watching the escalation of information warfare as new tools are weaponized.
AI Models, Rewriting Wikipedia, and Laundering Content
As Atlantic Council reports in Exposing Pravda: How pro-Kremlin forces are poisoning AI models and rewriting Wikipedia:
“Russia has expanded, developed, and tailored an influence campaign targeting much of the world, spreading its content in Wikipedia articles and in popular artificial intelligence (AI) tools. As election campaigns in Romania and Moldova took place, or as political discussions between US President Donald Trump and Ukrainian President Volodymyr Zelenskyy unfolded, a network of inauthentic pro-Russian portals ramped up its activity, laundering content from sanctioned news outlets and aligning global information sources with the Kremlin narrative machine.”
“Russia has expanded, developed, and tailored an influence campaign targeting much of the world, spreading its content in Wikipedia articles and in popular artificial intelligence (AI) tools. As election campaigns in Romania and Moldova took place, or as political discussions between US President Donald Trump and Ukrainian President Volodymyr Zelenskyy unfolded, a network of inauthentic pro-Russian portals ramped up its activity, laundering content from sanctioned news outlets and aligning global information sources with the Kremlin narrative machine.”
The Atlantic Council referencing the French report notes that much of the fakes are coming from the Pravda network, which it calls a “collection of fraudulent news portals targeting more than eighty countries and regions throughout the world, launched by Russia in 2014. In 2024, the French disinformation watchdog Viginum reported on the operation, identifying the malicious activity of a Crimea-based IT business, findings that the Atlantic Council’s Digital Forensic Research Lab (DFRLab) later confirmed, which showed direct Russian involvement with the network.”
The Pravda network acts as an information laundromat, amplifying and saturating the news cycle with tropes emanating from Russian news outlets and Kremlin-aligned Telegram channels. During the 2024 “super-election year,” the network created websites specifically targeting NATO, as well as Trump, French President Emmanuel Macron, and other world leaders and politicians.—Exposing Pravda
The Atlantic Council report identifies this organized manipulation as global — “a Russian online influence operation that has taken root across the global internet.”
Think of this in terms of transnational organized crime, except instead of drugs, or human trafficking, or arms trafficking, we’re allowing unfriendly foreign powers to manipulate our collective reality — history, culture, our shared narrative.
The Atlantic Council also notes that Russia’s strategy, “in a likely attempt to evade global sanctions on Russian news outlets, is now poisoning AI tools and Wikipedia. By posing as authoritative sources on Wikipedia and reliable news outlets cited by popular large language models (LLMs), Russian tropes are rewriting the story of Russia’s war in Ukraine. The direct consequence is the exposure of Western audiences to content containing pro-Kremlin, anti-Ukrainian, and anti-Western messaging when using AI chatbots that rely on LLMs trained on material such as Wikipedia.
“As AI chatbots continue to advance, Russia is infecting them with Kremlin-manipulated content tailored to influence the global internet, distorting the public’s understanding of facts and ability to make well-informed decisions. This operation opens the door to questions regarding the transparency of the training of AI models and the moderation of content emanating from known Russian-manipulated sources that have persistently divided the West on its support for Ukraine.”
It always comes back to Ukraine.
But it doesn’t stop with Ukraine.
Russia won’t stop until Russia is stopped.
Through these assaults, they are disarming what should be the only substantive resistance to their rebuilding the former Soviet bloc.
They have no right to dictate our will, and it’s pathetic that we’re letting them.
The Sum of All Human Knowledge
In a report titled Characterizing Knowledge Manipulation in a Russian Wikipedia Fork, the authors used a dataset of “1.9 million Russian Wikipedia articles and its fork,” which they call “an organized effort to manipulate knowledge.”
As the world’s largest encyclopedia and the ninth most visited website globally. Wikipedia holds an influential position within the web ecosystem… maintained through a collaborative community effort to become the ‘sum of all human knowledge’ (Sutcliffe 2016).—Characterizing Knowledge Manipulation in a Russian Wikipedia Fork
Its authors note that “knowledge on Wikipedia has a major societal impact” and identity multiple authoritarian countries such as China and Turkey which simply block the platform altogether.
In a section of the report titled “Relevance,” researchers explain how “national identity and public opinion can be influenced by the information citizens are finding online about their history… Wikipedia was ranked the 6th most important information about history, passing museum visits, college courses, and social media (Burkholder and Schaffer 2021). Therefore, attempts to manipulate Wikipedia content, even if they happen in other platforms, could have a significant societal impact.”
They warn that Wikipedia content is frequently used for training Large Language Models (LLMs) and that “manipulated versions of Wikipedia used as training data for LLMs can encourage AI-powered systems that promote ideas with specific biases.”
Immediately after its debut, Elon Musk’s Grokipedia was exposed for pushing extremist ideology and publishing Russian propaganda.
Last year, Musk called for a boycott of Wikipedia and continues to call it Wokepedia, spreading his own propaganda. Trump’s regime has threatened to revoke the tax-exempt status of the non-profit, which turned 25-years-old this year.
Trump, whose alternate reality lie factory, Truth Social, is a fun-house mirror of the name Pravda, which means ‘truth’ and ‘justice’ in Russian, and was the name of the official newspaper of the Central Committee of the Communist Party of the Soviet Union.
While Trump helps Putin rebuild the Soviet empire, I’ll be over here publishing a report on the book that took it down.
****
2016 Election Attack — The Book!
American Monsters — The Book — Buy Here!
Donations Welcome
****
Bette Dangerous is a reader-funded magazine. Thank you to all monthly, annual, and founding members.
I expose the corruption of billionaire fascists, while relying on memberships for support.
Thank you in advance for considering the following:
Upgrade to Paid Member
Upgrade to Paid Member
Upgrade to Founding Member
Upgrade to Founding Member
Gifting memberships
Gifting memberships
Share my reporting with allies
Share my reporting with allies
Buying my ebooks
Buying my ebooks
Donating to the ko-fi fund or directly to venmo
Donating to the ko-fi fund or directly to venmo
Heidi’s Ko-Fi Fund
Heidi’s Venmo
A private link to an annual membership discount for older adults, those on fixed incomes or drawing disability, as well as activists and members of the media is available upon request at bettedangerous/gmail. 🥹
More info about Bette Dangerous - This magazine is written by Heidi Siegmund Cuda, an Emmy-award winning investigative reporter/producer, author, and veteran music and nightlife columnist. She is the cohost of RADICALIZED Truth Survives, an investigative show about disinformation and is part of the Byline Media team. Thank you for your support of independent investigative journalism.
🤍
Begin each day with a grateful heart.
🤍
No posts
To add this web app to your iOS home screen tap the share button and select "Add to the Home Screen".
10HN is also available as an iOS App
If you visit 10HN only rarely, check out the the best articles from the past week.
If you like 10HN please leave feedback and share
Visit pancik.com for more.