Cover illustration

TheDaily Front

Issue No. #260814 Friday, August 14 2026 #260814 — FRIDAY, AUGUST 14, 2026
New models, old links, and one stubbornly free browser.
Friday, August 14, 2026 The Daily Front No. #260814 — Contents
30stories
9,264points
5,022comments
217kllm tokens
Assembled with 32 model calls — 150,329 tokens read, 66,297 written.

Highlights

Qwen 3.8 27B

A flood of new AI models turns the question from raw capability to which machine can actually earn a place at the desk.

Where did the old web go? We followed 657,607 links to find out

A large-scale crawl of a 2009–2014 link archive finds that most of its destinations no longer load.

Firefox is now the last major browser that still supports uBlock Origin

Firefox’s continuing support for uBlock Origin becomes a rare point of differentiation in the browser wars.

In Australia, a home battery boom has helped cut wholesale power prices

Australia’s subsidized household batteries offer a striking case study in turning excess rooftop solar into cheaper power.

Count Binface receives over a quarter of votes in Clacton by-election

Count Binface’s strong by-election showing supplies the day’s most cheerful dispatch from electoral theater.

From the Editor

The machines came roaring off the presses today: frontier coding claims, laptop-sized contenders, private inference, and a great deal of argument over whether progress still feels like progress. Elsewhere, the old web is vanishing link by link—yet the stubborn pleasures of books, blogs, RSS, and a good blocker remain in circulation.

  1. Qwen 3.8 27B3
  2. Why does Opus 5 feel worse to work with?4
  3. Where did the old web go? We followed 657,607 links to find out5
  4. Google is making private AI practical with homomorphic encryption6
  5. Introducing Toast 17
  6. Maximizing the value of your Claude Code sessions8
  7. Going Dark, and the era of law enforcement hacking9
  8. The TEMU-Fication of Software, Digital Goods and Services10
  9. Bluesky Protocol Services11
  10. Don't classify, hallucinate12
  11. Blog about things you don't understand yet13
  12. Show HN: Mole – Deep research agent for your terminal14
  13. Show HN: LuaCAD – Parametric CAD Scripted in Lua15
  14. Show HN: C# Game Engine with its own scripting language and IDE16
  15. Turbo Pascal on CP/M, MSX-DOS and MS-DOS17
  16. Ultraviolet Bird Photography18
  17. Seven books I keep close because I love them19
  18. The Library of Ashurbanipal (2025)20
  19. Count Binface receives over a quarter of votes in Clacton by-election21
  20. Firefox is now the last major browser that still supports uBlock Origin22
  21. In Australia, a home battery boom has helped cut wholesale power prices23
  22. RustDesk now supports true unattended remote access on Wayland24
  23. Differential Heuristics25
  24. Hello, me. It's been a while26
  25. I turned my RSS feeds into an e-ink newspaper to stop reading on my phone27
  26. DeepSeek peak/off-peak pricing update28
  27. France's top court blocks social media ban for under-15s29
  28. GLM-5.3: Frontier coding with emergent cyber capabilities29
  29. Every Fucking Website (2020)29
  30. AI by Hand29
The Daily Front Page 2 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Lead: Models at Home
article

Qwen 3.8 27B

by erdaltoprak·▲ 982 points·635 comments·huggingface.co ↗
These are massive improvements - and something you can actually run on a laptop.

This repository contains FP8-quantized model weights and configuration files for the post-trained model in the Hugging Face Transformers format.

These artifacts are compatible with Hugging Face Transformers, vLLM, SGLang, TokenSpeed, etc.

The quantization method is fine-grained fp8 quantization with block size of 128, and its performance metrics are nearly identical to those of the original model.

For users seeking managed, scalable inference without infrastructure maintenance, the official Qwen API service is provided by Qwen Cloud.

In particular, Qwen3.8-27B will be available as a hosted version with more production features, e.g., 1M context length by default, official built-in tools. For more information, please refer to the Qwen3.8-27B Overview. The service is coming soon. Stay tuned for updates.

Following the widespread community adoption of the Qwen3.5 and Qwen3.6 series, we are pleased to introduce Qwen3.8, the most capable generation in the Qwen open-model family to date.

Built on the architectural foundation of Qwen3.5, Qwen3.8 delivers substantial gains across coding, professional work, research, and long-horizon agentic tasks. Qwen3.8-27B brings these advances to a compact, deployment-friendly dense model: a native vision-language model that understands images and videos, with flexible thinking control, designed to carry complex, multi-step tasks through to completion with greater reliability.

Qwen3.8 Highlights

Qwen3.8-27B features the following enhancements:

  • Core Capabilities: Comprehensive improvements across coding, professional work, research, and long-horizon agentic tasks.
  • Agent Execution: Stronger autonomous planning and better handling of environment feedback, leading to more reliable end-to-end task completion.
  • Downstream Compatibility: Broader support for popular harnesses and development tools, making it easier to integrate into your existing stack.
  • Flexible Thinking Control: Thinking mode is on by default and can be disabled per request; reasoning depth can be tuned with reasoning_effort, and reasoning context from historical messages is retained via preserve_thinking.
  • Vision-Language Understanding: Native support for image and video understanding, from STEM diagrams and documents to hour-scale videos.

Model Overview

  • Type: Causal Language Model with Vision Encoder
  • Training Stage: Pre-training & Post-training
  • Language Model
    • Number of Parameters: 27B
    • Hidden Dimension: 5120
    • Token Embedding: 248,320 (Padded)
    • Number of Layers: 64
    • Hidden Layout: 16 × (3 × (Gated DeltaNet → FFN) → 1 × (Gated Attention → FFN))
    • Gated DeltaNet:
      • Number of Linear Attention Heads: 48 for V and 16 for QK
      • Head Dimension: 128
    • Gated Attention:
      • Number of Attention Heads: 24 for Q and 4 for KV
      • Head Dimension: 256
      • Rotary Position Embedding Dimension: 64
    • Feed Forward Network:
      • Intermediate Dimension: 17,408
    • LM Output: 248,320 (Padded)
    • MTP (Multi-Token Prediction): trained with multiple steps
  • Context Length: 262,144 natively and extensible up to 1,000,000 tokens.

Quickstart

For streamlined integration, we recommend using Qwen3.8 via APIs.

Serving Qwen3.8

Inference efficiency and throughput vary significantly across frameworks. We recommend using the latest framework versions to ensure optimal performance and compatibility. For production workloads or high-throughput scenarios, dedicated serving engines such as SGLang, vLLM, or TokenSpeed are recommended.

Qwen3.8 can be deployed with popular inference frameworks, e.g.:

API Usage

Qwen3.8 models operate in thinking mode by default, generating thinking content signified by <think>\n...</think>\n\n before producing the final response. To disable thinking content and obtain a direct response, refer to the examples here.

We recommend using the following sets of sampling parameters for generation:

  • Thinking Mode: temperature=1.0, top_p=0.95, top_k=20, min_p=0.0, presence_penalty=0.0, repetition_penalty=1.0
  • Instruct (or non-thinking) mode: temperature=0.7, top_p=0.80, top_k=20, min_p=0.0, presence_penalty=1.5, repetition_penalty=1.0

Please note that the support for sampling parameters varies according to inference frameworks.

Qwen3.8 comes with official support for reasoning_effort, which can be used to adjust reasoning depth and control cost:

  • xhigh (default): for complex tasks demanding thorough analysis
  • medium: balancing accuracy and speed
  • low: efficient reasoning optimizing for speed and cost

In addition, preserve_thinking is enabled by default for all workloads for the best out-of-the-box experience. To disable preserved thinking, refer to the examples here.

In multi-turn agentic tasks, lower reasoning effort does not always reduce overall task completion time. Although it may produce faster per-turn responses, it can also lead to insufficient analysis, more failures, and repeated retries, which may increase total latency and token consumption.

Chat Completions API

The Chat Completions API can be used with most inference frameworks, as well as Qwen Cloud. Before starting, make sure the OpenAI Python SDK is installed and the API key and the API base URL are configured, e.g.:

pip install -U openai

# Set the following accordingly
export OPENAI_BASE_URL='your-base-url'
export OPENAI_API_KEY='your-api-key'

Text-Only Input

from openai import OpenAI
# Configured by environment variables
client = OpenAI()

messages = [{"role": "user", "content": "Write a Python function to merge two sorted linked lists."}]

completion = client.chat.completions.create(
    model="Qwen/Qwen3.8-27B-FP8",
    messages=messages,
    extra_body={
        "chat_template_kwargs": {
            "enable_thinking": True,  # on by default
            "preserve_thinking": True, # on by default
        },
    },
    reasoning_effort="xhigh",  # xhigh by default; supported levels are xhigh, medium, and low
    stream=True,
    stream_options={"include_usage": True},
)

reasoning_content = ""
answer_content = ""
is_answering = False
print("\n" + "=" * 20 + "Reasoning" + "=" * 20 + "\n")

for chunk in completion:
    if not chunk.choices:
        print("\nUsage:")
        print(chunk.usage)
        continue

    delta = chunk.choices[0].delta

    if hasattr(delta, "reasoning_content") and delta.reasoning_content is not None:
        if not is_answering:
            print(delta.reasoning_content, end="", flush=True)
        reasoning_content += delta.reasoning_content
    elif hasattr(delta, "reasoning") and delta.reasoning is not None:
        if not is_answering:
            print(delta.reasoning, end="", flush=True)
        reasoning_content += delta.reasoning

    if hasattr(delta, "content") and delta.content:
        if not is_answering:
            print("\n" + "=" * 20 + "Answer" + "=" * 20 + "\n")
            is_answering = True
        print(delta.content, end="", flush=True)
        answer_content += delta.content

messages.append({
    "role": "assistant",
    "content": answer_content,
    "reasoning_content": reasoning_content,
    "reasoning": reasoning_content,
})

Image Input

from openai import OpenAI
# Configured by environment variables
client = OpenAI()

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://qianwen-res.oss-accelerate.aliyuncs.com/Qwen3.5/demo/CI_Demo/mathv-1327.jpg"
                }
            },
            {
                "type": "text",
                "text": "The centres of the four illustrated circles are in the corners of the square. The two big circles touch each other and also the two little circles. With which factor do you have to multiply the radii of the little circles to obtain the radius of the big circles?\nChoices:\n(A) $\\frac{2}{9}$\n(B) $\\sqrt{5}$\n(C) $0.8 \\cdot \\pi$\n(D) 2.5\n(E) $1+\\sqrt{2}$"
            }
        ]
    }
]

chat_response = client.chat.completions.create(
    model="Qwen/Qwen3.8-27B-FP8",
    messages=messages,
)
print("Chat response:", chat_response)

Video Input

from openai import OpenAI
# Configured by environment variables
client = OpenAI()

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "video_url",
                "video_url": {
                    "url": "https://qianwen-res.oss-accelerate.aliyuncs.com/Qwen3.5/demo/video/N1cdUjctpG8.mp4"
                }
            },
            {
                "type": "text",
                "text": "How many porcelain jars were discovered in the niches located in the primary chamber of the tomb?"
            }
        ]
    }
]

chat_response = client.chat.completions.create(
    model="Qwen3.8-27B",
    messages=messages,
)

# When vLLM is launched with `--media-io-kwargs '{"video": {"num_frames": -1}}'`,
# video frame sampling can be configured via `extra_body` (e.g., by setting `fps`).
# This feature is currently supported only in vLLM.
#
# By default, `fps=2` and `do_sample_frames=True`.
# With `do_sample_frames=True`, you can customize the `fps` value to set your desired video sampling rate.
# chat_response = client.chat.completions.create(
#     model="Qwen/Qwen3.8-27B-FP8",
#     messages=messages,
#     extra_body={
#         "mm_processor_kwargs": {"fps": 2, "do_sample_frames": True},
#     }, 
# )

print("Chat response:", chat_response)

Instruct (or Non-Thinking) Mode

Qwen3.8-27B will think by default before responding. You can obtain a direct response from the model without thinking by configuring the API parameters. For example,

from openai import OpenAI
# Configured by environment variables
client = OpenAI()

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://qianwen-res.oss-accelerate.aliyuncs.com/Qwen3.5/demo/RealWorld/RealWorld-04.png"
                }
            },
            {
                "type": "text",
                "text": "Where is this?"
            }
        ]
    }
]

chat_response = client.chat.completions.create(
    model="Qwen/Qwen3.8-27B-FP8",
    messages=messages,
    temperature=0.7,
    top_p=0.8,
    presence_penalty=1.5,
    extra_body={
        "top_k": 20,
        "chat_template_kwargs": {"enable_thinking": False},
    }, 
)
print("Chat response:", chat_response)

If you are using APIs from Qwen Cloud, in addition to changing model, please use "enable_thinking": False instead of "chat_template_kwargs": {"enable_thinking": False}.

Disable Preserved Thinking

By default, Qwen3.8 retains thinking blocks from all historical messages, maintaining a complete reasoning trace across the conversation. This behavior, known as preserved thinking, ensures full context continuity and is especially beneficial for agent scenarios where decision consistency and reduced redundant reasoning are critical. It also improves KV cache utilization, optimizing inference efficiency in both thinking and non-thinking modes.

If you prefer to retain only the thinking blocks from the latest user message, you can disable this behavior by setting preserve_thinking to False:

from openai import OpenAI

# Configured by environment variables
client = OpenAI()
messages = [...]
chat_response = client.chat.completions.create(
    model="Qwen/Qwen3.8-27B-FP8",
    messages=messages,
    extra_body={
        "chat_template_kwargs": {"preserve_thinking": False},
    },
)

If you are using APIs from Qwen Cloud, in addition to changing model, please use "preserve_thinking": False directly instead of wrapping it in chat_template_kwargs.

Best Practices

To achieve optimal performance, we recommend the following settings:

  1. Sampling Parameters: We suggest using the following sets of sampling parameters:

    • Thinking Mode: temperature=1.0, top_p=0.95, top_k=20, min_p=0.0, presence_penalty=0.0, repetition_penalty=1.0
    • Instruct (or non-thinking) mode: temperature=0.7, top_p=0.80, top_k=20, min_p=0.0, presence_penalty=1.5, repetition_penalty=1.0

    For supported frameworks, you can adjust the presence_penalty parameter between 0 and 2 to reduce endless repetition. However, using a higher value may occasionally result in language mixing and a slight decrease in model performance.

  2. Adequate Output Length: To optimize performance on agentic tasks, we recommend allocating sufficient output length to allow the model to generate detailed and comprehensive responses. For frameworks that support separate token limits for internal reasoning and final outputs, we suggest the following configuration within the 1M context length:

    • Reasoning Content: Set the maximum output length to 262,144 tokens.
    • Final Response: Set the maximum output length to 131,072 tokens.

    These settings provide the necessary capacity for complex reasoning while ensuring ample space for high-quality final deliverables.

  3. Processing Ultra-Long Texts: Qwen3.8-27B natively supports context lengths of up to 262,144 tokens. For long-horizon tasks where the total length (including both input and output) exceeds this limit, we recommend using RoPE scaling techniques to handle long texts effectively, e.g., YaRN.

    YaRN is currently supported by several inference frameworks, e.g., vLLM, SGLang, and TokenSpeed. In general, there are two approaches to enabling YaRN for supported frameworks:

    • Modifying the model configuration file:

      In the config.json file, change the rope_parameters fields in text_config to:

      {
          "mrope_interleaved": true,
          "mrope_section": [
              11,
              11,
              10
          ],
          "rope_type": "yarn",
          "rope_theta": 10000000,
          "partial_rotary_factor": 0.25,
          "factor": 4.0,
          "original_max_position_embeddings": 262144,
      }
      
    • Passing command line arguments:

      For vLLM, you can use

      VLLM_ALLOW_LONG_MAX_MODEL_LEN=1 vllm serve ... --hf-overrides '{"text_config": {"rope_parameters": {"mrope_interleaved": true, "mrope_section": [11, 11, 10], "rope_type": "yarn", "rope_theta": 10000000, "partial_rotary_factor": 0.25, "factor": 4.0, "original_max_position_embeddings": 262144}}}' --max-model-len 1000000
      

      For SGLang, you can use

      SGLANG_ALLOW_OVERWRITE_LONGER_CONTEXT_LEN=1 python -m sglang.launch_server ... --json-model-override-args '{"text_config": {"rope_parameters": {"mrope_interleaved": true, "mrope_section": [11, 11, 10], "rope_type": "yarn", "rope_theta": 10000000, "partial_rotary_factor": 0.25, "factor": 4.0, "original_max_position_embeddings": 262144}}}' --context-length 1000000
      

      For TokenSpeed, you can use

      TOKENSPEED_ALLOW_OVERWRITE_LONGER_CONTEXT_LEN=1 tokenspeed serve ... --hf-overrides '{"text_config": {"rope_parameters": {"mrope_interleaved": true, "mrope_section": [11, 11, 10], "rope_type": "yarn", "rope_theta": 10000000, "partial_rotary_factor": 0.25, "factor": 4.0, "original_max_position_embeddings": 262144}}}' --max-model-len 1000000
      

    All the notable open-source frameworks implement static YaRN, which means the scaling factor remains constant regardless of input length, potentially impacting performance on shorter texts. We advise modifying the rope_parameters configuration only when processing long contexts is required. It is also recommended to modify the factor as needed. For example, if the typical context length for your application is 524,288 tokens, it would be better to set factor as 2.0.

  4. Long Video Understanding: To optimize inference efficiency for plain text and images, the size parameter in the released video_preprocessor_config.json is conservatively configured. It is recommended to set the longest_edge parameter in the video_preprocessor_config file to 469,762,048 (corresponding to 224k video tokens) to enable higher frame-rate sampling for hour-scale videos and thereby achieve superior performance. For example,

    {"longest_edge": 469762048, "shortest_edge": 4096}
    

    Alternatively, override the default values via engine startup parameters. For implementation details, refer to: vLLM / SGLang.

Citation

If you find our work helpful, feel free to give us a cite.

@misc{qwen38,
    title = {{Qwen3.8-Max}: A New Bar for Coding and Cowork},
    url = {https://qwen.ai/blog?id=qwen3.8},
    author = {{Qwen Team}},
    month = {August},
    year = {2026}
}
The Daily Front Page 3 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — The Friction of Intelligence
article

Why does Opus 5 feel worse to work with?

by numeri·▲ 814 points·745 comments·mun-logadan.github.io ↗
working with Opus 5 feels like a downgrade

In my opinion and that of the colleagues I've spoken with, working with Opus 5 feels like a downgrade compared to Opus 4.7, Opus 4.8, and Fable.

I'm not claiming a step backwards in capabilities – it is a more capable model than Opus 4.7 and Opus 4.8 and even rivals Fable in benchmarks, yet these other models feel better to work with. I believe this is because they:

  • stop and ask questions if my intent was unclear,
  • don't make assumptions without checking,
  • and don't reinterpret or update my plans without asking.

Because of this, they don't require the careful babysitting that Opus 5 does.

Baseless speculation

I suspect this is the result of two compounding forces at Anthropic, and in current frontier labs in general.

First, the desire to create a self-improving AI that is capable of recursively bootstrapping itself to AGI/ASI.

Second, the pressure to score highly on benchmarks. Although it's an open secret that many benchmark tasks are ill-defined, unfair, hackable, or otherwise broken, a good benchmark task is self-contained. It can be solved. It doesn't require hints, reading the task creator's mind, or outside information to pass.

That doesn't mean a good task can only have one correct answer, just that it should score all unambiguously correct answers equally.

Selecting for models that do well on benchmarks (and indeed training for them or on RLVR tasks in general) inherently selects for models that make bold, usually-correct assumptions in the face of ambiguity. It penalizes models with a tendency to stop and ask for clarification or direction.

Unfortunately, that's exactly what most of us want from a coding agent.

Try as you might, it's nearly impossible to get the entirety of the context, intentions, business implications, budget constraints, and what-have-you written down and accessible to a coding agent. There will invariably be ambiguity and choices to be made, and it is nice to know that an agent will stop and ask when needed.

Real life just isn't a benchmark. There isn't a guaranteed right answer to every question, nor even a set of right answers, and with real-life consequences on the line, I do not want an agent taking its best guess!

The Daily Front Page 4 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — The Vanishing Web
article

Where did the old web go? We followed 657,607 links to find out

by tdx·▲ 222 points·207 comments·0.mk ↗
76.7% no longer returned a loading page.

An old 0.mk database backup held 657,958 links created between 2009 and 2014, along with their click counts. We restored 657,607 of those records as pre-2015 links and followed every destination in August 2026. Of 655,178 safe, crawlable link records, 76.7% no longer returned a loading page.

Most 0.mk users were in Macedonia, so this is not a census of the entire web. It is a large surviving record of what one online community shared during that period, including local news, personal blogs, photo hosts, forums, and the major platforms of the time.

When 0.mk started in 2009, it was a passion project built by a team of three. We worked on it when we could, usually for a few hours a week around our regular jobs. Seventeen years later, one of us found an old database backup on a disk and decided to bring it back.

Here is what those six years of link creation look like, with the long silence after them:

Raw link records, not users. The 2011 spike includes one 83,398-link batch; 97.8% of 2013 records and 99.9% of 2014 records are not attached to a recovered account. The green sliver is the 2026 relaunch.

The survival test

The crawl covers all 657,607 restored link records dated through December 2014. We excluded 2,429 records whose targets were malformed, internal, credentialed, or policy-blocked, leaving 655,178 crawlable historical links.

Even that 23.3% overstates how much survived. A login wall, a parked domain full of ads, or a "this content is no longer available" notice all count as loading. A working page does not mean the original content is still there.

Why 657,607 links but 494,781 URLs? Multiple short links sometimes point to the exact same destination. There are 162,826 such repeat records. Counting each destination once leaves 494,781 distinct URLs, of which 492,620 were crawlable. Only 21.3% of those loaded. The percentage barely moves when repeated destinations are removed: 78.7% still did not load.

At the unique-URL level, 55.0% failed at the network layer after retrying uncertain results from a second network, and 23.7% returned an HTTP error. The most common HTTP result was 404, across 76,403 distinct URLs. Another 29,663 returned 403 or 429; those pages did not load for the crawler, but may be blocking automated requests rather than missing. A 403 or 429 can mean the site blocked our crawler, so "did not load" is more honest than saying every one of those pages is gone.

The same pattern appears at the domain level. Of 133,605 crawlable hostnames, only 34,827 had even one URL load. The other 98,778 had none.

Share with no loading page in the complete crawl. URL-level results count every distinct path; host-level results count each hostname once.

The 2011 split explains the strange annual totals. One account created 83,398 distinct links to pelaphptutorials.com. At URL level, 92.5% of 2011 destinations did not load. Count that host once and the figure is 61.7%, almost identical to 2010 and 2012.

The annual totals do not show a collapse in ordinary usage during 2012. Remove that one batch and 2011 falls from 103,053 records to 19,655; 2012 had 23,148. Almost all records from 2013 and 2014 are anonymous in the recovered data, and three quarters of their hostnames have no loading URL. Raw link volume is not a user-growth curve.

Many of the recognizable survivors are giants: YouTube, Wikipedia, and Google properties. Personal blogs, forums, local news sites, and photo hosts appear throughout the unavailable set. The centralized web has generally held up better than the small web.

A walk through the graveyard

The database reads like a museum of the 2010s internet. Some residents, with the number of links pointing at them:

People shared Facebook photos as direct CDN links; none of the 789 distinct fbcdn.net URLs behind those 835 records loaded. Yet PureVolume now returns pages for 633 of 653 distinct URLs, and Google Code loads or redirects 628 of 754. The original services are gone, but their domains respond. An HTTP response is not the same as preserved content.

The Macedonian layer

0.mk was the first Macedonian URL shortener, so the data is also a record of a national web that partly no longer exists. The links point to A1 Television (shut down 2011), and to the newspapers Utrinski Vesnik, Dnevnik, and Vest, all of which stopped publishing in 2017. Hundreds of links to local news that can no longer be read anywhere except, sometimes, the Internet Archive. The short links outlived the newsrooms.

The gems

Seventeen years of other people's bookmarks contain some treasures:

The first link ever shortened (July 14, 2009, 3:52 AM) was not a manifesto or a launch post. It was a CSS stylesheet on someone's WordPress blog. Two clicks, ever. Empires begin humbly.

On day two, someone shortened localhost. 0.mk/localhost pointed at http://127.0.0.1/. It got two clicks, each of which sent the visitor to their own machine. The shortest URL for the loneliest destination.

The shortest link points at the longest domain. 0.mk/1 has recorded 10,415 clicks while pointing to thelongestlistofthelongeststuffatthelongestdomainnameatlonglast.com, a 2000s curiosity that is itself now gone. Four characters pointing at sixty-three, for 17 years.

The longest URL we ever shortened is 38,753 characters, a 2012 CodePen link whose query string literally repeats TRYING_THE_MAXIMUM_URL. Someone was testing us. We passed, and we still have their test.

4,478 of our links point at other URL shorteners: bit.ly, TinyURL, goo.gl. A short link to a short link, twice the fragility. Google shut goo.gl down in 2025, so every one of those is now a chain with a missing middle: our half still works, and points at a service that no longer resolves. Link rot squared.

And the immortal one: 0.mk/7, created July 15, 2009, points at google.com. 95,999 clicks and counting, and it still points there today, seventeen years and one resurrection later.

Why 0.mk came back

By 2014, 0.mk's revenue did not cover hosting or the work required to keep it running. Spam was constant. Filtering it meant more engineering, and abuse reports needed someone to review them. The original team closed the service.

Seventeen years later, AI has changed that equation. It now handles much of the development, spam detection, abuse review, support, and monitoring that the old project could not afford. That made bringing 0.mk back realistic. The recovered links now run from edge machines in more than 300 cities. More about how that works is here.

How we checked

We tested every restored link dated before January 1, 2015. The crawler followed up to five redirects and retried connection failures from a second network. We counted HTTP 2xx and 3xx responses as loading, reported HTTP errors separately, and never contacted local or unsafe addresses.

The Daily Front Page 5 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Private Computation
article

Google is making private AI practical with homomorphic encryption

by u1hcw9nx·▲ 316 points·185 comments·blog.google ↗
balancing privacy and security is top of mind.

Today we're excited to showcase HEIR, the latest powerful tool added to our Private Computing Toolkit. HEIR is an open source compiler that unlocks cryptographically-secure private AI inference.

Homomorphic encryption

As new benefits emerge with the growth of AI, balancing privacy and security is top of mind. Standard protections like end-to-end encryption present a trade-off: user-data can be protected from data breaches, but then the service provider cannot provide features that depend on the data, such as spam or virus detection. Critical sectors like healthcare and finance are even more averse to these risks, and strict regulations limit data sharing across institutions. Alternative mechanisms to provide the same features, like local processing, are limited by the capabilities of the local device and the sensitivity of the service provider's IP. Shipping proprietary AI to a device risks leaking the model.

A solution to these issues is homomorphic encryption, a rapidly maturing technology that fundamentally alters this trade-off by allowing computations to be performed directly on encrypted data. Servers can process ciphertexts and return encrypted results without exposing any underlying information. For example, a cloud service can provide content recommendations without being able to see the user's features. This is no exaggeration: one of the demos featured in this post does exactly this. But while homomorphic encryption has a nontrivial cost overhead, it shifts the capability/privacy trade-off to a question of cost. And the cost of homomorphic encryption is rapidly decreasing.

Google’s history of innovations in privacy technology—from differential privacy and private set membership to private information retrieval and secure enclaves on Google Cloud—has always focused on securing user data. Homomorphic encryption is another powerful tool we're adding to our private computing toolkit. Like private information retrieval, and in contrast to hardware-based solutions, homomorphic encryption's strong security and privacy guarantees are purely cryptographic. However, manually converting an existing program to use homomorphic encryption efficiently requires a team of cryptographers.

About HEIR

To overcome the usability challenges and advance the opportunity homomorphic encryption provides, researchers and engineers at Google built the HEIR compiler project. HEIR (Homomorphic Encryption Intermediate Representation) is an open-source compiler toolchain and development platform for homomorphic encryption. In particular, HEIR can convert pre-trained AI models that operate on unencrypted data to operate on encrypted inputs. Our vision is to make HEIR a one-click solution to enable non-experts to incorporate encrypted inference into production applications.

Since announcing our intentions in 2023, we’ve seen the homomorphic encryption community embrace HEIR. We have partnered with companies developing hardware accelerators for homomorphic encryption, including Belfort, Niobium, Cornami, and Optalysys. The fruits of those efforts are shown in our demos below, and we plan to demonstrate the latency benefits of these accelerators in the near future. HEIR has also become a productive research platform. By building on HEIR, cryptographers can focus on their specific optimization and use the existing infrastructure for testing, benchmarking, and comparisons. This has resulted in collaborations with Georgia Tech, Carnegie Mellon, UC Santa Barbara, Illinois Institute of Technology, Purdue, the University of Edinburgh, Tsinghua University, and others. To date, four peer-reviewed publications were built on HEIR, with more in preparation, and HEIR has accumulated numerous citations.

Applications of HEIR

To demonstrate how far homomorphic encryption has come, we’re sharing four private inference applications. Each application was compiled with HEIR, and latency numbers are presented for a single-threaded CPU. The source code for all examples is available in our GitHub repository.

  • A Deep Learning Recommendation Model unlocks serving private content recommendations, joint work with Belfort Labs, LG, and New York University.
  • Credit card fraud detection: Together with Niobium and hardshell.ai, we compiled a credit card fraud detector.
  • Threat intrusion: Together with Niobium we compiled the Kitsune system for anomaly detection of encrypted network traffic. This allows a service provider to detect anomalies without revealing the contents of network packets to the service provider.
  • Hotword Detector: Together with Belfort Labs we compiled a hotword detection model, which could allow an audio-triggered AI agent to recognize hotwords while protecting the privacy of the audio recordings.

As the software industry adapts to security and privacy changes amid AI, our research team is working to make homomorphic encryption, easy to develop, fast to run, and ubiquitous across industry.

The Daily Front Page 6 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Search, Specialized
article

Introducing Toast 1

by mplappert·▲ 189 points·59 comments·mixedbread.com ↗
the need for specialised agents

Introducing Toast 1

Toast 1, our first specialised search agent, is available today. It provides frontier search quality, matching or outperforming Claude Opus 5 and GPT-5.6 Sol while being up to 10× cheaper and 12× faster. It performs best with Mixedbread Search, but it can work with any search backend.

Today, frontier models are now able to perform real knowledge work. They can reason, analyse, and find information in complex document collections. But they are also the most expensive models in the stack. As intelligence is increasingly metered, the need for specialised agents able to match their capabilities at a fraction of the cost is greater than ever.

Toast 1 can run as a standalone specialized retrieval agent, or as one of many subagents your frontier model already knows how to rely on. It fully takes over the search loop: given an initial query, it decomposes it into subqueries, gathers evidence, inspects sources, and curates the relevant context before returning it. This lets your agent spend its context and compute on the task that requires a generalist, frontier-level model: reasoning, acting, and producing the final answers.

Waterfall trace of a Toast 1 agentic search: 16 tool calls across 3 rounds answering an employment-rate comparison query in just over 5 seconds.

Pareto Optimal Search

This specialisation of agentic labor results in considerably cheaper search, but also in better end-to-end results on many realistic tasks. We found that Toast 1 establishes a new Pareto frontier across agentic workloads across cost per task and speed per task.

Financial Analysis: OfficeQA Pro V2

OfficeQA Pro V2, released by Databricks, evaluates answer correctness across 90 questions in realistic, complex enterprise financial situations.

GPT‑5.6 Sol with Toast 1 made available as a sub-agent within Codex reaches 70% answer correctness at approximately $1.15 per task: that is the highest score among the systems evaluated by Databricks in the OfficeQA v2 release, establishing new state-of-the-art performance in both quality and efficiency.

Scatter plot of answer correctness versus cost per rollout on OfficeQA Pro V2, log-scale cost. GPT-5.6 Sol running in Codex with Toast 1 as a sub-agent reaches 70 percent correctness at about $1.20 per task, above the previous Pareto frontier from the Databricks evaluation, where Claude Fable 5 on Databricks Genie reaches 60 percent at about $4.

Cost–quality Pareto on OfficeQA Pro V2

By comparison, the previous best performer, Claude Fable 5 on Databricks Genie, reaches 60% correctness at approximately $4 per task, while GPT-5.6 Sol within Codex without Toast 1 only reaches 33% correctness.

This improvement stems from reformulating the economics of evidence gathering. Toast 1's specialization allows it to produce high-quality, token-efficient evidence packages, leaving ample resources for the reasoning process to reach the final answer.

Legal Agentic Benchmark - Firm Knowledge

Harvey LAB's Law Firm Knowledge benchmark seeks to evaluate how well an agent can search and use institutional legal knowledge at large, realistic scales.

Legal work, by nature, is context-heavy. You cannot outargue someone with access to better, more relevant precedents and details. But it is also noisy: many situations are similar but vary by simple details, making it tricky to collect high quality evidence packages without numerous false positives.

On a randomly selected subset of 33 tasks,1 we found that GPT-5.6 Sol's answer quality remained constant across search methods.

Bar chart of total tokens used on the Harvey LAB firm-knowledge benchmark. A vanilla agent uses 80.6 million tokens at 21.7 turns per task. Adding Mixedbread Search cuts that by 42 percent to 47 million tokens at 14.6 turns per task. Adding Toast 1 as a subagent cuts it by another 51 percent to 23 million tokens at 11.2 turns per task. All three configurations reach the identical task score of 55, so the end result is the same performance with 3.5 times fewer tokens.

3.5× fewer tokens with the same performance.

However, increasing search quality drastically increased token efficiency: replacing the vanilla agent's filesystem search with Mixedbread Search cut token usage from 80.6M to 47M at an identical task score. Subsequently adding Toast 1 as its dedicated search subagent reduced it further to 23M, and allowed it to finish in half the turns required by vanilla agent.

The introduction of a Mixedbread Search-powered Toast 1 preserved answer quality, while consuming 3.5× fewer tokens, leading to a cost reduction of over 60%. Toast 1 frees up the context window of frontier models to let them spend their tokens on reaching the right answer.

Demo: Dig Deep Into Dwarkesh's Podcast

Benchmarks and numbers can only tell one part of the story. To truly understand how Toast 1 works, there is no better way than watching it search in action. At Mixedbread, we really enjoy Dwarkesh's podcast, and thought being able to search deep into its transcripts would be fun.

You can try it yourself here.

Frontier Class Retrieval

Although it is a capable subagent for complex tasks, Toast 1 is also a capable standalone model, trained specifically for deep search. It represents the next step of our co-design approach behind our embedding models and Silo: the model, agent harness, and retrieval primitives are designed to work together.2

Retrieval quality versus cost and latency per query on BrowseComp Plus, OfficeQA Pro, and LongSeal. Toast 1 matches or approaches the best frontier-model sweeps on each benchmark while costing a fraction per query and answering in about 8 to 10 seconds, far faster than the frontier sweeps.

On a variety of deep search benchmarks, it reaches frontier model performance, standing in the same league as GPT-5.6 Sol and comfortably outperforming models such as Kimi K3 or GLM-5.2.

It remains lightweight in doing so. A standard Toast 1 run costs approximately 0.016−0.016 - 0.016−0.023 per query and has an eight-second median latency. Our highest-quality fusion configuration costs approximately 0.05−0.05 - 0.05−0.07 per query and has an eleven-second median latency. In practice, among the systems in our evaluation that reached similar performance, Toast 1 was 7–11× cheaper and considerably faster: Frontier-model retrieval agents took between 20 seconds and four minutes on the same evaluation.

Availability and Pricing

Toast 1 is available immediately through the Mixedbread API at the discounted launch pricing:

  • $0.30 per million input tokens
  • $0.036 per million cached input tokens (cache writes are free)
  • $0.72 per million output tokens

Mixedbread search invoked by Toast 1 is priced at a special rate.

With Your Existing Retrieval Stack

Toast 1 was co-designed with Mixedbread Search's primitives and will be at its strongest performance with it. But we put special care in ensuring that it remains backend agnostic: it can run over your existing retrieval indexes, and does not require migrating your existing backend. We conducted thorough testing to ensure that Toast 1 remains competitive with the performance of frontier models in similar conditions at a fraction of the cost and latency, no matter the provided index.

You can use Toast 1 with our Chat Completions API and add it as a retrieval tool to your existing agentic workflows in just a few minutes. Here is a golden harness you can use directly.

With Coding Agents

Let your coding agents handle the integration with npx skills add mixedbread-ai/skills. Or use Toast 1 directly as a subagent with our OpenCode integration.

With Your Mixedbread Stores

from mixedbread import Mixedbread

client = Mixedbread()

results = client.stores.search(
    store_identifiers=["legal-documents"],
    query="does the MSA allow assignment on a change of control?",
    search_options={
        "agentic": True,  # enable Toast 1
    },
)

Get an API key with $5 in included credits to try it out.

Footnotes

  1. We evaluated a randomly selected subset of 33 tasks to make repeated comparative runs tractable. Every configuration used the same tasks and evaluation setup; only the retrieval stack changed.
  2. Toast 1 is part of a growing body of work on specialised search agents, alongside SID-1 and Chroma's Context-1. While each takes a different approach, they share the goal of bringing frontier-level retrieval to production at lower cost and latency.
The Daily Front Page 7 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — The Token Desk
article

Maximizing the value of your Claude Code sessions

by twapi·▲ 154 points·105 comments·claude.com ↗
Run `/clear` between tasks.

How to run efficient sessions that get the most value from every token.

TL;DR

  • Run /clearbetween tasks. This prevents prior irrelevant context from being sent back to the model, which can reduce token usage.
  • Set your model and effort level before you start. Changing either one mid-conversation can bust your prompt cache, which can increase token cost.
  • @-mention files instead of naming them. The file gets attached to your message directly, which saves a Read call, or a search if Claude has to go find it.
  • Add quiet flags to noisy commands, or run them in a subagent. Command output is added to the conversation just like a file, and stays there for the rest of the session.
  • Run /context once in a fresh session. It shows what's loaded (CLAUDE.md, MCP tool definitions), so you can cut out anything unnecessary.
  • /compact before you take a break from your keyboard. The prompt cache expires after an hour, and summarizing a conversation is much cheaper while it's still cached.

Maximizing value

Until pretty recently, the tools you wrote code with were a flat fee (or free). Your editor cost the same whether you fixed one test or fifty that afternoon, so an individual task didn't really have a price of its own. 

With agentic coding tools like Claude Code, it does. The same completed task can also cost different amounts depending on how you use it. 

In one session, Claude reads the test and the file it covers, makes the edit, and is done in a handful of turns. In another, it greps around the repo first, reads a dozen files on its way to the same two, and every one of those turns also drags along everything else that's been read into the conversation since this morning.

It's the same fix, but you spent a different number of tokens on it, and the whole time the model was also having to think about ten files it didn't need.

Being efficient with tokens doesn't mean using fewer of them overall. It means making sure the ones you do use go towards the thing you actually asked for.

So let's look at what decides the price of a token, then what decides how many of them a session sends, and along the way, what that means for how you run a session.

What decides the price of a token

You're billed per token, but what you're actually paying for is inference: the time it takes a GPU (or a TPU, or whatever the model happens to be running on) to run the model over your tokens. 

Three things decide how much of that time a token takes: which model you're running, whether it's an input token (going in) or an output token (coming out), and whether it was cached.

Model

A bigger model does more work on both input and output tokens. Which model is worth it for which kind of work is a topic on its own, and we covered it in Choosing a Claude model and effort level in Claude Code

For this post, all you need to know is that everything else we're about to cover gets multiplied by the model's price: use a larger model when the problem is genuinely hard or ambiguous, and a smaller one when the work is routine.

Curves are for illustration purposes only. They do not represent real benchmark data.

Input and output tokens

A request goes through the GPU in two phases, and they cost different amounts. 

First, during prefill, the model reads your request and context: the system prompt, your CLAUDE.md, your message, and everything that's been added to the conversation since (the files Claude has read and the output of the commands it ran). Those are your input tokens.

Then, during decode, it writes output tokens: its thinking, the tool calls it makes, and the text you see. This happens one token at a time; a 200-token response is 200 runs of the model, one after the other. Per token, decode keeps the GPU busy for a lot longer, which is why output is priced at roughly 5x input.

A lot of the output tokens in a session are thinking tokens, and how much thinking the model does per turn is what the effort level controls. Like the model, the level you pick with /effort sticks around as your default for the next session too.

Tip: run /modeland /effort once in a fresh session to see what you're actually on. Both remember whatever you picked last time, and you want that decision to be deliberate.

Tip: if you already know a session is going to be grunt work, MAX_THINKING_TOKENS=0 claude turns thinking off for that one session (except on Fable 5), which is the step below /effort low.

Prompt caching

If a request starts with exactly the same tokens as a request the server just saw, the state for that shared beginning comes out the same, so the server can keep it around from last time and only prefill whatever comes after it. This is called prompt caching.

Reading from the cache costs 0.1x the input price, because the server loads the state instead of computing it. Writing tokens into the cache costs a bit more than normal input, up to 2x, since the server also has to hold on to the state afterwards. But the write happens once per token, and the 0.1x reads happen on every turn after it.

Claude Code manages the prompt cache on every request, there's nothing to turn on. However you can break it, so it's important to know how to avoid these cost spikes.

Say we type "fix the failing test in utils.test.ts". Here's what Claude Code sends for it:

  1. Claude Code assembles the first request out of the system prompt (tool definitions included), your CLAUDE.md, and your message, and sends it off (input tokens). Nothing is in the cache yet, so all of it gets prefilled and written into the cache.

  2. The model can't fix a test it hasn't seen, so it thinks for a moment and responds with a Read call for utils.test.ts (output tokens). Claude Code reads the file, appends it to the conversation, and sends the whole thing again (input tokens). This time everything from request 1 is read back out of the cache at a tenth of the price, and the only thing prefilled at full price is what's new: the Read call and the file.

  3. Now the model wants the file under test (output). Another Read, another append, and everything goes out again: requests 1 and 2 from the cache, the second file at full price (input).

  4. The model responds with an Edit (output). Claude Code applies it, appends the result, and sends everything again. Same story: the Edit and its result are new, everything in front of them is a cache read (input).

  5. The model runs npm test(output). Claude Code appends the test output and sends everything again, with the test output as the only new part (input).

  6. The tests pass, and the model responds with a short summary (output). No tool call means nothing to append and no request 6, so we're done.

That's five requests for one small fix, and every one of them contained the entire conversation up to that point. A typical turn is lopsided: tens of thousands of tokens going in, a few hundred coming out. But only what's new in that turn gets prefilled at full price. 

That's the whole per-turn bill: cache reads on the history, full input price on whatever's new, and the output price on the response.

This applies on a subscription too. You don't see these prices directly, but the same requests are what draw down your limits.

The cache has to match from the very start of the request forward, and requests always go out in the same order: tool definitions, then the system prompt, then the conversation (with CLAUDE.md at the front of it). 

If anything in that prefix changes, everything behind it gets prefilled again. A tool result appended to the end of the conversation is the ideal case, since nothing is behind it. What throws the cache away is anything that changes the request further towards the front, or changes what the cache is keyed on:

  • /model : every model has its own cache, so on the next turn the entire conversation gets prefilled again at full price. (This includes opusplan, which switches models every time you go in or out of plan mode.)
  • /effort: the effort level is part of what the cache is keyed on too, so it's the same story. It's why both /modeland /effortask you to confirm when you switch in the middle of a conversation.
  • Fast mode: also part of the key, and the re-prefill happens at fast mode prices, so if you're going to turn it on, turn it on at the start. (Turning it off again is free, cache-wise.)
  • /compact : the conversation gets replaced with a shorter one, so nothing in it matches anymore (the system prompt in front of it survives). Writing the summary itself is cheap as long as the old conversation is still in the cache, so it's a lot cheaper before a long break than after one.
  • Time: every turn resets the clock, but the cache expires after an hour on a subscription or five minutes on an API key (ENABLE_PROMPT_CACHING_1H=1makes it an hour). Come back later than that, and the next turn prefills the whole conversation again. Resuming an old session almost always does too: the cache is usually gone by then, and the system prompt gets rebuilt at launch anyway.

None of this means you should never switch models or effort. It means there are cheap moments to do it, the start of a session or right after a /clear, and expensive ones, the middle of a long conversation.

Tip: if the last few turns went somewhere you don't want to keep,/rewind to just before them instead of running /compact. Rewinding only cuts those turns off the end, so everything before them is still cached and it costs nothing. Compacting rewrites the whole conversation, so it always costs something.

What decides how many tokens a session sends

The main thing to know here is that nothing gets sent just once. Everything that ends up in the conversation, a file Claude read or the output of a command it ran, gets sent again on every turn after it, for the rest of the session. 

It's cached, so each of those re-sends is cheap, but cheap isn't nothing, and it's taking up room in the context the model has to think around on every turn too.

That's really the whole cost model of a session: how many tokens end up in the context, how many turns they stay there, and how many contexts you're running at the same time.

What ends up in the context

Part of what's in the context is there before you type anything: the tool definitions, the system prompt, CLAUDE.md, and whatever else gets loaded at startup.

Tip: run /context in a fresh session to see what's in there before you've typed anything. Keep CLAUDE.md to specific instructions and move workflow-specific ones into skills, which only get loaded when they're used. If there's an MCP server you don't need in this session, turn it off with /mcp.

Nearly everything else that gets added during the session is tool results: the files Claude reads, and the output of the commands it runs.

How much Claude reads mostly comes down to how much it has to figure out on its own. If you say "the tests are failing", it first has to find out which tests: a grep or two, a few files opened to see which one is relevant, and all of those results stay in the context long after they've stopped being useful. 

"Fix the failing test in utils.test.ts" skips the searching and costs one Read call for the file, and "Fix the failing test in @utils.test.ts" doesn't cost the Read call either.

Tip: when you're referring to a file, @-mention it instead of typing the path. Claude Code attaches the file to your message before anything gets sent, so it's in the very first request and there's no Read call for it. The file itself takes up the same room in the context either way, so you only need to mention it once per conversation: it stays there, and @-mentioning it again on a later turn generally attaches a second copy.

The other thing that fills up the context is the output of the commands Claude runs. Every time it runs your tests, a build, or a git log, whatever that prints gets appended to the conversation just like a file it read, and stays there for the same number of turns.

Really big outputs are actually fine: after 30,000 characters Claude Code writes the output to a file and only puts a short preview and the path in the conversation (BASH_MAX_OUTPUT_LENGTH if you want to change it). 

The problem is everything under that. A test runner that prints 400 passing tests one line at a time comes in under the limit, and those 400 lines are now part of every remaining turn. 

Claude will often take care of this for you with flags and tail, and if you'd rather not leave it up to Claude, there's a small hook in the docs that rewrites noisy commands before they run so only the lines that matter come back.

Tip: put the two or three commands you run all day in CLAUDE.md, quiet flags included, the way you'd type them yourself ("run a single test file with npx vitest run <file> --reporter=dot"). It's a small addition, but it saves a turn and a few hundred lines of output in every session after it.

How many turns it stays there

One long session costs more than the same work spread over a few short ones, and by more than you'd think, because turn 40 is also re-reading the 39 turns before it. You want the context in your session to be short and relevant, so don't carry one task's context into the next: /clearwhen you start something new, and /compact when the earlier part of the same task is done.

Tip: /rename before you /clearif you'll want the session back later. When you /compact, tell it what to keep, or put a "Compact instructions" section in CLAUDE.md if it's always the same thing. And if you're on a 1M model and would rather have the auto-compact safety net where it used to be, /autocompact 200k puts it back (needs Claude Code v2.1.221+).

Keep an eye on turns that happen when you're not typing, too. A /loop fires as a full turn in the session you set it up in, carrying that whole conversation with it every time, and if it's been more than an hour since the last turn, it's a cache miss on top. Start a fresh session in another terminal and run the loop from there.

Subagents

The other way to keep something out of your context is to have it happen in a different one, which is what subagents are for. A subagent gets its own context window, with its own system prompt, the tools, and your CLAUDE.md, but not your conversation. It runs its own turns, and the only thing that comes back to the main session is its answer. Everything else is thrown away once it's done.

The downside of not having your conversation is that a subagent sometimes has to re-read things the main session already had, and it's paying for its own turns while it does. For a small job it's just overhead. 

It pays off when a job produces a lot of output you don't need to keep, like going through a log. Claude will often reach for one on its own for that kind of thing, and you can ask for one directly when it doesn't ("go through this log in a subagent"). Just keep in mind that the main session only gets back what the subagent chose to report.

Tip: if there's a noisy job you hand off over and over, give it a subagent definition of its own with model: haiku (or sonnet). Otherwise it runs on whatever your main session is running on.

Where to look first

The Daily Front Page 8 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Security’s Long Slide
article

Going Dark, and the era of law enforcement hacking

Everything is about to “go dark”

I’m coming down from spending a few days at Usenix Security, right here in my hometown of Baltimore. This means that my days have been taken up with two kinds of conversation: first, explaining to colleagues why Baltimore isn’t actually like The Wire. And second, trying not to talk about AI.

Here I’m going to break that second rule.

I have many worries about what AI means for our field, for various definitions of “field”. But in this post I want to focus on just one thing I’ve started worrying about, and it’s a perverse thing: specifically, I’m concerned that AI is going to make software much too secure.

While that doesn’t sound so bad on the surface, there’s a consequence to this. I mean something very specific: I’m concerned that U.S. intelligence and law enforcement agencies are about to go dark, meaning: that they’re going to suddenly lose a huge portion of their capability. And that this isn’t going to be simply a problem for those agencies, but also for those of us who value computer security and privacy in general.

Going Dark, and the era of law enforcement hacking

To explain how we got here, we need to talk about recent history. This actually gives me a real excuse to reference The Wire, just because it’s a perfect snapshot of what electronic surveillance looked like way back in 2002. If you’ve seen the first season, you’ll recall that it’s about cops wiretapping drug dealers who use payphones and burners. The mobile phones in the show are relatively new technology for the time, but from a technological perspective nothing in this scenario would have shocked a cop who jumped forward from, say, 1989.

In less than a decade from the premier, everything in those episodes became totally quaint.

The change began in the late 2000s, thanks to the rise of smartphones and texting. Because smartphones can actually store data as well as conveying it, the contents of those phones quickly became a useful new source of law-enforcement capability. Or they were until 2010, when Apple began encrypting iPhone storage using a key derived from the user’s passcode (Android phones followed shortly thereafter.) The next year, Apple deployed end-to-end encryption in iPhone text messages. By 2014, a tiny texting startup named WhatsApp had gathered 600 million users worldwide. By 2016 those users, now nearly a billion strong, were all using default end-to-end encrypted messaging and calls. These two trends — the move from calls to texts, and texts to encrypted data — happened very rapidly. The chart below gives one view of the transition:

The FBI and law enforcement agencies were not insensitive to what was happening. In 2014, Director Comey announced an initiative called Going Dark, which would launch a “national conversation” about what providers could do — or be compelled to do — to make these new communications media legible to law enforcement and counterintelligence.

In 2016, the agency quit talking and took their theory to court. When a terrorist attack left the FBI holding a shooter’s locked iPhone, the agency ordered Apple to give them access. The company refused. What broke the stalemate — and, to some extent, ended “Going Dark” itself — was something that neither the FBI nor Apple expected. An outside company announced that there was no need for Apple’s assistance: they could simply hack the phone.

The Apple v. FBI case turned out to be microcosm of the whole Going Dark debate. For the next decade, law enforcement and intelligence agencies continued to ask for “exceptional access” backdoors. But the urgency was gone: both agencies and manufacturers knew that law enforcement could purchase targeted hacking tools like GrayKey (for phone unlocking), or even remote exploitation tools like NSO Group’s Pegasus, assuming they needed them badly enough. Vendors like Apple and Google played a vigorous defense, closing vulnerabilities as soon as they learned about them. But offensive vulnerability hunters consistently managed to keep the edge.

And now there’s a very good chance that all this is about to be history.

The era of AI bug hunting is here

This April (just four months ago!) Anthropic announced a new model called Mythos that happened to be unusually skilled at software vulnerability finding. The U.S. government temporarily blocked its export, restricting access to U.S. agencies and trusted vendors. While the ban was dramatic and made for good PR, it turned out to be mostly pointless. OpenAI, along with Chinese open-weight model labs like Z.ai and Moonshot, have since demonstrated that vulnerability finding isn’t something that a single lab is likely to hold a monopoly on. The list of serious vulnerabilities that these models have found is getting scarier (or more impressive) by the day.

At first glance, this might seems like good news for the offensive team, and for hackers in general. But I doubt that’s how this will play out in the long term. Defenders are now in the process of patching every bug they can find — often decades worth of bugs — and the backlog feels huge. But they’re making progress. Entire CI toolchains are being rebuilt to incorporate AI-based vulnerability scanning before software ever reaches the point where a human will touch it. While I doubt this means that every bug will be found (even calculating the number of bugs in a piece of code is probably uncomputable), in the real world, it does feel likely that we’re going to hit some sort of a ceiling on the number of useful bugs, and probably we’ll hit it soon.

Thus: over the next two years, major pieces of software are likely to run out of remotely-exploitable bugs.

Obviously I think this is great. But for law enforcement and offensive intelligence agencies, it’s going to be a nightmare. For the first time since 2010, law enforcement might experience what it looks like to really “go dark”, across a huge category of advanced (well-maintained) devices and pieces of software.

So how is this a problem?

The debate over “exceptional access” mechanisms never really went away. In some places, like the UK, it even metastasized into something worse. Here in the US it mostly went into hibernation. Some of the slowdown can legitimately be attributed to expert pushback — academics and industry engineers pointing out the risk that backdoors might be abused by the very adversaries that Agencies are supposed to be protecting us against. But I fear that this was less of a principled pause, and more of a market that was just pricing supply.

The destruction of the low-hanging vulnerability fruit will make law enforcement (and intelligence) agencies’ need much more acute. The demand for constructed, intentional backdoors will re-start in earnest. The result will be enormous pressure on industry to re-architect their systems to make their systems amenable to exceptional access. In some cases, governments will ask for these capabilities in the expectation that they’ll be useful for spying on other governments — a strategy that might have been undetectable in the pre-AI era, but that probably will be less productive now. The results are unpredictable. One result might be that non-US governments entirely remove their dependence on US software.

The worst part about this dynamic is that these potential new backdoors will probably only affect the countries that demand them, meaning that they will be primarily useful for allowing the US to weaken its own systems. This will in turn allow foreign adversaries to find new ways to attack our communications. This deliberate self-sabotage will happen just at a moment when we’re finally getting a handle on securing our own infrastructure.

So what do we do about it?

I honestly have no idea. This is not a call to action for experts to rally behind a sophisticated plan. Like so many things about the AI revolution, it’s just occurring to me that we’re on a long greasy slide to a place that will look different than where we are today. Just realizing this doesn’t mean that I have a clever plan to avoid it. In this case, we’re just going to have to hope that this time we make the right choices, for no other reason than that they’re right.

The Daily Front Page 9 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — The Cheapening of Everything
article

The TEMU-Fication of Software, Digital Goods and Services

by surprisetalk·▲ 150 points·102 comments·xn--gckvb8fzb.com ↗
most of what we consume gets cheaper, more abundant, and noticeably worse

A hypothesis on the not-so-distant future of software, books, music, and movies, in which most of what we consume gets cheaper, more abundant, and noticeably worse, while the human-made variant moves into a luxury segment of its own.

The TEMU-fication of Software, Digital Goods & Services

Disclaimer: This is an opinion piece and most of it is speculation about a future that has not arrived (yet?), based on a few data points that have. As usual, summary at the end.

A few years ago I would have laughed at anyone telling me that there is a serious market for ten-dollar drills, two-dollar dresses, and one-dollar pairs of shoes shipped from a warehouse on the other side of the planet. Today, however, that market exists and it has a name, and it is even publicly traded (sort of, through holdings). TEMU, Shein and a few others have built frankly mind-boggling businesses around the idea that if you make production cheap enough, fast enough, and just barely good enough to look right on a phone screen, an enormous part of the population will buy it, even when the product breaks within a week, when the materials it is made of contain worrying levels of toxic substances, and when the carbon footprint of one delivery exceeds that of an equivalent local purchase by orders of magnitude.

The key to this sort of business model is not innovation, but instead the externalization and compression of cost. Somewhere upstream, people work seventy-five hours a week, in conditions most readers of this website would refuse to even visit, so that the rest of us can have a cheap plastic spatula at our doorstep within five business days. While the visible price collapses, the invisible costs get distributed onto landfills, lungs, and ultimately people that we will never meet.

What follows is a hypothesis I cannot prove but have been turning over in my head for a while, as we are watching the same thing happen to software, books, music, (film-)scripts, and most of the digital goods and services we consume. The cheap labor in this case is not human, it is a Large Language Model (LLM), or what many people these days call “AI”, and the externalized cost is, among other things, quality, which requires craftsmanship to produce, and attention to perceive. And just like with physical goods, we will probably end up with a two-tier market, in which we have a large and massively profitable lower tier of generated slop, and a smaller, more expensive upper tier of work that is still recognizably human.

I’d like to call this the TEMU-fication of software, digital goods and services, and describe what it might look like.

Cheap labor

For decades, the global fashion industry has relied on a workforce that has almost no leverage and no voice, and for which the economics work because someone, somewhere far away, will sew a t-shirt for less than the price of a coffee. Without that skewed arrangement, the entire fast fashion business model collapses. The garment in your hand is only cheap to you because it has been expensive to someone else, in ways that the price tag does not show.

Modern Large Language Models occupy a similar position in the economy, with one important difference, which is that there is no human being in the sweatshop, only a stack of GPUs trained on a corpus of work that other human beings produced over the course of decades. The labor that has been compressed is historical and the model is a kind of compressed copy of the work of millions of programmers, writers, illustrators, and musicians, served back at near-zero marginal cost. Well, at least in theory, and only if the hyperscalers find a way to lower the cost per token, but that’s a different topic.

However, the result is the same. A class of goods can suddenly be produced for an order of magnitude less than before. And, just like with TEMU, those goods turn out to be just barely good enough.

Vibe-coded software

The most direct manifestation of this so far is what is being called vibe coding. The term refers to the practice of describing what you want in natural language to an LLM, accepting whatever it produces, iterating over it with more refined descriptions of the basic idea and eventually shipping the result into production. Whether the developer actually understands what was generated is increasingly considered an implementation detail. And while the output is technically software, the question is what kind of software it is.

A 2025 Veracode report found that approximately 45% of AI-generated code samples failed security tests and contained critical vulnerabilities from the OWASP Top 10, and a multi-language, multi-model academic study that evaluated outputs from Claude, Gemini, Codestral, GPT-4o and Llama-3 across Python, Java, C++ and C, found that a substantial fraction of generated snippets were either non-compliant with basic secure coding standards or actively triggered classified weaknesses (buffer overflows, hard-coded credentials, SQL injection, cryptographic misuse, path traversal, you name it). Even more concerning is a peer-reviewed 2025 paper from IEEE-ISTAS that documents a 37.6% increase in critical vulnerabilities after just five iterative prompts, suggesting that the more you let the model refine its own code, the worse the security posture gets.

When these issues compound over time, the result is a higher total cost than traditional development. However, this doesn’t matter when you don’t think long term, but fast fashion instead. Also, none of this is to say that an experienced engineer cannot use these tools well, because they certainly can. The issue is what happens when the same tools are used by someone who does not know what good looks like in the first place, and there is nobody downstream of them who does either. The output passes the basic test of it runs and looks plausible, ships into production, and accumulates the kind of architectural and security debt that surfaces only when something goes very wrong.

Note: There are credible voices in the industry, particularly from the AI tooling vendors themselves, who argue that AI-assisted development raises a floor more than it lowers a ceiling. In this view, the median piece of software has always been mediocre, written under deadline pressure by tired humans, copied from Stack Overflow without much thought, and held together by duct tape. If an LLM produces output of roughly comparable quality in a fraction of the time, the argument goes, nothing got worse. We are simply removing a bottleneck.

I find this argument partially persuasive, and partially convenient for the people making it. It is true that a lot of software was already not great, but it is equally true that there is a difference between bad code written by a human who at least understood what they were doing, and bad code written by a system that does not understand anything. The first kind can be questioned and corrected, but the second kind tends to compound, because the person shipping it cannot answer why it does what it does. At least for now.

Vibe-written books

Software is not the only place where this is playing out. The book industry is arguably further along, with estimates suggesting that somewhere between ten thousand and forty thousand AI-generated books are uploaded to Amazon’s Kindle Direct Publishing platform every month, many without any disclosure that a model was involved. In June 2023, the Kindle Top 100 bestseller list was found to contain only 19 books written by humans. Amazon has since introduced limits and disclosure requirements, but enforcement is patchy and authors continue to push back against what looks like a slow flood.

Categories that have been hit particularly hard include travel guides (generated guides to cities the author has never visited, with restaurant recommendations that don’t exist), nutrition and health (generated diet advice with citations to studies that don’t exist), and public-domain rewrites (generated adaptations of older books, relying on the recognizability of titles that the actual authors never agreed to). Travel guides in particular have produced a small genre of stories where readers arrive at addresses that turn out to be empty lots, or follow walking directions through neighborhoods that no human would ever recommend.

Note: The defense, again, is that the bottom of the book market was always full of filler, that print-on-demand has been around for a long time, and ghost-written business books and assembly-line genre fiction predate generative AI by decades. However, the new thing is the scale at which low-effort content can now be produced, and the speed at which it can drown out the rest of the catalogue. Authors are competing for shelf space against entities that can ship a hundred new titles in a weekend.

Vibe-created articles & video

A 2025 analysis of 65,000 English-language articles published since January 2020 found that a little over half of all new articles on the internet are now AI-generated, and it’s not only the written word that’s being churned out by machines. YouTube has its own version of the problem, where, according to a Guardian analysis, nearly 10% of the world’s fastest-growing channels feature nothing but AI-generated content, and on Shorts specifically more than one in five videos served to a new user is low-quality AI-generated material.

Vibe-produced music

Not even the highly creative and (up until recently) human process of making music is immune to this TEMU-fication. Spotify has been removing ghost artist tracks for years, but the practice scaled up dramatically when generative tools made it trivial to produce convincing lo-fi background music in arbitrary volume. The platform has reportedly removed 75 million spammy tracks in a single year, and high-profile acts like the AI-generated band The Velvet Sundown amassed over a million streams before being unmasked. There has been at least one criminal case, involving over $8 million in fraudulent royalties, built entirely on AI-generated music and bot streams.

However, that is no reason to applaud Spotify, as the company appears to fight the AI spam only when it’s someone else trying to make money off of it.

Pushback… or delay?

However, there is a sliver of hope, as engagement with AI-generated articles reportedly dropped by around 40% in 2024, and human-generated content seemingly still gets roughly 5.4× more traffic than AI-generated material in some studies. About 38% of consumers openly express skepticism about AI-created content, and people do still seem to be voting with their attention. Whether that vote is powerful enough to shift incentives at the platform level is a different question, and personally I’m not particularly optimistic, especially given that the platforms profit either way.

Let’s take Netflix as an example. From my understanding, the WGA’s 2023 deal explicitly prevents studios from treating AI-generated material as source material, or from using AI to write or rewrite scripts, and Netflix was seemingly bound by that agreement until at least May 2026. Netflix’s own Generative AI Production Guidelines also seem to reflect this, stating that AI is permitted in ideation, but that its use should not replace or materially impact work that would otherwise be done by union-represented writers, actors, or crew members, without proper approvals. While that sounds reassuring on the surface, it is, in my view, a delay and not a limit.

The same company has publicly committed to going all-in on AI in its production pipeline, has signed deals with VFX automation providers that explicitly put a chunk of the global VFX workforce at risk, and has already used generative AI in at least one of its programs (El Eternauta). The trajectory seems to be “use AI everywhere it is contractually allowed right now, expand into the rest the second the contracts permit it, and spin the result as dEmOcRaTiZaTiOn Of CrEaTiViTy”.

Looking forward

So here is my specific (and quite possibly wrong) prediction:

Within the next five to ten years, Netflix will offer a basic subscription tier whose catalogue consists predominantly of AI-generated or AI-assisted content. We are talking generated procedural shows where each episode is remixed from a small set of templates, generated kids’ content that is vaguely educational and impossible to remember an hour after watching, and generated dramas that recycle plots from existing IP and vibe the rest. For this, the viewer pays the lowest monthly price, while the platform pays nearly nothing in production cost and keeps an enormous margin. The only “upside” for consumers will be the lack of ad breaks, as targeted advertising will quite possibly be injected in real-time into the show you’re watching, seamlessly blending into the storyline without you noticing it, but ultimately still triggering your ape brain to crave a refreshing soda or a sweet treat.

Their premium tier, meanwhile, will become the human-made tier. Series with credited human writers, films with credited human directors, and performances by humans whose likeness has not been digitally replicated. The marketing will not call it human-made, because that would be admitting that the cheap tier isn’t, but the price difference will make it obvious. You will pay extra for the same thing Netflix has been selling you all along, except now it is positioned as a luxury.

Clearly, I cannot prove that this is what will happen. Netflix’s own guidelines, as written, prohibit it, and the WGA deal forced a delay. But once the contractual block has lifted, the financial logic is hard to argue with. A streaming service that can produce good enough content for fractional cost will eventually try to. And, mind you, Netflix is just one example. The same logic applies to every other content-distribution business with a subscription model and a margin.

Handmade goods

If you want to know what the human side of this two-tier world looks like, I think the best existing model is the handicrafts and handmade goods market. By 2025, that market was estimated at roughly USD 987 billion globally, with projections reaching over USD 1 trillion by 2035. There is data suggesting that U.S. consumers already spend almost a fifth of their money on handmade goods rather than on mass-produced equivalents, and over half of handicraft buyers globally indicate a preference for products that are eco-certified or made from natural materials, going in the exact opposite direction of what TEMU has been doing.

What this market shows is that industrialization does not erase the artisans, but pushes them into a different segment. People did not stop buying handmade chairs when factories started making chairs cheaply. While the masses opted for the cheaper, mass-produced items, a small but sustained minority of buyers continued to seek out the human-made version, and over time were willing to pay a premium for it.

If the hypothesis holds, software engineering, writing, acting, illustration, composition and the other content-producing professions will undergo something similar. The bulk of the market will migrate to the cheap, mass-produced, generated tier, while a smaller market will continue to value, and to pay for, work that is verifiably the product of a thinking, breathing, opinionated human being. We are already seeing the first signs of this in agencies that explicitly advertise human-only content (at a premium), and in licensing companies flagging tracks as human-composed to distinguish them from AI library music.

I think that the interesting question is not whether this segmentation will happen, but what proportion of the market ends up in each tier, and how robust the upper tier turns out to be.

Ultra-processed

There is a darker version of this analogy. Roughly 57-60% of the daily caloric intake of the average adult in the United States and the United Kingdom now comes from ultra-processed foods. Across 22 European countries the share ranges from 14% to 44%, depending mostly on how protected the local food culture has remained. These foods are cheap, abundant, available everywhere, and nutritionally inferior to the alternatives in ways that have been studied at length. People know this, but they eat them anyway, often because the alternatives are slower, more expensive, harder to find, or require skills that have not been taught.

I suspect that AI-generated content is on the same path. The cheap tier will not be a marginal phenomenon serving a marginal audience, but it will be the default, the cornerstone of how most people consume software, entertainment, news, and information, because it is what the platforms will serve them and what their monthly subscription covers. Some will care enough to seek out the alternative, but most will not, just as most people, knowing what they know about ultra-processed food, do not change their grocery habits.

But maybe I’m wrong

Probably the strongest counter-argument to all of this is that LLMs are still early, that the quality issues are transient, and that within a few model generations the gap between AI-generated and human-generated work will narrow to the point where the distinction stops mattering or might not even be possible anymore. If that is true, the two-tier picture collapses, because there is no longer a quality difference to justify the upper tier, only a marketing difference. The handmade analogy breaks because, unlike a hand-built chair, a generated novel is functionally identical to a written novel once you can no longer tell them apart.

However, I am doubtful that this is going to be the case. There are tasks where I have watched the gap narrow faster than I expected, but there are also tasks where the gap has stayed stubbornly fixed and the failures have just gotten more sophisticated. My instinct is that for narrow, well-bounded technical work, the gap will close further. For long-form work that depends on a coherent worldview, lived experience, and, most importantly, emotions, I doubt it will, because the model has none of those.

The second counter-argument is that the consumer backlash will be stronger than I am giving it credit for. The 40% drop in engagement with AI-generated articles is not nothing, and platform incentives may shift if users start to penalize AI-flooded feeds. Apple and others have started experimenting with content provenance and disclosure schemes that, if widely adopted, could stop the worst of the flooding. So it is possible that I am underestimating the immune response.

The third counter-argument is, that the cheap tier might not be sustainable at all, because AI-generated content trained on AI-generated content degrades model quality, and the broader ecosystem ends up poisoning its own training data. If that turns out to be the dominant dynamic, the cheap tier could collapse before it becomes entrenched.

I think all three of these arguments are valid and have a certain weight to them, but none of them are strong enough, in my view, to make me confident that the TEMU-fication will not happen. They might modulate how it happens, but they probably do not stop it.

Summary

Initially, I went looking for an optimistic ending for this write-up, to say that software engineering is not going away, and writers are not going away, and actors are not going away. And while all of that is, I think, true, none of it should be confused with things will look the same.

What I expect, and what I am to some degree already seeing, is that the people producing software, books, music, scripts, and other human-made work will not disappear, but they will get pushed into a narrower, more specialized, more “luxury”-coded part of the market, pretty much the same way hand-bound notebooks, independent record stores, and small bakeries that mill their own flour did. There will still be a livelihood in it, at times a very good one, but it will look vastly different, and there will probably be fewer people making a living in these fields. My assumption is that they will be more visible inside their niche, but less visible outside it, and they will make their case in part on the basis of provenance, where something was made by a human who knew what they were doing, and you can tell.

Meanwhile, the bulk of what most people interact with will, I suspect, be generated. Some of it will be fine, and some of it will be ultra-processed, in the same sense that a frozen lasagna is ultra-processed. It will be functional, calorically adequate food, but it will not be what your Italian grandmother was making. People will nevertheless eat it because it is there, it is cheap, it is convenient, and because the alternatives have been priced out of their daily life.

There is no “inevitability” to it, because none of this is really decided yet. There are still choices, made by platforms, by regulators, by consumers, and by the people doing the actual work, that will shape which tier ends up being how big and how durable. The handmade market exists because enough people kept buying handmade goods to make it viable. The human-made tier of software and digital goods will exist because enough people keep buying it, or it won’t exist at all. If you are someone who writes code, or stories, or music, or scripts, by hand, with intent, and with a point of view, I do not think the LLM is going to kill your job. I do think, however, that it is going to change the shape of the market you operate in, push you toward the upper tier (whether you wanted to be there or not) and ask you to make a more deliberate case for why your work is worth the difference in price.

For the rest of us, the more interesting question is which tier we are choosing to consume from, and whether we are choosing it on purpose, or just because it was what the algorithm served us by default. I have my suspicions about the answer, but I would love to be wrong.

The Daily Front Page 10 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Beyond the Social App
article

Bluesky Protocol Services

by danabramov·▲ 205 points·65 comments·atproto.com ↗
Bluesky has always run more than the Bluesky app.

A new home for the infrastructure Bluesky runs on the open network — including Jetstream v2 with network replay, a new Jetstream SDK, and a lex-based TypeScript SDK

Today we’re launching Bluesky Protocol Services: a new brand, and a new website, for the public infrastructure Bluesky operates on the AT Protocol network.

Bluesky has always run more than the Bluesky app. We operate Jetstream instances, relays, and the Bluesky API endpoints built on atproto. But if you were a developer trying to build on that infrastructure, our docs didn’t always make it easy to tell what we run as a service or where to start. We’re fixing that today. Bluesky Protocol Services organizes all the documentation developers need within the ecosystem, clarifies the service contracts around Bluesky-provided infrastructure, replaces the old docs.bsky.app site and gives us a clean way to ship future releases like the ones in this post!

Jetstream v2: Network Replay

The headline release shipping alongside the new site is Jetstream v2. Jetstream is the best way for most developers to use the network at scale: you describe the slice you want, and it arrives as plain JSON over a WebSocket. What it couldn’t give you was history. If you needed the records that already existed on the network, you had to backfill repos yourself then cut over to the live stream.

Jetstream v2 adds that capability to the server. It keeps a compressed archive of the whole network and adds a new way to consume it, alongside the live tail:

Network Replay lets you catch up from any point in the past and cut over to live with no gap. You POST your filters to planSnapshot, download the sealed segments it returns over plain HTTP, then connect the live WebSocket once at the tip. Replay is stateless on the server, with no per-consumer cursor, no subscription to register, and nothing to stage on the client. Jetstream is your buffer. You can also just snapshot the network — a point-in-time copy of the archive over HTTP only (listSegments + getSegment), with no live tail. Same archive, same filters, no WebSocket.

This unlocks much more sophisticated server-side slicing without ever backfilling locally: you can spin up an App, run an analysis over a month of posts, or recover from downtime, all through the same JSON shape as the live tail.

Serving these archives is bandwidth-intensive. To ensure the service remains reliable and cheap to run, we’re now requiring an API token just for these requests. The live tail remains open and unauthenticated, it’s only when you request an archive that we require a token. We have no plans to introduce an auth requirement for the live stream.

The v2 instances are live now at wss://jetstream.us-west.bsky.network and wss://jetstream.us-east.bsky.network. The existing v1 instances will keep running unchanged for a while, and the live tail behaves identically on both, so there’s no rush to move. Read the full flow in the Network Replay docs.

And! As always, this infrastructure is open source and self-hostable. See Running your own Jetstream for details.

A Jetstream SDK

Jetstream is plain JSON, so you never need an SDK. But there’s some common glue: reconnecting, deduping, cursor management, decoding events into typed records. Hence, the new Jetstream SDKs: TypeScript and Go clients where you construct a Jetstream object, pass a filter, and for await over decoded, typed events:

import { Jetstream } from '@bsky/jetstream'
import { app } from '@bsky/sdk/lexicons'

const js = new Jetstream('https://jetstream.us-east.bsky.network')

for await (const evt of js.live({ collections: [app.bsky.feed.post] })) {
  if (evt.kind === 'commit' && evt.commit.operation === 'create') {
    console.log(evt.commit.collection, evt.commit.record.text)
  }
}

The TypeScript SDK is available from npm, including npmx.

The Go SDK is available as part of the Jetstream project.

The Jetstream SDK docs go into more detail.

The Bluesky TypeScript SDK, rebased on lex

Back in May we promoted the lex SDK to stable preview and promised that the standalone Bluesky docs would follow. That’s now done: the Bluesky TypeScript SDK is rebuilt on top of @atproto/lex, which means we’re no longer maintaining legacy code paths for Bluesky-specific helpers. This is the lexicon toolchain, fully typed end to end, from the protocol layer up through app.bsky records.

Every TypeScript example on this new site is written against it, marking a huge move away from legacy technical debt—this is good code hygiene for us, and should eliminate LLM recommendations for deprecated SDKs. If you’re still using @atproto/api code, it continues to work as before, and the Bluesky API guides serve as a migration reference.

Updates to endpoints.bsky.app

Finally, the HTTP reference has been updated. Spinning those docs out of https://docs.bsky.app was actually step 1 of this overhaul; we’re now landing the remainder.

The new network.bsky.jetstream.* methods that power Replay — planBackfill, listSegments, getSegment, and getBlock — are now browsable with full request and response schemas, and the reference now documents Jetstream’s WebSocket endpoints too, so the entire Jetstream v2 surface lives in one place.

What’s next

Everything above is live today: the new site, the v2 Jetstream instances, the SDK preview, and the updated HTTP reference. If you’re new to the network, start with How It Works, a visual walkthrough of how records, lexicons, and the firehose fit together. If you’re building against the Bluesky app’s data model, the Bluesky API guides are all still there, freshly rewritten (more on that below)

If you build something on Replay in the next few weeks, we’d love to hear about it; the fastest way to shape where the SDK’s orchestration goes is to show us what you’re folding the stream into.

The Daily Front Page 11 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — A Taxonomy by Imagination
article

Don't classify, hallucinate

by softwaredoug·▲ 226 points·93 comments·softwaredoug.com ↗
Don't classify. Hallucinate!

Using LLMs to classify products, search queries, etc is by now boring. Yet it can still be difficult to constrains the LLM’s output to the legal vocabulary of brands, colors, categories, etc your system allows.

In the Wayfair WANDS e-commerce dataset, for example, you want to classify a query like “wood coffee table” into its most appropriate category. Of which there are hundreds:

Furniture / Office Furniture / Desks
Furniture / Living Room Furniture / Coffee Tables & End Tables / Coffee Tables
Furniture / Living Room Furniture / Coffee Tables & End Tables / End & Side Tables
Décor & Pillows / Decorative Pillows & Blankets / Throw Pillows
Furniture / Bedroom Furniture / Dressers & Chests

The classic way to implement this would be with structured outputs. You tell your provide it must constrain its outputs to a list of legal values. In Pydantic, you create a giant literal of legal output values:

from typing import Literal
from pydantic import BaseModel, Field

FullyQualifiedClassifications = Literal[
 'Furniture / Bedroom Furniture / Beds & Headboards / Beds',
 'Furniture / Living Room Furniture / Chairs & Seating / Accent Chairs',
 'Rugs / Area Rugs',
  ...
  # times 500
]

class QueryClassification(BaseModel):
    """
    Structured representation of a search query for furniture e-commerce.
    Inherits keywords from the base Query model and adds category and sub-category.
    """
    classifications: list[FullyQualifiedClassifications] = Field(
        description="A possible classification for the product."
    )

response = client.responses.parse(
    model="gpt-5.4-mini",
    input="Classify the query: brown coffee table",
    text_format=QueryClassification,
)

print(response.output_parsed.message)
# Outputs: Furniture / Living Room Furniture / Coffee Tables & End Tables / Coffee Tables

This works. But there’s a way to do this a lot cheaper with small / dumb models at scale. Not to mention, there’s an upper limit you can send

Luckily, there’s an easy pattern that makes LLM classification pretty seamless.

Just ask a dumb LLM to invent plausible, fake classifications for your query:

hallucination_prompt = f"""
Your task is to create novel, never seen before, furniture, home goods, or hardware classification that best fit a search query. 

Product classifications might look like:

Furniture / Living Room Furniture / Coffee Tables & End Tables / Coffee Tables
Décor & Pillows / Decorative Pillows & Blankets / Throw Pillows
Furniture / Bedroom Furniture / Dressers & Chests
Kitchen & Tabletop / Kitchen Organization / Food Storage & Canisters
School Furniture and Supplies / School Furniture / School Chairs & Seating / Stackable Chairs
Baby & Kids / Toddler & Kids Bedroom Furniture / Kids Beds

Here's the query to generate classifications for:

brown coffee table

Now we’re not sending the list of legal classifications. We’re instead, asking the LLM to make stuff up:

response = client.responses.parse(
    model="gpt-5.4-mini",
    input=hallucination_prompt,
    text_format=list[str],
)

It’ll then make up some BS that doesn’t actually exist in your real taxonomy like:

Furniture / Living Room / Tables / Coffee

Well that’s not very helpful.

Actually it’s extremely helpful. You can now resolve that into the real vocabulary.

It’s very cheap to build an in-memory set of embeddings of the REAL classifications. As I’ve done in this notebook and this utility.

In the notebook, I compute a MiniLM embedding of every real Wayfair classification. I compute the embedding of the fake, hypothetical embedding from the LLM. I then dot product the fake embedding into the real ones to find the most similar. Producing:

Furniture / Living Room Furniture / Coffee Tables & End Tables / Coffee Tables

You can give these hallucination tasks to dumb / cheap LLMs. And you don’t need to ship the schema over to the LLM every time.

The Daily Front Page 12 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Write Before You Know
article

Blog about things you don't understand yet

by gfysfm·▲ 156 points·45 comments·seangoedecke.com ↗
Every post I publish represents at least two things I’ve learned.

Every post I publish represents at least two things I’ve learned: the thing that prompted me to write the post, and the thing I learned in the course of writing it. If I don’t learn anything new while I’m writing, it’s not interesting enough to publish.

Typically I learn way more than two things. For instance, in my o3 geoguessr post, I started out with the idea that most AI prompts probably don’t work, and I ended up learning that newer OpenAI models have lost o3’s ability to geolocate. That’s interesting! In my most recent post on C2PA, I started out with the idea that C2PA requires near-universal adoption, but I learned a ton of things about PKI, managing private keys on local devices, how C2PA actually works, and so on. In my post on the Luddites, I started out with the idea that the Luddite movement was fundamentally decentralized, but ended up fascinated by Luddite culture (which was far more elitist, misogynist, and violent than the pop-Luddism books describe). I could do this for every single post on the blog.

Taking a position

I think the core reason this works is that every single one of my blog posts argues a point. I never publish a post that just gives some scattered thoughts on a topic, or a post that only says “yes, I agree with this other article”. If I write a draft that nobody sensible could disagree with, I scrap the draft. Making sure that everything I write is at least minimally controversial is a forcing function: it forces me to think about what the most interesting part of my position is, and it forces me to do enough research to defend it against the obvious criticisms.

This is contrary to a lot of advice I read about blogging, which encourages the aspiring blogger to treat their posts as a form of unstructured self-expression. If unstructured self-expression is what you want to do, that’s cool. The point of having a blog is that you get to write what you want. However, this advice isn’t as helpful as it sounds.

Before I was in tech, I was a philosophy grad student. But before that, I was a poet. One thing you learn when you try to write poetry is that it is way easier to write to a restrictive structure than it is to simply “write what you feel”. This should be obvious when you actually think about it. The task of a poet is to repeatedly choose the next word. Writing to a structure (typically rhyme or meter) narrows that choice to a small set of words, instead of the entire English language. It’s the same with blogging. Forcing yourself to write about specific, potentially-controversial points makes consistently writing easier, not harder.

Writing, thinking, and research

Writing is the best way to think clearly about a topic. It’s easy to believe you understand something when you’re just turning it over in your head. When you have to condense that down into words, you find out exactly how much you do or don’t understand. I am constantly having moments where I type something, stop myself, and think “wait, that can’t actually be right”, or “is that really true?”

By the time I write my way to the end of the post, I’m usually thinking so much more clearly about the topic that my conclusion paragraph is way better than my introduction. In fact, I’ve picked up the habit of going back and immediately rewriting the first paragraph as part of my first-draft process, because I know I’m going to end up doing it anyway.

I also change my mind a lot while I write. Here are a bunch of examples of posts where I began writing them with the opposite opinion to the one that eventually made it into the post. I think this is a good sign, and I hope I never stop doing it. You should be researching and thinking about every post you write, and that means you should frequently learn new things that change your mind.

Because of all this, I deliberately choose to write blog posts about things I don’t yet quite understand but would like to, like LLM steering, Stripe’s Tempo blockchain, C2PA and watermarking, space cooling, interaction models, LLM inference internals, and so on. This is great for me, because I learn a lot. Is it great for my readers?

Is blogging to learn irresponsible?

I sometimes worry that I should only be writing about areas I already know very well, like tech company dynamics or working in large codebases, rather than presenting myself as an authority on fields I’m actually still learning. Should I let historians of the Luddites write about Luddism, Web3 engineers write about blockchains, and so on? I think this is acceptable for three reasons.

First, it’s sometimes easier for a beginner to write an introduction to a field than for an expert. Experts routinely overestimate the knowledge of the general public, and have often internalized the reasons why their field is important so deeply that they struggle to express them. I think my explainer posts are valuable because I always spend the first chunk of the post talking about what the original problem is before I get into the technical solution.

Second, sometimes the public consensus on a topic is just plain wrong, to the point where even a little bit of research is enough to demonstrate why. Many of my posts I’m proudest of have been along these lines: arguing that the “500ml per prompt” water usage figure for LLMs was ludicrous, or that the popular Apple “Illusion of Thinking” paper was tracking persistence, not reasoning, that GPUs live longer than three years and the AI companies have large profit margins on inference, and so on.

Third, I try to make it clear on my blog who I am and what my credentials actually are. Even if it’s not explicitly described in the post, I have my real name and resume available on my /about page, so I don’t think a careful reader could be easily fooled into thinking I’m an expert on 19th-century England or space physics or LLM economics or anything like that.

Feedback

Even if nobody reads what you write, writing is still a good discipline for getting your thoughts in order. But another big reason why writing is a great learning tool is that you can get feedback.

I think it’s obvious why this is useful, but I do want to make two points about feedback. First, if you do make your posts public, you need to have a pretty thick skin. People on the internet often fall over themselves to come up with the most cutting criticism or the harshest dunk. This goes double if you take my previous advice and try to write posts that make a clear, controversial point about a subject you’re learning. If you’re the kind of person whose whole day is ruined when a stranger is cruel to them, you might want to keep your blogging private or only share it among friends.

Second, even if your blogging is private, you can get feedback from LLMs. Like humans, LLMs will often give junk feedback. In my experience, OpenAI models will always tell me to moderate my claims or add caveats and hedges until I’m not saying anything at all. Sometimes their criticism will be straight-up wrong. But — particularly about technical topics — LLMs are great at pointing out areas you’ve genuinely misunderstood, and they’re far kinder than the average Lobsters or Hacker News commenter.

Conclusion

I’m pleased and grateful that people enjoy reading my posts, but even when nobody did, I still got a lot of value out of blogging. I write as a method of thinking more clearly, as an excuse to do research on topics I want to learn about, and as a way of getting feedback.

If you’d like to try it yourself, I suggest watching for these two things. First, you should be changing your mind a lot as you write. If not, you probably aren’t doing enough research. Second, your first draft’s conclusion should be much tighter and more expressive than its introduction. If not, you probably haven’t learned anything from the writing process, which means the draft can be scrapped.

I strongly recommend this practice to anyone with an interest in writing. You will see the benefits even if you don’t publish any of your writing on the internet, particularly now that you can get good technical feedback by pasting your post into an LLM1.

  1. For what it’s worth, I’ve fiddled with careful “review prompts” and it’s basically as good to just write “review, please:” and paste your article.
The Daily Front Page 13 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Research From the Terminal
show hn

Show HN: Mole – Deep research agent for your terminal

by lajosdeme·▲ 58 points·9 comments·github.com ↗
A deep-research agent with an enforced budget, verified quotes, and a privacy boundary for local data.

Mole — a deep research agent in Go, exposed over MCP

A deep-research agent with an enforced budget, verified quotes, and a privacy boundary for local data.

Ask a question. mole decomposes it, searches, reads sources, extracts claims, checks each claim against the text it came from, looks for contradictions between them, and writes an answer with citations. Every model call is reserved against a budget before it happens and settled after, so the ceiling you set is the ceiling it hits.

It runs as a single static binary on your machine, uses your own API keys, and speaks MCP so a coding agent can drive it — either by handing mole a question and collecting the answer, or, in toolkit mode, by doing the reasoning with its own model while mole supplies the parts that are not model calls.

mole researching a question: planning, 39 claims, two contradictions found, $0.0149 spent


Why mole

Three things mole does that a chat interface with web search does not.

The budget is enforced, not estimated. Every call is reserved before it is made and settled after, against a ledger with non-negative constraints in the database schema itself. --usd 0.50 means the run stops at fifty cents. Measured overshoot across the test corpus is 0%.

Every claim carries a quote, checked against the source. A claim whose quote does not appear verbatim in the page it was mined from is discarded at extraction, before it can reach an answer. Claims that survive can be re-read against their source afterwards, and one that turns out not to be supported is marked as such in the report rather than quietly dropped.

Your local data stays local. Point mole at a CSV or a folder and it will analyse it without the contents leaving your machine: the model chooses a hypothesis template and column names, mole renders and runs the SQL, and only aggregates — counts, means, test results, buckets covering at least five records — are allowed back. mole crossings shows you exactly what left.


Install

Script — Linux and macOS, amd64 and arm64:

curl -fsSL https://raw.githubusercontent.com/lajosdeme/mole/main/install.sh | sh

Downloads the release archive for your platform, verifies its SHA-256 against the checksums published with the release, and installs mole and mole-mcp into ~/.local/bin (or /usr/local/bin if that is writable). It uses sudo only if the target directory needs it, and --dry-run shows what it would do. If piping a script into a shell makes you uneasy — reasonable — read it first, or use one of the paths below.

Homebrew — macOS and Linux:

brew install lajosdeme/mole/mole

Fully qualified, and it has to be: an unrelated mole (a macOS cleanup tool) is in homebrew/core, so brew install mole will always mean that one. Both install a binary called mole, so only one can be linked at a time.

Arch Linux — from the AUR:

yay -S mole-research-bin      # prebuilt release binaries
yay -S mole-research          # build from source

Not mole: that name and mole-bin on the AUR belong to an SSH tunnelling tool that has held them since 2020. The package installs /usr/bin/mole and declares the conflict, so pacman will tell you rather than overwrite anything.

Debian and Ubuntu.deb from the releases page:

curl -fsSLO https://github.com/lajosdeme/mole/releases/latest/download/mole_amd64.deb
sudo dpkg -i mole_amd64.deb

An .rpm is published for the same platforms.

From source — needs Go 1.25+:

go install github.com/lajosdeme/mole/cmd/mole@latest
go install github.com/lajosdeme/mole/cmd/mole-mcp@latest

Or clone and make install, which stamps the version so mole version reports the tag rather than dev.

Every path installs the same thing: two static binaries with no runtime dependencies, built CGO_ENABLED=0. The database is SQLite, created on first use under your XDG data directory.

Configure

You need a search provider and a model provider. Keys live in ~/.config/mole/config.json, mode 0600 — never in environment variables that leak into process listings, and never in .mcp.json.

mole config set search.provider tavily          # or: brave
mole config set search.tavily-key tvly-...

mole config set llm.provider anthropic          # or: openai-compatible
mole config set llm.api-key sk-...
mole config set llm.model claude-sonnet-5
mole config set llm.cheap-model claude-haiku-4-5

mole doctor                                     # verify everything above

Any OpenAI-compatible endpoint works — DeepSeek, Ollama, llama.cpp, vLLM, a proxy:

mole config set llm.provider openai-compatible
mole config set llm.base-url https://api.deepseek.com/v1
mole config set llm.model deepseek-chat

A model served from localhost is priced at zero and still counted in tokens, so --tokens bounds a self-hosted run that costs no money at all.


Usage

Research a question

mole research "how much electricity does the bitcoin network use?" --usd 0.50
mole research "..." --tokens 200000            # token budget instead of dollars
mole research "..." --max-sources 8 --max-depth 3
mole research "..." --json                      # machine-readable result

Budget is required, and the two units are mutually exclusive. Only dollar mode can price a search call; only token mode can bound a model whose rates mole does not know.

Ask a follow-up

mole ask <session-id> "what did the Cambridge estimate say?"

Answers from the claims that session already collected. No new searching, no new spending beyond the one call to phrase the answer.

Build a dataset instead of prose

mole research "largest UK supermarket chains and their revenue" \
  --mode dataset \
  --schema 'company:text!,revenue:number=annual revenue in GBP,employees:number' \
  --usd 0.50

mole dataset <session-id> --format csv > chains.csv
mole dataset <session-id> --format json          # every value every source gave

! marks the field that identifies a row. Rows are merged across sources by fuzzy key, so Aldi and Aldi UK become one row with two sources. CSV holds one value per cell and says so — it carries a source count and a contested column naming the fields the sources disagree about. JSON carries every disagreeing value with the sources behind each.

Analyse local data

mole connect add sales ./exports/sales.csv       # one file
mole connect add exports ./exports               # or a whole folder
mole research "how does spend differ between regions?" \
  --actors local_compute --usd 0.30

mole crossings <session-id>                      # what left the machine

CSV, TSV, JSON and JSONL are supported; Parquet is not. The model never sees a row and never writes SQL — it picks a template and column names, and mole renders the statement.

Serve MCP clients

mole serve

Listens on a unix socket, mode 0600, in a private directory, and refuses connections from any other user. Point a client at the shim:

{
  "mcpServers": {
    "mole": { "command": "mole-mcp" }
  }
}

No credentials in that file — the shim forwards to the daemon, which holds them.

Use the subscription you already pay for (toolkit mode)

mole serve --toolkit

The arrangement above has mole own the model: it plans, mines and writes with your API key, and the coding agent driving it is pressing a button. Toolkit mode inverts that. The agent's model does the reasoning; mole contributes the deterministic half — which is the half worth having, and the half that does not care whose model is on the other side of it.

If you are inside Claude Code or Qwen Code on a subscription, your model tokens are already paid for. This is the mode for that.

Fourteen tools, each named mole.<tool>, alongside the research.* tools — the flag adds a surface rather than replacing one:

  • session session_open, session_close
  • retrieval search, fetch — through mole's SSRF guard, robots handling and rate limiter
  • evidence verify_quote, claim_add, claims_list, citations
  • local data connect_list, aggregate — the privacy boundary, unchanged
  • graph pairs_candidates, edge_add
  • dataset rows_add, dataset

Inspect a run

mole sessions                # recent sessions and what they cost
mole trace <session-id>      # per-call cost and timing breakdown
mole stats --fetch           # why fetches failed, across sessions

How it works

question
   ↓  planner            decompose into sub-questions, replan as evidence arrives
   ↓  executor           one lead at a time per worker, reserved and settled
   ↓  actor              search → fetch → extract → mine claims
   ↓                     every claim quote-checked against its source
   ↓  verifier           pair up related claims, adjudicate, build the claim graph
   ↓                     re-read a sample of claims against their sources
   ↓  output             synthesise from claims that survived, with citations
answer

Three actor types feed the same graph. web searches and reads pages. academic queries Crossref, OpenAlex, arXiv and PubMed, deduplicates by DOI and prefers open-access full text. local_compute runs deterministic SQL over data you registered and never lets a row reach the model.

Toolkit mode runs the same machinery with the arrows reversed: the agent decides what to search, what to read and which claims relate, and mole does the quote checking, the pair retrieval, the merging and the SQL rendering. Both modes share one copy of each — the same AcceptRow for dataset rows, the same aggregation gate, the same lexical retriever — so a toolkit graph and an autonomous one are built the same way.


Honest numbers

mole grades its own runs. mole eval <session-id> prints a scorecard, and any metric it cannot compute says so instead of quietly reading zero.

budget overshoot 0% — no run has exceeded its ceiling
claim integrity 100% — every stored claim carries a source and a verbatim quote
citation accuracy 100% — every quote found in the source it cites
grounding rate 80% — of claims re-read against their source, confirmed
contradiction precision 70% with the confirm pass, 51% without
merge precision / recall 1.000 / 1.000 on constructed ground truth


Contributing

Bug reports and issues are welcome. Code contributions go through a CLA — see CONTRIBUTING.md, which explains what it is for and what it cannot do.

Maintainers: the release runbook is RELEASING.md.

The one practice this project asks for that most do not: falsify your own fix. After a change, revert the mechanism and confirm the test fails. A test that passes with the fix removed proves nothing, and several of this project's own tests have been caught doing exactly that.

gofmt -l .      # must print nothing
go build ./...
go test ./...   # must be clean, and no new skips

Licence

Apache-2.0. See LICENSE and NOTICE.

The Daily Front Page 14 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Making Shapes in Lua
show hn

Show HN: LuaCAD – Parametric CAD Scripted in Lua

by adius·▲ 86 points·17 comments·luacad.ad-si.com ↗
Scriptable CAD with Lua.

Scriptable CAD with Lua. Write parametric 2D and 3D models in Lua and export them to 3MF, STL, OBJ, PLY, OFF, AMF, or SCAD, or render them straight to a PNG.

LuaCAD embeds Lua 5.4 in a Rust engine that evaluates CSG operations directly (via Manifold) or generates OpenSCAD code for external rendering.

LuaCAD Studio previewing the MuSHR racecar model, a 43-part assembly of 490,802 triangles, beside the Lua script that builds it

Why Lua?

  • Similar syntax as the OpenSCAD language, but better:

    • More powerful
    • More consistent
    • Faster
    • Easily embeddable
  • Operator overloading for natural CSG syntax (a + b, a - b, a * b)

  • Already used in other CAD software like LibreCAD and Autodesk Netfabb

Example

LuaCAD:

my_cube = cube { size = { 1, 2, 3 } }

function my_sphere(radius)
  return sphere({ r = radius }):translate(5, 0, 0)
end

model = my_cube + my_sphere(2)

render(model)

Equivalent OpenSCAD:

module my_cube() {
  cube(size=[1,2,3]);
}

module my_sphere(radius) {
  translate([5,0,0]) sphere(r = radius);
}

union() {
  my_cube();
  my_sphere(2);
}

Getting Started

cargo install luacad         # CLI for running and converting LuaCAD scripts
cargo install luacad-studio  # GUI desktop app with live 3D preview

Or from source, which requires Rust:

git clone https://github.com/ad-si/LuaCAD.git
cd LuaCAD
make install

Both crates vendor their C/C++ dependencies, so no system libraries need to be installed — but a C++ compiler and CMake must be available to build them. luacad builds Manifold and Clipper2; luacad-studio additionally builds OpenCSG, which needs OpenGL development headers (on Debian/Ubuntu: libgl1-mesa-dev, libx11-dev, libxcb1-dev, libxkbcommon-dev, libxrandr-dev, libwayland-dev).

CLI Usage

luacad convert model.lua output.3mf   # Convert to 3MF
luacad convert model.lua output.stl   # Convert to STL
luacad convert model.lua output.scad  # Export as OpenSCAD
luacad watch model.lua output.3mf     # Rebuild on file changes
luacad render model.lua preview.png   # Render to a PNG image
luacad info model.lua                 # Print triangle counts and bounding box
luacad lint model.lua                 # Lint with selene (also takes directories)
luacad run model.lua                  # Execute (side-effects only)

convert and watch infer the format from the output extension; --format <fmt> overrides it, and --via-openscad hands the export to an installed OpenSCAD binary instead of building the mesh with Manifold.

BOSL2

LuaCAD has full support for the Belfry OpenSCAD Library v2, reimplemented in LuaCAD itself, so it renders, previews and exports to a mesh without OpenSCAD or BOSL2 installed:

bosl.cuboid { {40, 40, 40}, rounding = 2 }
bosl.regular_prism { 5, r = 10, h = 25 }
bosl.spur_gear { circ_pitch = 5, teeth = 20, thickness = 5 }

Exporting to .scad still writes the BOSL2 call itself, which keeps the exported file as short as the script that produced it.

Text and Imports

text() outlines a system font into a sketch and text3d() extrudes it in one step, so text becomes real geometry rather than SCAD output:

render(text("LuaCAD", { size = 12, halign = "center" }):linear_extrude(2))

import() reads every mesh format LuaCAD writes and returns a solid you can transform and combine like any primitive; SVG and DXF return a 2D sketch instead, ready to extrude.

Supported Export Formats

  • SCAD - OpenSCAD format
  • 3MF - 3D Manufacturing Format
  • STL - Standard Triangle Language for 3D printing
  • OBJ - Wavefront 3D object format
  • PLY - Polygon File Format
  • OFF - Object File Format
  • AMF - Additive Manufacturing File Format

Every value your script returns becomes its own 3MF object, so slicers load them as individually movable parts. Label them with :name(…) to control how they appear in the object list. The other formats cannot express separate objects, so they flatten everything into a single mesh.

For more information, check out the GitHub Repository

The Daily Front Page 15 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — The Homemade Engine
show hn

Show HN: C# Game Engine with its own scripting language and IDE

by am-gm·▲ 107 points·55 comments·github.com ↗
building a whole language + IDE + engine from scratch is insane

rbr_ss4

rbr_ss22 rbr_ss3 rbr_ss1

Video of an example game made with the engine

ArcadeMaker is a simple 2D cross‑platform game engine that includes its own programming language (its prototype is called Exp) and an integrated IDE.
The engine and IDE themselves are written in C#, but the language you use inside ArcadeMaker to program your games is my custom language, not C#.

Currently, the graphics and audio backend is powered by MonoGame, which allows exporting to desktop, mobile, and consoles. I’m also planning to add a KNI-engine implementation to enable web support.

This project is not finished yet.
But since I have very little time to work on it, I decided to open‑source it in the hope that others will find it interesting and help turn it into something real.

ArcadeMaker is based on GameMaker 8, so if you’ve ever used it, you’ll find it very easy to learn.


Project Background

ArcadeMaker has been built in several stages over the span of a few years, and different parts of it were written at very different points in my programming journey.

  • The IDE was written about three years ago, when my programming skills were very different from what they are today.
  • The Exp language was created after the IDE, but still before the current core engine and before the MonoGame implementation existed.

Originally, ArcadeMaker started as a C#‑based engine where users wrote their game logic directly in C#. After leaving the project for a while, I eventually created my own programming language and decided to return to ArcadeMaker — replacing the old C# scripting layer with my language and rewriting the core engine around it.

Because of this long, staggered development history, the IDE currently includes many features that the new engine backend does not yet support. For example:

  • Parent objects — supported in the IDE, not yet implemented in the engine.
  • Dll package manager - exists in the IDE, but currently has no any effect (it had when the engine used C# for scripting).

The long‑term goal is to bring the new engine up to feature parity with the old C# version — and then expand far beyond it.


Planned Features

  • Full implementation of the missing IDE features in the engine
  • KNI-engine backend for web export
  • A more complete and stable version of the Exp language
  • Implementing all the common, daily‑use game functions such as drawRect(), deactivateInstancesInRegion(), setRoomWidth(), and many more
  • Cross‑platform templates for mobile and console builds
  • Documentation, tutorials, and example projects

Why Open Source?

I love working on ArcadeMaker, but I don’t have enough time to develop it at the pace it deserves.
By open‑sourcing it, I hope others will:

  • Experiment with the engine
  • Improve the language and tooling
  • Add missing features
  • Fix bugs
  • Help shape the future of the project

If you enjoy GameMaker‑style workflows or want to contribute to a lightweight, beginner‑friendly 2D engine, you’re more than welcome to join.


How to Build

  1. Clone the repository.
  2. Open the solution in your preferred C# IDE (Visual Studio, Rider, or VS Code).
  3. Restore NuGet packages.
  4. Build the project.
  5. Run the IDE project to start ArcadeMaker.
  6. (Optionally) - After the IDE is loaded, go to "File -> Open Project" to load an example project from "tests/Example Projects".

Contributing

Contributions of all kinds are appreciated:

  • Code improvements
  • Bug fixes
  • Documentation
  • Feature proposals
  • Engine backend implementations
  • Language design ideas

Before submitting a pull request, please open an issue to discuss your idea. Currently I'm only one dev working on this project alone in my free time, so documentation is really, really missing. I'll try do my best to improve it, but please feel free to ask any question you have about anything related to the project, I'll answer to anything!


License

This project is licensed under the MIT License.
See the LICENSE file for details.


Note About This README and AI Usage

I used GPT to help write this README file.

And since AI is mentioned, a few words about it:
This project contains almost 0% AI‑generated code or architecture. The only exception is that I used Claude to write the Separating Axis Theorem formulas for collision detection, because that math is a bit too heavy for me. Other than that, everything — the engine, the IDE, the language, the architecture — is hand‑written.

Not because there’s anything wrong with using AI as a programming tool. I know it’s a huge part of the future of software development.
It’s just that I built this project for fun and for the challenge, and personally I enjoy writing the code myself rather than having a machine do it for me.

In the era of AI and its growing power, I still believe a complete version of this project could be genuinely useful. ArcadeMaker is a beginner‑friendly engine, and people will always need to understand how code works, even if they eventually stop writing every line by hand. The only real way to learn that is by actually writing code.
And beyond learning, this engine can also be a great tool for anyone who simply wants to make games for fun, by themselves, without relying on AI to do all the work.

The Daily Front Page 16 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Pascal, Still Turbo
article

Turbo Pascal on CP/M, MSX-DOS and MS-DOS

by rbanffy·▲ 81 points·26 comments·pascal.hansotten.com ↗
Turbo Pascal’s IDE

Pascal compilers for the MSX

Blaise_pascal

The Pascal language was named after Blaise Pascal (see picture), a French mathematician who was a pioneer in computer development history. In 1641, at the age of eighteen, Pascal constructed the first arithmetical machine, arguably the first computer. He would improve upon the instrument eight years later. In 1650, Pascal left the world of geometry and physics, and shifted his focus towards religious studies, or, as Pascal wrote, to “contemplate the greatness and the misery of man.” Pascal died in Paris on August 19, 1662.

Niklaus Wirth completed development of the original Pascal programming language in 1970. He based it upon the block structured style of the Algol programming language. There were two original goals for Pascal. According to the Pascal Standard (ISO 7185), these goals were to a) make available a language suitable for teaching programming as a systematic discipline based on fundamental concepts clearly and naturally reflected by the language, and b) to define a language whose implementations could be both reliable and efficient on then-available computers.

Pascal was used in the seventies and eighties as the computer language in programming education. It served as the main programming language to teach structured programming.Many compilers were available for all current platforms these days. The language itself is a standard now (ANSI) but also served as model used by Wirth for more advanced (modular) languages such as Modula and Oberon.

Borland produced Turbo Pascal both for CP/M and MS-DOS, version 3 was a huge success and much of the software in the eighties on small computers is written with Turbo Pascal. Alas it was not standard Pascal, instead very practical adapted to the CP/M and MS-DOS environment.
Version 3 was the last version for CP/M, on the PC many versions followed (Borland Pascal 7 was the last DOS-based) and eventually evolved to Delphi (Windows) and Kylix (Linux).

Read this great introduction how to write GOOD programs!

Turbo Pascal may not be the only Pascal compiler running on MSX, it is the best supported one.

The untouched and not installed version(see the Pascal course in MCCM part 1!):
Turbo Pascal 3.01 for CP/M

A version of Turbo Pascal was distributed by Philips. In the package you find:

  • Turbo Pascal 8 bits MSX This version was a real Borland product, as you can see on the floppy label.
  • A book by Jeff Dunteman with demo disk “Turbo Pascal Compleet”,

stpfloppy

Manual, Front and Back CoverBelow are scanned images of the front and back covers of the Turbo Pascal 3 manual. Back in those days the manual was the product. The floppy disk placed inside the manual cover along with the license agreement, invitation to join on CompuServe forums and other paper marketing pieces. Click on each image to display a larger version of each cover.
The manual of Turbo Pascal 3.0 (MS-DOS, CP/M-86 and CP/M/MSX-DOS) is also available, thanks to Fred Kraan

tp3front tp3back Turbo Pascal 3.0 manual

A patched and installed version
MSX-2 version of Turbo Pascal 3 Made by MCE aka Frits Hilderink including the GIOS and a PC version!
This is the official distribution placed here with permission of Frits Hilderink!
Turbo Pascal 3.3f

Turbo Pascal DataBASE Toolkit 1.2 , official add-on by Borland

For MS-DOS with debugger (handy crosscompiling!)
Turbo Pascal 3.01 for the PC Untouched (and now freeware!)
Turbo Pascal 3.02 for the PC

Another Pascal compiler: Hisoft Pascal 80

Pascal development environments

Turbo Pascal out of the box is not able to use the MSX facilities. Other than MSX-Basic there are no instructions to do more than text output.Luckily it is not too difficult to give access to all MSX secrets with socalled include files containing pieces of machinecode as INLINE statements.Here a rich collection of powerfull environments is given that allow you to do anything possible on a MSX with easy to write and understand Pascal programs.

Martijn Dekker, the author of the Turbo Pascal package MDL-LIB has given permission to publish the latest and greatest version 2.2 and declared it public domain.
Some of the enhancements are:
– .typ-, .var- and .con- filesbestanden (type-, variable- and constant declarations) are integrated in the .lib- files, avoids many includes.
– works with turbo Pascal 3.3

See the leesmij.txt in the archive MDL-LIB v2.2

Slotman has made an IDE for Turbo Pascal 3.3 running on the PC (Windows). You can find it here in the utils section.
Included are include files for developing games in Pascal! The very funny game Snow fighters in the Our games section (throwing snowballs) is interesting for the MSX Info pages since he included the sources in Turbo Pascal.

Slotman writes: Do you program in Pascal for MSX? Are you tired of a bad IDE, waiting the code to compile on MSX, etc? So this is the solution: MSX PAD. An IDE made for Windows, so superior to MSX-Pascal that you will ask yourself HOW nobody did it before. And on top of that it comes with all my include files that I used to make breakfree!

INL Pascal library

Pascal software and library made by Carlos de Santa-Ana Garcia for INL, the TCP/IP stack made by Nestor Soriano for a.o. the MSX ethernet interface Obsonet and serial RS232 interfaces.

The library
A telnet client
A telnet server

Hans Otten Pascal programs

Pascal source with examples of filter programs: while copying a text file make adjustments like stripping to 7 bits or adding/removing text.

Pascal source by me of two programs:
split (makes two halves of a file) and combine (glue the two halves together again) for MSX-DOS and CP/M.

CNVS and MSX12CNVI have written programs to convert the MSX graphical screen formats back and forth to the PC.

When i wrote them it was the dark age of MS-DOS, so I used Turbo Pascal and as graphical file format PCX. It still works, even under Windows 95/98.
And I finally finished MSXCNV12 to convert to screen 12 in may 1999 after working on it for 8 years!
Paintshop Pro is highly recommended to manipulate the graphics on the PC. All sources are included. All programs are freeware. MS-DOS programs!

CNVS version 2.3 : MS-DOS program to convert MSX screen 0-8 to PCX and back including sources

This 2.3 version is a recent update (june 1999), is now in English and with a cleaner syntax.

CNVS version 2.1 : old MS-DOS program to convert MSX screen 0-8 to PCX and back in dutch only.

MSX12CNV: MS-DOS program to show or convert MSX screen 12 (in full color)

MSXCNV12: MS-DOS program to show or convert PCX on the PC to MSX screen 12 (in full color)

Quickbasic program to convert RAW file (create with Paintshop PRO) to screen 12 full color by Hans Schoormans

On request: a Windows 95/98 program to convert MSX screens to and from PCX
(actually a wrap around CNVS, MSX12CNV and MSXCNV12)
CNVSW as Windows installable program. Note the readme.txt.

PCX format description the official guide how PCX is done

INDEX MSX and MS-DOS programs to build a database of files on your floppies with Pascal sources

My MSX pascal include libraries

To write intelligent programs on MSX. I used Turbo Pascal v3.00. To access the MSX 1 and 2 facilities I developed Pascal libraries a long time ago. Many followers copied and enhanced those libraries but here are the original: complete with tools.

In it are functions like line, box, circle, fill figure, sprite, show text on graphics and so on.

Pascal include libraries

The magazines have paid attention to this environment with many articles, collected as far as available, here.

The Daily Front Page 17 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Birds See Another Spectrum
article

Ultraviolet Bird Photography

by EndXA·▲ 123 points·23 comments·uvbirds.com ↗
giving them a hidden dimension of color that is not visible to humans.

UV ultraviolet bird vision photo
combined ultraviolet and visible light

visible light photo
visible light

UV ultraviolet photo
ultraviolet

The irridescent display feathers of Anna's hummingbird reflect red and ultraviolet light, giving them a hidden dimension of color that is not visible to humans. The main photo represents what birds might see. It's a combination of the ultraviolet and visible light images. Unlike Anna's hummingbird, the ruby throated hummingbird throat feathers do not reflect UV light. The presence or absence of UV reflectance might help hummingbirds recognize their own species.

Here are all of the captions from the slides shown above:

The irridescent display feathers of Anna's hummingbird reflect red and ultraviolet light, giving them a hidden dimension of color that is not visible to humans. The main photo represents what birds might see. It's a combination of the ultraviolet and visible light images. Unlike Anna's hummingbird, the ruby throated hummingbird throat feathers do not reflect UV light. The presence or absence of UV reflectance might help hummingbirds recognize their own species.

The flamingo also reflects UV light. As with the hummingbird, the combination of red and UV shows up as purple in the main photo. Read the "about" link above for an explanation of how this works. Unlike the flamingo, the red on this blackbird appears dark in the UV photo. The blackbird has different red pigments, which absorb more UV light.

The same thing happens with yellow pigments in birds. The yellow belly of the plush-crested jay reflects ultraviolet, causing it to show up as pink in the combined photo. But not all yellows are the same. The eye also appears yellow to us, but in the UV photo it's totally dark (except for the highlight). Birds would see the eye and the belly feathers as two different colors!

This is an alternative presentation of the plush-crested jay, in which I have used a pattern of dots to indicate which areas are reflecting ultraviolet light. This makes it possible to show the UV information, without altering the visible light colors.

In contrast to the plush-crested jay, the yellow on this toucan appears quite dark in the ultraviolet. This is indicated by the lack of pink color in the combined photo. The bare skin around the eye has some UV reflectance.

This photo shows hidden UV coloration in both the chicory flower and the goldfinch. The back of the bird is more UV reflective, compared with the cheek and belly.

Blue color in birds is caused by the microscopic structure of the feathers, instead of blue pigments. In most cases, like this western bluebird, the UV reflectance follows the same pattern as the blue light reflectance. The indigo bunting is another example.

The blue-bellied roller is an exception. It has three different shades of blue, and the very dark blue of the belly is quite bright in the ultraviolet. The blue back of this trogon doesn't reflect much UV, causing it to appear green in the combined photo.

White feathers always reflect UV. Black or brown feathers are always UV-dark. The striking black and white pattern of the red-bellied woodpecker is exactly the same in ultraviolet or visible light.

In this green-winged macaw, the beak and the facial skin both look almost white, to the human eye, but the beak does not reflect as much ultraviolet light. Birds will likely perceive two different colors. The common parakeet or budgie has some interesting UV features. There is a small UV reflective patch on the chin, which appears dark violet to humans. Notice also, unlike most yellow birds, the yellow feathers on the head of the parakeet strongly absorb ultraviolet light.

The Daily Front Page 18 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — The Elbow Shelf
article

Seven books I keep close because I love them

by surprisetalk·▲ 319 points·141 comments·blog.plover.com ↗
The bookshelf by my elbow

The bookshelf by my elbow, the one that I can reach without getting up, has seven books on it, not necessarily the ones I look in the most, but the ones whose emanations I most hope will infuse me as I write.

Roget's Thesaurus (4th edition)

The one I actually refer to most often is the Harper and Row Roget's Thesaurus. I thought I had acquired this in my teens, but the note on the flyleaf says 1989.

This is the fourth edition. I was very excited to get the eighth edition, which I thought I might like better, and for some time I kept them next to each other so that I could look up the same things in both, and compare. my conclusion was that while the eighth edition had more stuff in it, it wasn't stuff I needed. And it is really fat. So I have retired it to a farther shelf and will eventually get rid of it.

The thesaurus is a book that is widely misunderstood. It is not, as many people mockingly imagine, just a compendium of synonyms, and its correct and intended use is not to replace common words with more impressive-sounding ones. just as the correct use of a screwdriver is not to scrape the veneer off of an expensive cabinet.

“Thesaurus” means “storehouse" or “treasure room”. Roget's idea, similar to that of John Wilkins before him, was to classify everything in the world into a hierarchy, in this case a hierarchy with a thousand divisions. At the top level the divisions are grouped into "Abstract concepts", "Space”, “Physics”, “Matter”, “Sensation” and so on. Then under “abstract concepts” there are subclasses, of which subclass VI is “Time”, subdivided into five smaller sections:

A. Absolute time
B. Relative time
C. Time with reference to age
D. Time with reference to season
E. Recurrent time

At the next level down, section (1)(VI)(B) is divided into:

§116. Priority
§117. Posteriority
§118. Simultaneity
§119. The Past
§120. The Present
§121. The Future

Roget's idea is that if you are thinking or writing about time, and specifically about how it goes by, you will leaf through those sections for inspiration, not to find a more pompous way of expressing something you have already written, but to refine your own idea of what it is you wanted to express.

Perhaps you are trying to say that one event followed immediately after another. You might look at “§117 posteriority (later time)” which mentions “ensue”, “consequence”, “aftermath”, and “subsequent” — not synonyms, but related aspects of similar concepts, worth more or less consideration depending on what you are trying to emphasize. §117 will also suggest common phrases like “step into the shoes of” — not a synonym by any means, but a related idea. This is probably not what you wanted in this case, but it in another it might be just the thing, and in any case it might give you a bright idea.

If nothing in section 117 seems suitable, it is right next to “§116 priority”, and you might discover that instead of saying that the second event followed immediately after the first, you would rather say that the first immediately preceded the second. Or perhaps you realize, looking at “§118 Simultaneity”, that what you really want to say is that the two event were not quite simultaneous. Or perhaps, finding your way to “§131 Earliness” and “§132 Lateness” you realize that your meaning would be more clearly expressed if you said that the second event was a little tardy, or that the first event was premature.

Looking through the index for “immediately” you will see that the index distinguishes several senses of “immediate”: are you trying to suggest instantaneity, or continuity, or haste, or promptness, or punctuality? And in this way the book helps you refine your understanding of what you were trying to say.

One can use the thesaurus for more concrete tasks. Perhaps I am trying to remember a word, but I can't quite put my finger on it. I know it it is not “coexisting”, but is something like it. I can look up “coexisting” in the index, and it will take me to “§118 Simultaneity” where I find “contemporaneous”… aha, that's what I was looking for! The really important thing about the thesaurus is this large-scale organizing principle, which puts related ideas near one another.

Note that none of this works for someone who doesn't know what the words actually mean. All that person can do with the thesaurus is to replace one wrong word with another one, more or less at random. Effective tool use requires skill and training, and careful thought.

An online version would be more convenient, but again, it wouldn't have the same stuff and I am very attached to the one I have.

My banishment of the 8th edition left a lot of space on the shelf, some of which I have filled with an anthology of the prose of Sir Thomas Browne. I think this will be healthful and inspiring for me, especially if I remember to take it up and thumb through it from time to time.

The Prose of Sir Thomas Browne

One recurring theme on this blog since the very earliest days has been the writers of the English Baroque period. In 2008 I wrote:

[Browne] is witty, and learned, and wise, and humane, and to read his books is to feel that you are in the company of this witty, learned, wise, humane man, one of the best men that the English Renaissance has to offer, and that you are profiting thereby.

His work was also a favorite of Jorge Luis Borges', in case you consider that a recommendation.

Browne has shown up here a number of times, although not so much as he should have, because I started the blog the year after I was on my big Thomas Browne kick. One reason I have put this book next to my elbow is that I hope it will spark a new Browne kick. (I wrote in 2006 “I'm sure I will return someday”, and it is long past time for that return.)

My favorite book by Browne is his Pseudodoxia Epidemica, which is a compilation of stuff that people in 1646 believed that Browne thought was probably wrong. I wrote about that in some detail in 2008 although I didn't get around to publishing it until 2020. And somehow the other three articles I was writing about this have never seen the light of day. One is about his discussion of whether John the Baptist actually ate locusts or whether they were locust beans or something else. Browne is firmly on the side of it being actual locusts, as am I. My unpublished article says:

Chester Brown's version of the gospels makes it clear that John was a crazy old bug-gobbler.

Panels from Yummy Fur #17, page 15, by Chester Brown.

Also Sir Thomas comes up in connection with whether snails have eyes in their horns — a rare example where he was wrong, and for a dumb reason:

If we concede they have two eyes, we must alse grant, they have no lesse than four… And therefore if they have two eyes, they have also four, which will be monstrous, and beyond the affirmation of any.

Browne seems to be noping out of the very idea of four-eyed snails, and therefore that they must have none at all. In a later edition of the book, he changed his mind, which is to his credit.

He had a thoughtful and well-informed opinion about whether Pythagoras forbade his followers from eating beans, supposedly because he thought they contained the souls of the dead. (Browne says the former is true, but not the latter.)

I have trouble connecting with the thinkers of the Middle Ages. Their thinking seems to me to be frightened, so overcautious, so cramped and circumscribed, I can't read it without sadness for the way that medieval Christianity strangled the human spirit for so long. But in the early Renaissance there is a flowering of a joyfully brave willingness to try to understand the world, and to follow any inquiry, no matter how extravagant or ridiculous. The whole idea of God has transformed, changed from something constricting to something empowering. The world before belonged to God, and humans were in it only grudgingly and on promise of good behavior. But when the Renaissance started, the world became a beautiful gift, in which humans had been placed to honor God by admiring and marveling at his creation.

This admiration and marvel, the willingness to follow any path to understanding, is how I want to be about knowledge and how I hope I am. Reading Browne, I always feel like he and I would have gotten along well, and that that is one of the best parts of myself.

Boccaccio's Decameron

The story of the Decameron is this: It is 1348, and Florence is devastated by Black Plague. Nothing can be done, despair is everywhere, and there are not enough left living to bury the dead. So ten young people, still healthy, decide to turn their backs on suffering and quit town. They take provisions and servants, retire to the country, and try to forget the horrors they have seen. There they spend the time feasting, walking in the gardens, playing chess, and, once a day, for ten days, they meet, choose a theme, and then each of them tells a story on the theme.

I explained this once to a friend who said “That sounds cool, when was it written?” I said “In 1348!” It is one of the two great works of classical Italian literature, the other of course being Dante. Dante is solidly medieval, hierarchical, doctrinaire, and obsessed with a God who is supposedly loving but doesn't seem to know how to show it. That was in 1308 or so, and then, only a few decades later, we have the Decameron which could not be more different. It is about people, doing people things in the real world, eating, drinking, singing, arguing, and making love. God is present, but not oppressive. He has sent a terrible plague for who knows what reason, but rather than submit to it the characters of the Decameron try to take practical steps to make the best of it.

There is a story in the Decameron for every mood, usually more than one. Some are sad, some romantic, some funny and salacious. Dioneo is exempt from following the daily theme and usually has a story that is more or less dirty.

My favorite story is probably the one about the cross-dressing English princess, or perhaps the one about how young Caterina wanted to sleep on the balcony so that she could hear the nightingale, which I find very sweet. But the funniest one is about the abbess who is called out of her cell one night to berate a nun for having her lover stay over, and who doesn't realize that in her hurry she has put her own lover's trousers on her head instead of her wimple.

I have several different Decamerons, but this copy is the Cormac Ó Cuilleanáin translation, which has made several previous appearances here:

There's also an unpublished blog article inviting me to look into this passage:

Messer Lotto Gualandi gave him a daughter of his, Bartolomea by name, one of the fairest and handsomest young ladies of Pisa — although most of the females from that benighted town look like tarantulas.

The J.M. Rigg translation says “spotted lizards”. This is closer to the original Italian, which is lucertole verminare, literally small wormy lizards.

I have my doubts about the desirability of living to be a thousand years old, but if I do decide to do it, one reason will certainly be that I will need the time to learn Medieval Italian and translate the Decameron.

From Frege to Gödel, edited by van Heijenoort

This is a collection of the most important papers in mathematical logic from the time of Frege (who, I have written before, was responsible for kicking the field of logic out of its medieval period into the modern world) to Gödel (who spoiled everything).

In between these van Heijenoort hits all the most important ideas, starting with Frege's explanation of Begriffsschrift, which is wacky and weird and which didn't catch on except it kind of did and it still underlies half of mathematical logic and which is the prototype for many of the symbols we still use. After this there is Russell's tragic correspondence with Frege in which he pointed out, too late, that Frege's foundational theory didn't work.

The book reprints Peano's original description of the Peano numbers, perhaps the most successful single mathematical theory of all time.

The book includes Zermelo's proof of Zermelo's theorem that every set can be well-ordered, and Ackermann's discovery of Ackermann's function, which demonstrated the not every computable function is primitive recursive.

The book has Russell on type theory and early work by Kolmogorov and Brouwer on the origin of intuitionism. (Heyting is missing.)

Van Heijenoort has come up here when I wanted to quote from Schönfinkel's paper about the SKI-calculus, Wiener's paper inventing the ordered pair, and implicitly in probably a dozen other math and logic articles here over the years.

The book is on my shelf because I refer to it pretty often, but also because I can usually find something interesting just by thumbing through it. For example, these remarks by Thoralf Skolem about the futility of deriving induction from set-theoretic foundations.

Bonus trivia: Van Heijenoort was the personal secretary of Leon Trotsky, and while he was accompanying Trotsky during the latter's exile in Mexico, he was one of Frida Kahlo's lovers.

Orbis Sensualium Pictis (English edition), Johannes Comenius

I adore this book. My heart swells with love when I think of it.

I don't have a blog article about it and there is a story behind that. In 2018 I went to a conference in Cleveland and my hotel was in a building that had formerly been the Cleveland Department of Education. It contains two big murals, one depicting “The Progress of Education”:

I planned to write a blog article about these people. It's clear who some of them are. For example, Moses is easy to recognize at lower right, because of the glowing horns, and Confucius is next to him. Some people I was familiar with once they were identified for me: the red-haired guy second from right in the back row is Friedrich Fröbel, who I knew; his “gifts” are a forerunner of the Montessori materials.

But in doing the research I got to the bearded hat-wearing dude topmost on the right side and completely fell off the bus, because that is Johann Comenius who is famous because he wrote one of the most marvelous and enchanting books I've ever read, the Orbis Pictus.

I have to resist the temptation to say too much, because Orbis Pictus derailed the article about “The Progress of Education”, it then derailed its own article which has been in progress for eight years, and if I let it it will derail this article too, because every time I pick up Orbis Pictus I forget whatever I was doing and I am lost in the pages with a happy and innocent smile on my face.

I'm going to precommit to writing only one paragraph about this incredible book. It was the first illustrated children's book published in Europe, in 1658, and it was an immediate hit, being translated from German into English the following year, then into French, Italian, and many other languages. It swept the continent because everyone loved it.

Most of the book follows this pattern: there will be an engraved illustration, depicting some aspect of ordinary human activity, such as (I open it up to a random page) “Tame Foul” (that is, “fowl”):

Items of interest in the engraving are annotated with numbers, and the facing page explains the illustration, one item at a time:

The Cock 1 (which croweth in a morning), hath a comb, 2.

In a second column to the right of this is the same text, but in Latin, so that while the reader is learning about tame fowl, they are also learning Latin:

Gallus 1. (qui manè cantat) habet Cristam, 2.

The prose is limpid, gentle, pithy, and direct. It hits the important points of interest, invites questions, and ends before anyone can get bored. There are pages on anatomy, butchery, feasting, winemaking, various principal virtues, family trees, cities, burials, ships, wells, horology, amphibians.

Now I will reluctantly put it down, rather than leaving this article unfinished as I have so many before.

The Bible (New International Version, large print)

This of course is the cornerstone of Western culture and no well-educated person can be without a knowledge of what is in it. It is full of great wisdom and great stories, and also cruelty, evil lies, and reminders that the world now is in many ways better than it was because people are better.

I would like to understand the world I live in, and there is no way to understand 21st-century America without understanding the Bible.

The NIV is not the most poetical translation, but it is clear, modern, and accurate. (I got it on the recommendation of Sterling Hanenkampf. Thanks, Sterling!) In former times I had a collection of Bibles but this is the only one that remains. I even got rid of the old King James that belonged to my mother, since office space is precious and I have had a digital copy on my computer since the early 1990s.

I find that most of my articles mentioning the Bible are unpublished for some reason. It comes up a bit in connection with Ploni Almoni, and in passing in many other places.

One of the unfinished articles is a series of notes on the theme of Jesus's admonition “Do not put the Lord your God to the test” (Matthew 4:7) and its relationship to a lot of other things like lightning rods, Christian Science (not Christian science), how Larry Wall became a computer programmer, Pikuach nefesh, and the story of the old lady who refused to evacuate from her house during a flood. It'll be epic if I ever finish it, but I probably won't.

Another incomplete one is about the incredible story of Samson and Delilah:

She asks him flat out:

[Judges 16:6] Tell me the secret of your great strength, and how you can be tied up and subdued.

Instead of just telling her to fuck off, Samson lies:

[16:7] If anyone ties me with seven fresh bowstrings that have not been dried, I'll become as weak as any other man.

The Philistines bring her bowstrings and she tries it that night, but Samson snaps the bowstrings as easily as a piece of string snaps when it comes close to a flame. …

Then it goes as before! He tells her a different lie, knowing full well that she will betray him, and she does betray him, and he makes a fool of her again! (16:11–12)

Okay, that was fun. Let's do it again! (16:13–14)

After several repetitions of this, Samson decides that being shaved, blinded and crushed will be less exasperating than listening to any more of Delilah's nagging.

I read once that the whole point of the book of Judges is that the people in it are all terrible, they are all far from the path of righteousness, and so you definitely shouldn't act like them. I don't know if that interpretation is correct, but it is certainly true that the people in it are all terrible.

The Belles Heures of Duc de Berry

This book turned up in one of my very first blog articles, on abbreviations in medieval manuscripts, although I didn't know it at the time. In my teens, on a visit to the Metropolitan Museum of Art, I picked up a print of this:

Then I carried it with me for the next forty years, eventually framing it and hanging it up, and it is hanging in my house now.

Many years after, when I was still on Twitter and Twitter was still fun, I subscribed to a daily feed from the Met, and one day they tweeted this page, or perhaps another page from the same book, stylistically similar enough that I recognized it immediately. They said where it was from: it's the Belles Heures, a “book of hours”, which tells the reader when to pray and how, and which days are sacred to which saints. Very wealthy people had super-fancy ones made from the very best materials, with illustrations by the very best craftsmen.

The Duc de Berry was so wealthy that he had more than one, as I found out when I accidentally ordered and received the Tres Riches Heures. But I got the one I wanted eventually.

The Duc de Berry book is by Millard Meiss and Elizabeth H. Beatson, and alternates beween the magnificent color plates and prose discussing each one. From the inscription on the page above I had been able to figure out that this was John the Baptist (see previous article), and the authors aren't sure who the other two people are, but they did at least tell me that John was the Duc de Berry's name-saint. (Funny how John keeps popping up, isn't it?)

More recently I had another very similar Internet revelation. I've had this framed postcard hanging up for many years:

and thanks to a recent Mastodon toot by Cam Larios, I found out that it is from the “Black Hours” of the Morgan Library.

#8?

The banishment of the very large Roget 8th edition has left enough space on the shelf for an eighth book. I took a quick look around my office to see if there was anything else that wanted to fill that space, but nothing volunteered.

(Actually I think Tristan Needham's Visual Complex Analysis might be waving to me from across the room.)

Other stuff

There are other things in the photo that should not be on this shelf and I don't know why they are:

  • A packet of googly eye stickers
  • Glass and ceramic coasters that I don't use because my coffee cup is always on my electric mug warmer
  • A small audio speaker that might or might not work
  • A boxful of 8mm-helical scan backup tape from the 1990s
  • A pair of old laptop 2.5-inch hard disks that I hope to someday get the data out of
  • A set of Korean playing cards

The shelf is like my brain, I guess, full of stuff, and and what's in it doesn't always make sense or go together with the other stuff.

This article was prepared by GNU Emacs, Rael Dornfest's “Blosxom” software, GNU grep, and the Kubuntu desktop environment, with minor assistance from me. Spelling correction was provided by ispell. The four em-dashes were organically cultivated and sustainably harvested.

The Daily Front Page 19 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Tablets Before Alexandria
article

The Library of Ashurbanipal (2025)

by samizdis·▲ 71 points·15 comments·historytoday.com ↗
Before the Library of Alexandria there was the Library of Ashurbanipal

When it was discovered in the 19th century, the Library of Ashurbanipal revealed an ancient Assyrian empire previously known only through myth.

Stone stela of Ashurbanipal inscribed with cuneiform commemorating his building work on the Temple of Marduk in Babylon. Trustees of the British Museum.

Before the Library of Alexandria there was the Library of Ashurbanipal – an Assyrian king who collected the knowledge of ancient Mesopotamia under one roof. This incredible library was forgotten for millennia, and remains largely unknown even today. Yet it contained an abundance of texts that were influential across the ancient world, and bequeathed a debt to modernity that is rarely acknowledged.

Ashurbanipal assembled his library at Nineveh in the seventh century BC. Today known as Mosul in Iraq, Nineveh was then the most splendid – and largest – city on Earth, and the seat of the Neo-Assyrian empire that spanned from Turkey in the west to Iran in the east. Although it is the Persians who are usually credited with constructing the first world empire, they built on foundations laid by the Assyrians, taking over their system of provinces, network of roads, and imperial ideology.

Ashurbanipal, the empire’s penultimate king, ruled from 669 to 631 BC. He expanded the empire to its greatest extent by waging campaigns in all four directions. But although he portrayed himself as a formidable military leader, he had been trained as a scholar and, as the youngest son of his father Esarhaddon, was probably never meant to be king. As Ashurbanipal tells us in his ‘biography’ – one of his inscriptions that talks about his preparation for kingship and ascension to the throne – he was educated to the same level as his advisers, and could hold his own in a debate with them:

I learned the craft of the sage Adapa, the secret [and] hidden lore of all the scribal arts. I am able to recognise celestial and terrestrial omens … I can resolve complex [mathematical] divisions [and] multiplications ... I have read cunningly written texts in obscure Sumerian [and] Akkadian that are difficult to interpret. I have carefully examined inscriptions on stone from before the Deluge that are sealed, stopped up, [and] confused.

Ashurbanipal laid claim to knowledge as well as territory. He collected tablets recording ancient traditions stretching back more than a thousand years, as well as keeping the library up to date with the latest research, on topics spanning everything from religion and literature to magic and medicine. As such the library is a window not only into ancient Assyria but also the even more remote past.

Ashurbanipal killing a lion. Relief from the North Palace, Nineveh. Trustees of the British Museum.

Ashurbanipal killing a lion. Relief from the North Palace, Nineveh. Trustees of the British Museum.

Unlike the Library of Alexandria, Ashurbanipal’s library is not lost to history but sits on storage shelves at the British Museum. The ancient Mesopotamians wrote on clay tablets, a durable material that does not decay in the ground, nor is destroyed by fire. When Ashurbanipal’s library burned down in 612 BC, during the sacking of Nineveh by the Babylonians, the conflagration baked the tablets like a giant kiln, hardening the clay and thus preserving them. Consequently, 33,000 of its tablets have survived – so many that academics are still dealing with the backlog, deciphering tablets that were first discovered more than 150 years ago. Other tablets have turned up from all over Mesopotamia, and it is estimated that the number of written sources from the region stands at half a million. And all the while, new discoveries are continually being made as excavations resume in Iraq. There are simply too few historians trained to read them to be able to cope with the supply.

Cuneiform culture

Ancient Mesopotamia covered the area of modern-day Iraq. Mesopotamia is Greek, meaning ‘between the rivers’, referring to the Tigris and Euphrates. Many different peoples are known to have lived here over the centuries, beginning with the Sumerians (approximately 3500-2000 BC), followed by the Akkadians, the Assyrians, and the Babylonians. The region was a melting pot of different peoples but nevertheless was loosely held together by a shared literary and religious tradition, expressed, first and foremost, in the use of cuneiform writing.

Cuneiform is a wedge-shaped script impressed into clay that started out pictographic, but developed to spell syllables. Because of this it could be used to write any language of the Near East – primarily the core Mesopotamian languages of Akkadian (an umbrella term for both the Assyrian and Babylonian dialects) and the more ancient language of Sumerian, but it was also adapted to write Hittite in Turkey, Ugaritic in Syria, Elamite in Iran, Urartian, and Old Persian.

The sources for Mesopotamian cuneiform culture span from c.3400 BC to c.AD 80, meaning that more than half of human history in this region is written in the script. It is a period so vast that those who study it specialise not by decade or century but by millennium. Assyria fell in 612 BC and was absorbed into the Babylonian empire, which ruled for another 73 years, but even after Babylon fell to the Persians in 539 BC, cuneiform culture endured. Under foreign rulers, from the Persians to the Greeks and even the Parthians, priests of the Babylonian gods continued writing calculations in Akkadian and singing to their gods in Sumerian.

Though famed in antiquity for its wealth and sophistication, and remembered in the Bible as the home of Abraham, the Tower of Babel, and the Whore of Babylon, for millennia Mesopotamia remained as distant as myth. All that was known came from garbled references by classical authors such as Herodotus, who wrote of Babylon’s hundred gates (it had eight), and from polemical Biblical writers, such as the authors of the Book of Kings who delighted in Sennacherib’s failure to conquer Jerusalem.

The story of the Flood, from the Epic of Gilgamesh, Neo-Assyrian, Nineveh. Trustees of the British Museum.

The story of the Flood, from the Epic of Gilgamesh, Neo-Assyrian, Nineveh. Trustees of the British Museum.

Then, after 2,000 years of silence, Mesopotamia emerged again in the 19th century. Sensational archaeological discoveries in the Middle East uncovered the cities of Assyrian kings such as Khorsabad in 1843 and Nineveh itself in 1847, with magnificent palaces and extraordinary sculptures and reliefs – which were taken to the British Museum in London and the Louvre in Paris. Babylon itself was excavated by German archaeologists from 1899 and its dazzling Ishtar gate of blue-glazed bricks reconstructed in the Pergamon Museum in Berlin. For the first time, readers of the Bible could look upon the faces of the conquerors who appeared in its pages, such as Shalmaneser III and Sennacherib, the Assyrian ruler who preceded Ashurbanipal’s father.

Even more exciting were the written sources. Bricks inscribed with cuneiform had been transported to Europe as early as 1625, and trilingual inscriptions from Achaemenid Persepolis were published in the late 18th century, but the tablets from Ashurbanipal’s library were the first known bulk collection of cuneiform documents. The decipherment of cuneiform in 1857 allowed access to the conquest of Judah from Sennacherib’s perspective, Nebuchadnezzar boasting in his own words, and a Babylonian flood story strikingly similar to the one in Genesis. George Smith, a self-taught scholar who identified the latter at the British Museum, was so excited when he read the description of a ship resting on a hilltop and sending out a dove to look for dry land that it was reported:

He said, ‘I am the first man to read that after more than two thousand years of oblivion.’ Setting the tablet on the table, he jumped up and rushed about the room in a great state of excitement, and, to the astonishment of those present, began to undress himself!

This story was recorded by E.A. Wallis Budge, a curator who had a longstanding dislike for Smith. Most likely intended to mock him, it had the opposite effect, capturing the exhilaration of those early days of discovery. Later identified as the Epic of Gilgamesh, the Babylonian account of the deluge caused such a stir that, in 1873, the Daily Telegraph funded an expedition to search for the missing parts of the tablet, which had broken into pieces as the library burned in 612 BC. It was like looking for a needle in a haystack – small pieces of clay in a site containing thousands – but, extraordinarily, another version of the story was later found by excavators in Nineveh.

The chamber of records

The library emerged in stages, its tablets found in several places through a series of different excavations. Since Iraq was under Ottoman rule, the site was known as Kuyunjik, a Turkish word meaning ‘little sheep’, implying that it was then used as a place for grazing. But this great mound of earth in the suburbs of Mosul covered the ancient citadel of Nineveh. French and British expeditions began digging at Kuyunjik in 1842, but, after failing to find anything, the French abandoned the site in favour of other Assyrian cities, such as Khorsabad, the new capital founded by Sargon and quickly abandoned.

The first major discovery at Nineveh was of what Sennacherib had himself called his ‘Palace without Rival’, found by the British archaeologist Austen Henry Layard and his local assistant Hormuzd Rassam, working for the British Museum, between 1847 and 1851. In 1850 they made a sensational find: while tunnelling, the excavators reached a room filled with cuneiform tablets, which Layard named ‘the chamber of records’:

The first doorway, guarded by the fish-gods, led into two small chambers opening into each other, and once panelled with bas-reliefs, the greater part of which had been destroyed. On a few fragments, still standing against the walls, could be traced a city on the shore of a sea whose waters were covered with galleys. I shall call these chambers ‘the chambers of records’, for … they appear to have contained the decrees of the Assyrian kings as well as the archives of the empire ... The cuneiform characters on most of them were singularly sharp and well defined, but so minute in some instances as to be almost illegible without magnifying glass.

Henry Rawlinson copying the Behistun inscription. Illustration for Arthur Mee’s Story Book, artist unknown, c.1920. Mary Evans Picture Library.

Henry Rawlinson copying the Behistun inscription. Illustration for Arthur Mee’s Story Book, artist unknown, c.1920. Mary Evans Picture Library.

Spurred on by this discovery the British Museum continued its work at the site.

The next expedition was led, from 1851, by the diplomat Henry Rawlinson, who had a keen interest in the language of the tablets and would go on to play a key role in deciphering cuneiform. The Ottomans divided the rights to excavate the site between the British and the French (who had now returned); the French were given the north side, the British the south. It was the local assistant Rassam who made the breakthrough. Frustrated that the French were not exploiting their right to dig on the north side of the mound, he decided to take matters into his own hands and excavate secretly, at night. His instincts proved correct and in 1853 he discovered Ashurbanipal’s North Palace, and many more cuneiform tablets. The contents of the library had been dispersed throughout the site: when the city was sacked by the Babylonians in 612 BC they had rifled through the tablets and dumped them in different locations – the ‘chamber of records’ turned out to be a bathroom next to the throne room. The library’s original location is not known. We can identify which tablets were part of the collection as they are all inscribed at the end with a label declaring them to be Ashurbanipal’s property, the simplest of which state: ‘Palace of Ashurbanipal, king of the world, king of Assyria’.

The French later conceded their rights to the British in return for some reliefs from the palace, and so Ashurbanipal’s library is now housed in the British Museum.

Reading the script

Cuneiform was used to record many languages. The tablets of the library are written in Akkadian and Sumerian. However, after the Persians conquered Babylon, King Darius ordered his scholars to invent a new script based on cuneiform to write Old Persian, as a way of appropriating the prestige that came with this ancient tradition. By borrowing the Babylonian writing system for his own language, he sought to put himself on the same level as the great kings of old.

It is thanks to Darius that cuneiform was ultimately deciphered in the 19th century. Darius commissioned monumental inscriptions narrating his deeds and listing the peoples he had conquered. The most famous of these is the Behistun inscription, carved into the cliffside a hundred metres above the ground alongside a royal road, visible to travellers from far away, and accompanied by a relief showing rulers of all the rebel lands submitting to the Persian king. Many other inscriptions were found in Darius’ capital city of Persepolis and the surrounding area. Like the Rosetta Stone which enabled the decipherment of Egyptian hieroglyphs, these inscriptions displayed the same text written in three different languages. But the Rosetta Stone had ancient Greek as one of its three, a language that was already known and so able to unlock the others. All three of the languages in the Persian inscriptions were a complete mystery: Old Persian, Elamite, and Akkadian.

‘Hall in Assyrian Palace, restored’, from The Monuments of Nineveh. New York Public Library. Public Domain.

‘Hall in Assyrian Palace, restored’, from The Monuments of Nineveh. New York Public Library. Public Domain.

Their decipherment took more than 50 years, starting long before the discovery of the library, and was the achievement of many talented scholars. As with the decipherment of hieroglyphs in 1822, the first element to yield was the name of the king. It was a German schoolteacher, Georg Grotefend, who made this first step in Göttingen in 1802, after making a drunken bet that he could decipher cuneiform. Working with inscriptions from Persepolis, Grotefend guessed, based on later inscriptions of Sassanian kings and the kinds of repetitions that he saw in the texts, that the royal inscriptions would start with a list of the king’s titles and so was able to identify the name of Darius. Then, in 1835, Henry Rawlinson visited the Behistun inscription while he was in Iran with the British army and made 3D copies (a ‘squeeze’) of the text using a sort of papier-mâché, an immensely difficult undertaking on a cliff-face inscription. One of the languages (Old Persian) turned out to be related to modern Persian, in which Rawlinson was fluent, and in 1846 he published an edition and translation of the inscription.

In 1846 an Irish cleric called Edward Hincks worked out that Akkadian was a Semitic language related to Hebrew, which could be used for comparison. By this time many more sources had been discovered and Hincks did not have to rely solely on studying trilingual Persian inscriptions. He could also consult inscriptions of Nebuchadnezzar from Babylon, a growing number of cuneiform tablets, and more inscriptions from Lake Van in Turkey, which used the same script to write another language in the independent state of Urartu. Hincks worked out the peculiar way that these languages spell out their syllables – the syllable bab, for example, would be split across two signs and spelled ‘ba-ab’ – as well as realising that one sign could have many different meanings and that one sound could be represented by many different signs. Perhaps most significantly, he proposed that some of the signs might represent sounds from another language. It turned out that texts spelled out in Akkadian still included whole words in Sumerian. This crucial observation was made in a footnote in Hincks’ ‘On the Khorsabad Inscriptions’ (1849), but it would prove to be one of the most important keys to cracking the script.

By 1852 tablets from Ashurbanipal’s library had reached the British Museum. Among them Hincks recognised texts that listed the different sounds and words represented by various cuneiform signs. These same texts had been used by ancient scribes learning cuneiform and now helped Victorian scholars to learn it 3,000 years later. Many bilingual texts – Sumerian compositions with Akkadian translations underneath each line – were also brought to London, enabling the study of Sumerian.

Display of tablets from Ashurbanipal’s library in the British Museum, 2018. Trustees of the British Museum.

Display of tablets from Ashurbanipal’s library in the British Museum, 2018. Trustees of the British Museum.

Rawlinson and others continued to work on Akkadian. The results were published in scholarly journals, sometimes leading to collaboration and discoveries, and sometimes laying bare fierce rivalries and competing theories. Rawlinson, for example, was initially convinced that cuneiform represented letters rather than syllables, and that it originated in Egypt. When he changed his mind and started reading the signs as syllables, he claimed not to remember how he had come to these conclusions, but seems to have plagiarised Hincks, as he also copied some of his mistakes. Regardless, by 1857 enough progress had been made to propose a test. Four scholars would each make a translation of a new Akkadian inscription and send the results in a sealed envelope to the Royal Asiatic Society in London. Rawlinson, Hincks, and two others, William Fox Talbot and Jules Oppert, took part – their translations more or less agreed, and cuneiform was declared deciphered.

This was only the beginning. Understanding Akkadian and Sumerian in all their subtleties would take far longer. The Akkadian perfect tense was only discovered as recently as the 1930s, and the nuances of Sumerian grammar continue to be debated. Nor are all Mesopotamian scripts fully deciphered – proto-Elamite, a type of cuneiform that is contemporary with early Sumerian, is still only partially understood, and a handful of scholars are currently working on its decipherment in the UK, Canada, Italy, and Iran.

Entering the library

Once the contents of the library could be read, an entirely new era of history opened up. Ashurbanipal’s collection provided accounts of his military campaigns and insights into the workings of government. We can read about his total destruction of the kingdom of Elam in Western Iran in 646 BC and his bitter war against his brother Shamash-shum-ukin, king of Babylon, not only in his official accounts but also in letters preserved in the archives that show him corresponding directly with foreign kings: ‘I swear by Ashur and my gods that under the aegis of the gods I will make the future even more horrible than the past for you.’ Letters from his advisers show us how the library was put to use for the business of ruling an empire: key decisions such as appointing officials and going to war were made by sacrificing sheep and consulting the entrails, the night skies were scoured for messages from the gods that might indicate suitable courses of action, and a whole host of rituals was developed to keep the king in divine favour. The library’s academic wisdom was esoteric but also highly practical, and, remarkably, we have both the texts themselves and a wealth of sources written by the scholars who used them, enabling us to see Assyria through Assyrian eyes. Almost every aspect of the culture is here: hymns and prayers that show us how they worshipped their gods, medical manuals treating a wide range of diseases, and magical texts written by exorcists. Literary classics were treasured in both Akkadian and Sumerian – most famously Gilgamesh and the Babylonian story of the flood, but also tales of Sumerian gods and kings written more than a thousand years earlier. Indeed, the opening lines to Gilgamesh almost seem to describe the later king in whose library its text was preserved:

He knew the totality of wisdom about everything.
He saw the secret and uncovered the hidden,
he brought back a message from the antediluvian age.

The Daily Front Page 20 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — The Binface Vote
article

Count Binface receives over a quarter of votes in Clacton by-election

by tcp_handshaker·▲ 436 points·345 comments·bbc.com ↗
the self-styled intergalactic space warrior

Getty Images A man with a bin on his head poses triumphantly outside a giant glass window. The bin is silver with a slit cut out for his eyes and a square hold for his mouth. He also wears black gloves, a black breastplate, knee and elbow guards, and a long silver cape.

Getty Images

Count Binface is standing against Nigel Farage in the Clacton by-election

Count Binface, the self-styled intergalactic space warrior, has received nearly 10,000 votes in the Clacton by-election, his best performance yet.

The much-photographed election veteran was the main rival to Reform UK leader Nigel Farage in an election race caused by Farage resigning, only to run again - which sparked a mass boycott by the other main UK parties.

Farage has re-won his seat, receiving more than 22,000 votes in Clacton, on the Essex coast.

Binface received 26.9% of the vote while Farage won 63.3%. Binface had his highest share yet with 9,455 votes, having lost to no fewer than three prime ministers, and one who later became prime minister, in previous attempts.

But how many votes has he previously received? And where does he fit into the British tradition of spoofing politicians?

2017: May the force be with you

Getty Images A row of candidates can be seen on stage at the election count. Theresa May is on the far left of at least nine candidates on stage. She wears a bright red skirt suit and matching high heels, with her grey hair in a neat bob. She has her hands clasped on front of her and is smiling wryly. Lord Buckethead is on the far left of the row of candidates and is doing a dab. He wears a large black bucket on his head, with black armour and a black cape with a sliver lining.

Getty Images

Theresa May (far left) keeps her distance from Lord Buckethead at her election count

The man inside the bin is the comedian Jon Harvey, an Oxford graduate who has specialised in satire, writing scripts for BBC comedy shows The Thick of It and Have I Got News For You.

He first donned a bin on his head to stand for election in 2017, when he challenged the then Prime Minister Theresa May in her Maidenhead constituency, although back then he was known as Lord Buckethead, a character inspired by a Star Wars parody film.

He won 249 votes and viral fame, leading to an appearance on John Oliver's HBO show Last Week Tonight - as well as a legal dispute with another Lord Buckethead he described at the time as "an unpleasant battle on the planet Copyright".

2019: The bin takes on Boris Johnson

Getty Images Boris Johnson is in the centre of the photo, wearing a black suit with a pale blue shirt and a red spotted tie. Behind him to the right is Count Binface, wearing a large silver bin on his head and a silver cape. On his right is a man dressed as the fuzzy red Sesame Street character Elmo.

Getty Images

Binface gets in the picture as Boris Johnson is re-elected as MP for Uxbridge

Harvey found himself a different bin to cover his head and switched characters to Count Binface to take on the next Conservative leader, Boris Johnson, announcing himself as the leader of the Recyclons from planet Sigma IX.

He only won 69 votes, but was again able to take his place on stage as the election result was declared alongside a sitting prime minister, who was also flanked by a candidate dressed as the Sesame Street character Elmo, at his Uxbridge election count.

2024: Sunak takes out the trash

Getty Images Rishi Sunak is standing on stage in front of a bright purple backdrop with the slogan visit North Yorkshire. He is on the left of the photograph, giving a speech at a podium, with other candidates lined up to his right. Count Binface is standing on the right of the stage in his costume.

Getty Images

Binface had competition from a Monster Raving Loony ventriloquist at Rishi Sunak's count

A third Conservative leader, Rishi Sunak, was in Count Binface's sights in the 2024 general election campaign.

He got 308 votes, which at the time was his best result.

The Monster Raving Loony Party's candidate, Sir Archibald Stanton, received 99 votes - 0.2% of the vote share.

2026: Burnham courts the Count

Getty Images Burnham is in the centre of the photograph, wearing a black suit over a black t-shirt, and shaking hands with Count Binface on his left. To his right is a man dressed as a fox, holding a placard reading Protect British Wildlife.

Getty Images

Newly-elected MP for Makerfield Andy Burnham shakes hands with the Count

In June this year, it was Andy Burnham's turn to face Binface in the by-election that paved the way for the then Greater Manchester Mayor to become prime minister.

Rather than studiously ignoring the intergalactic warlord, as some may have been tempted to do, Burnham shook him warmly by the hand as he was elected Labour MP for Makerfield.

Binface bagged just 95 votes to Burnham's 24,927.

2026: The Bin's best result yet

While Nigel Farage won the Clacton by-election on Friday morning, Count Binface came second.

The Reform UK leader got 22,239 while Count Binface received 9,455. The intergalactic space warrior celebrated the number with his usual two peace sign fingers.

Speaking to BBC Breakfast after, Binface said: "I promised to be a local champion for Clacton and I thought to hear the verdict of the Clactonites was the least I could do."

A great British tradition?

The UK has a rich history of novelty candidates standing in elections, with Monster Raving Loony Party founder Screaming Lord Sutch - a rock musician who fought more than 40 elections in his trademark top hat and gold lame suit - first standing in a by-election in the 1960s. A different Lord Buckethead stood in 1987 and 1992, while comedian Al Murray's pub landlord stood against Farage in 2015.

Objections to such "frivolous" candidates date back even further - to 1918, when a £150 deposit was introduced for candidates. That was later upped to £500, in 1985, in large part due to the popularity of the Monster Raving Loony Party.

BBC/ Willie Smith Screaming Lord Sutch of the Monster Raving Loony Party, at their 1990 party conference. He wears a leapoard skin suit with a matching leopardskin top hat and is sitting astride an orange spacehopper. He is wearing several giant yellow and black rosettes and carries a golden loudhailer, all with the slogan Vote Lord Sutch. He is surrounded by a group of supporters also riding spacehoppers in a car park.

BBC/ Willie Smith

Screaming Lord Sutch was co-founder of the Monster Raving Loony Party in 1982

But the bar for entry remains fairly low: anyone over the age of 18 who can scrape together a £500 deposit and get support from 10 people in the form of signatures is allowed to stand as a candidate in UK elections.

That's why Count Binface has been able to stand in so many high-profile elections. He has, however, lost his £500 every time, after failing to meet the minimum 5% of votes cast in order for his deposit to be returned.

Yet Binface has had his moment in the spotlight each time.

That is because another British tradition means all election candidates must stand side-by-side on a stage at the election count to hear how many votes they have each received - it's a literal leveller, where everyone from prime minsters to a bloke dressed as a bin has the right to be seen and heard as an official candidate.

But all of these no-hope novelty candidates share a few serious aims: to poke fun at power, prick the pomposity of political elites, and allow people a protest vote.

The Daily Front Page 21 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Systems & Infrastructure Briefs
article

Firefox is now the last major browser that still supports uBlock Origin

by DemiGuru·▲ 600 points·219 comments·pcworld.com ↗

Firefox says it will keep supporting uBlock Origin even as Microsoft Edge and other Chromium browsers phase it out under Manifest V3.

Firefox Mozilla

Credit: Mozilla

Firefox recently announced via Bluesky post: “Our support for uBlock Origin isn’t going anywhere.” The moment comes in response to news that Microsoft Edge is soon going to lock out uBlock Origin and other ad-blocking extensions that run on Manifest V2 architecture.

Our support for uBlock Origin isn't going anywhere.

Firefox (@firefox.com) 2026-08-10T20:21:48.446Z

Once Microsoft Edge moves to Manifest V3, ad-blocking extensions won’t have access to the functions needed to properly identify and block ads that occur while browsing websites and watching videos.

Microsoft’s move isn’t surprising, as Edge is based on Chromium, the open-source browser engine that powers most web browsers today, including Opera, Brave, Vivaldi, and Samsung Browser. Google initiated the migration from Manifest V2 to V3 in Chrome/Chromium, and Microsoft Edge is now following Google’s lead.

This is officially Firefox's killer app. I will never go back to Chrome so long as uBlock Origin is supported on Firefox.

(@hispanicat7hedisco.bsky.social) 2026-08-11T13:30:56.181Z

But Firefox is one of the few web browsers remaining that isn’t based on Chromium, and it’s now the only major browser to still support uBlock Origin. Neither Safari nor DuckDuckGo—the two other major non-Chromium browsers out there—support uBlock Origin.

For die-hard uBlock Origin fans, Firefox appears to be the only browser left without compromises. With any other browser, you’ll need to settle for uBlock Origin Lite (with fewer features and less ad-blocking success) or whatever built-in ad-blocking feature comes with the browser.

This article originally appeared on our sister publication PC för Alla and was translated and localized from Swedish.

The Daily Front Page 22 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Systems & Infrastructure Briefs
article

In Australia, a home battery boom has helped cut wholesale power prices

by speckx·▲ 328 points·278 comments·e360.yale.edu ↗

NSW Climate and Energy Action

A little more than one year ago, Australia rolled out a program to heavily subsidize home batteries, part of a larger effort to make use of the huge volumes of solar energy that were going to waste. On Friday, officials announced that more than 500,000 batteries had been installed under the plan, helping to slash wholesale power prices roughly in half.

Energy Minister Chris Bowen said that Australia now has more home batteries than the United States, which has a population 12 times larger. “This is a story of global significance that Australian households have achieved,” Bowen said in a press conference.

Australia is the world leader in rooftop solar, with panels installed on more than one in three households, the highest rate of adoption globally. But abundant solar power has created a new dilemma as the grid faces a surge of electricity from connected rooftop arrays. Power prices plunge. Centralized power plants are forced offline, threatening grid stability. And much of that solar power goes to waste.

The government has moved to make use of this surplus solar energy, including by offering free power in the early afternoon to homeowners in Queensland, New South Wales, and South Australia, regardless of whether they have solar panels on their roof or not. The goal is to spur more consumers to run appliances or charge electric vehicles during this window.

With its home battery subsidy program, launched in July 2025, the government is aiming to help households use more solar energy by providing a 30 percent discount on residential battery systems connected to solar arrays.

The subsidy program has spurred a boom in installations. Australia is on track to more than double its home battery capacity this year, Bloomberg reports. The program has also been a boon to the grid. By relying on batteries in the early evening, when demand peaks, homeowners are reducing the need for utilities to fire up additional power plants during those hours, which is helping to lower costs for other ratepayers, officials say.

The subsidy program has been “the major factor in the wholesale price of energy falling in Australia by 47 percent in the last 12 months,” Bowen said. “Australia is one of the very, very few countries in the world which is reducing wholesale prices in the midst of a global energy crisis.”

The Daily Front Page 23 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Systems & Infrastructure Briefs
article

RustDesk now supports true unattended remote access on Wayland

by rustdesk·▲ 245 points·105 comments·rustdesk.com ↗

RustDesk now provides true unattended remote access on Wayland, including multi-monitor setups. Try the preview build for x86_64 Debian/Ubuntu-based systems.

Unattended Remote Access on Wayland with RustDesk

Wayland support has been one of the harder parts of Linux remote desktop.

RustDesk can now provide true unattended access on Wayland, without requiring someone at the remote machine to approve every session. Multi-monitor setups are supported as well.

After the initial setup, you can connect even when no one is at the remote machine — including from the login screen after a reboot.

Watch the demo video on X

For now, we are releasing this as a separate preview build for x86_64 Debian/Ubuntu-based systems:

Download the Wayland unattended access build

Wayland support is still limited in several major remote desktop products. AnyDesk currently requires Xorg for incoming Linux sessions, while TeamViewer still describes Wayland support as experimental for common desktop environments.

We would like to get more real-world testing before making this the default.

Once the implementation is stable, we plan to bring unattended Wayland access to more Linux distributions, including Fedora and Arch Linux, and eventually include it in the standard RustDesk releases.

If you use Wayland, especially with multiple monitors, please give the preview build a try and let us know what works—and what doesn’t.

The Daily Front Page 24 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Systems & Infrastructure Briefs
article

Differential Heuristics

by ibobev·▲ 122 points·8 comments·redblobgames.com ↗

In 2005 Google showed off Google Maps, which lets you drag the map around instead of reloading the page like MapQuest and others used. That’s the feature that got everyone’s attention. But what got my attention was a feature they added in 2007 where you could drag the start/end points on a route[1], and it would recalculate the shortest path as you dragged. That means they had fast A* pathfinding[2] on the entire world, which had millions of roads. How did they do it?

I had already studied A* and the common optimizations, but Google Maps was using optimizations I hadn’t learned about. I started reading papers. My reaction to almost all of them was “this complexity isn’t worth it unless your map is very large”. There was one technique however that was relatively simple, and I wanted to explore it further.

A better heuristic reduces how much of the map A* explores

In 2014 I wrote my interactive guide to A* pathfinding. I made a list of additional topics I wanted to cover, including graphs, heuristics, optimizations, data structures, and so on. One of these topics was the optimization I had learned about in 2007: differential heuristics (although it didn’t get that name until later).

I tried writing a tutorial about it in 2015 but I couldn’t find an explanation I liked. I tried again in 2016, 2018, 2019, 2022, 2024. I finally realized that I needed to stop trying to write a tutorial. Although I understood the algorithm, I didn’t understand it well enough to teach it.

I needed to understand it better. So I switched to learning and experimentation mode. I learned a lot. I went through some ups and downs. I learned that there’s still more to learn. Along the way I found an explanation I was happier with, and I rewrote the page again.

  1. I had previously shown the heuristic as lots of numbers. I switched to using two arrows. One is the direction the heuristic suggests and one is the correct direction. When they are in alignment, the heuristic makes A* run faster.

    Arrows showing heuristic mismatches

  2. I added visualizations showing the regions in which the optimization was effective, combined with an interactive diagram where I can move the points around to see how those regions change.

    Visualizing the improved areas

Here’s my new page about Differential Heuristics. I started over ten years ago so there are remnants of old text and code still there. I think there’s still plenty of room for improvement, but this is the first version I’m considering “released”.

Links

  1. [1]: https://www.searchenginejournal.com/new-google-maps-drag-and-drop-feature/5243/
  2. [2]: https://en.wikipedia.org/wiki/A\*\_search\_algorithm
The Daily Front Page 25 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Living With the Feed
article

Hello, me. It's been a while

by somesoftdev·▲ 363 points·196 comments·themech.net ↗

Wow. It’s been over fourteen years since the last time I wrote a post on this blog. In those fourteen years, the world has changed, and so have I. So this isn’t going to be a technical post, it’s going to be personal.

One of those subtle changes that quietly crept into my life over the years was filling the silence. As responsibilities piled up, free time became scarce. Almost without realizing it, I started filling every quiet moment with podcasts, audiobooks, or social media. Whether I was at the gym, cooking, or cleaning, there was often something playing in my headphones. Eventually, I built a habit: whenever it was quiet, my immediate instinct was to turn something on.

That’s one of the biggest differences between what my days look like now and what they looked like a decade ago. I used to talk to myself a lot more.

I’m a slow thinker, like really slow. It takes a few minutes just to get my thoughts moving in a direction. But once they pick up momentum, I can easily spend fifteen or thirty minutes exploring an idea, weighing different options and I genuinely enjoy it. My thoughts might not be as grand or groundbreaking as all those experts online, but it’s my voice. Nobody else has access to it. And it’s an important part of my life.

In my day job, I do mental work, and during conversations with others, I focus on listening or sharing what I already know, experienced or thought through. Neither of those gives me the space for slow, unhurried thinking. So my routine became a loop of focus and meetings, leaving me with zero time to actually hear myself.

Recently, as I reached for the play button out of habit, I stopped. I thought: what if I just do this chore in silence today?

At first, it felt uncomfortable. But after a moment, my thoughts started to flow. And it felt so much better than drowning them out with another podcast. I missed that voice. And I’m glad it’s still there.

If you’re someone who somehow lost their inner voice along the way (maybe without even realizing it) give yourself a shot. Don’t play anything in the background, don’t turn on your favorite show. Just sit in silence for a moment and see what happens. You might actually like it.

The Daily Front Page 26 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Living With the Feed
article

I turned my RSS feeds into an e-ink newspaper to stop reading on my phone

by speckx·▲ 165 points·65 comments·heyjonny.dev ↗

I really like personal blogs. I read them for entertainment, learning, and to keep myself updated on the latest trends in software engineering. I prefer to read them in a horizontal position, like on a couch or a deckchair outside in the sun. That explains why I almost never read them on my computer and always on my phone. I don’t necessarily enjoy that, though, since it makes my eyes tired.

This never bothered me enough to actively do something about it. But when I came across a pocket-sized e-reader called the X4 by Xteink, I got an idea. At only 4.3 inches, the X4 fits nicely in the palm of your hand. It also has no touchscreen and no backlight, and doesn’t ship with a preinstalled bookstore. While most people probably think of this as inconvenient or old-fashioned, a small community has gathered around this device. They even created an open source firmware for it called Crosspoint.1

At this point I already fell in love with the whole idea and ordered myself one. It took some time to ship it from China to Germany, and I worried the package might get stuck in customs. Luckily it didn’t. Once I got it, I wanted to try the stock firmware first, but it left so little impression that I can barely remember what it looked like. Within a few seconds I disliked it and wanted to install Crosspoint. To my greatest surprise, I had it installed after just three clicks. I then bought a DRM-free e-book, copied it to the X4, and started reading. I expected a lot more fiddling, but it just worked. Big shout out to all the contributors, you really nailed this.

But the real reason I wanted the X4 was to read my blog posts on it instead of my phone. I would just need to create an e-pub from them and load them onto the X4. My own little newspaper. With the help of AI, I could build it in a couple of minutes.

I use Feedbin as my RSS reader, which comes with a handy API. I just had to fetch all my unread posts, mark them as read, and create an e-pub from them. I also needed to filter out some feeds, since I subscribe to YouTube channels, JS-heavy blogs, and link-only newsletters that don’t make sense to read on e-ink. I won’t annoy you with the details, but if you want to take a look, you can find the project on GitHub. I called it feedpaper and you can install it via Homebrew.2

With a freshly printed feedpaper on my X4 (and my phone at home), I drove to one of my favorite outdoor cafés and enjoyed a good read with a latte. If you make your own feedpaper someday, I’d love to see a picture of it.

A hand holding the small X4 e-reader outdoors, its e-ink screen showing a blog post. A latte and a metal café chair sit in the sunlit background.

Footnotes

  1. Crosspoint runs not only on the X4, but also other ESP32C3 based devices.
  2. it didn’t make sense to me to support any OS other than macOS, but if you want to check it out and can’t get it running manually, let me know.
The Daily Front Page 27 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Living With the Feed
article

DeepSeek peak/off-peak pricing update

by fagnerbrack·▲ 237 points·3 comments·api-docs.deepseek.com ↗

We’re launching DeepSeek-V4-Pro today! 🚀

🔷 Major Agent upgrades with strong production gains!

🔷 Flexible reasoning effort for V4-Pro & V4-Flash: low for simple tasks, high for daily Agent workflows, max for complex tasks.

🔷 Native OpenAI Responses API support, optimized for Codex with one-click setup.

V4 Pro is now available on app/web. Try it via “Expert Mode”.

V4 Pro is also available via API. Model names remain unchanged—please refer to the API docs for setup details.


API pricing update 💰

With the V4 lineup release, we’re updating our API pricing and introducing peak and off-peak rates. Off-peak rates are 50% lower than peak, enabling more flexible workload scheduling. 📉

New pricing takes effect at 16:00 UTC, Aug 16, 2026 🕒

The Daily Front Page 28 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Also on the Front Page
The Daily Front Page 29 of 30
Friday, August 14, 2026 The Daily Front No. #260814 — Colophon

That's the Front for Today

Issue No. #260814 — Friday, August 14, 2026 — went to press 2026-08-15 at 04:35 UTC.

About This Magazine

The Daily Front is a daily digital magazine assembled from the stories that reached the front page of Hacker News on Friday, August 14, 2026. Headlines, points, and comment counts are recorded as they stood at press time. All articles remain the property of their original authors — every piece links back to its source and its discussion thread.

How It Was Made

Fetched, cleaned, and typeset by an automated pipeline. An editor model laid out the pages, chose the highlights, and briefed the cover illustrator — 32 model calls and 217k tokens in total. Set in Jacquard 12, Playfair Display, Source Serif 4, and IBM Plex Mono, all served via Google Fonts under the SIL Open Font License.

The Cover

The cover illustration was commissioned with this prompt:

A single sprawling newsroom scene at dusk: a glowing desktop workstation surrounded by small modular computing devices, cables, and translucent streams of light flowing into an open archival library; beyond tall windows, a neighborhood of solar-paneled homes stores energy in batteries while an old web of weathered cables and abandoned pages fades into the distance. A fox-like browser silhouette stands watch near the desk, and a hummingbird with subtly ultraviolet iridescent feathers hovers above a shelf of old books. No text, letters, numbers, logos, or signage.

Render the cover as kinetic-mobile abstraction: a sparse constellation of suspended discs, rods, translucent planes, and fine linking threads in primary red, cobalt blue, saturated yellow, white, and matte black, floating in vast clean off-white negative space. Encode the entire dusk newsroom as one balanced mobile: a luminous central disc-and-plane workstation with smaller modular discs, cable rods, and flowing translucent light ribbons opening into a library-like plane; beyond it, tall window frames hold a distant solar-home cluster with battery forms, while a loosening trail of worn cable threads and blank page planes recedes outward. Place a compact fox-like silhouette as a watchful counterweight near the workstation and a tiny iridescent ultraviolet-blue hummingbird form hovering above a stacked book-plane shelf. Keep every form geometric, weightless, and kinetic, with no text, letters, numbers, logos, or signage.

Absolutely no text, letters, numbers, readable symbols, or logos anywhere in the image.

Production Ledger

StageModelCallsTokens InTokens Out
extractgpt-5.6-luna 29 130,384 58,184
layoutgpt-5.6-terra 1 19,289 2,389
covergpt-5.6-luna 1 348 236
covergpt-image-2 1 308 5,488

The Publisher

Published by Johnny.

Support the Press

If The Daily Front brightens your morning, consider supporting its publisher.

Credits & Contact

All content — articles, posts, comments, and the images within them — belongs to its original authors and is reproduced here to point readers back to the source. Full credit goes to those creators; every item links to its original and its Hacker News discussion.

If you are an author and would like your content removed from an issue, write to hi@johnnys.page and it will be taken down.

Feedback is always welcome at the same address: hi@johnnys.page.

Credit where credit is due.

Every page of this issue began as someone else's work — these are the original sources, linked in full.

  1. Qwen 3.8 27B by erdaltoprak — huggingface.co·HN discussion ↗
  2. Why does Opus 5 feel worse to work with? by numeri — mun-logadan.github.io·HN discussion ↗
  3. Where did the old web go? We followed 657,607 links to find out by tdx — 0.mk·HN discussion ↗
  4. Google is making private AI practical with homomorphic encryption by u1hcw9nx — blog.google·HN discussion ↗
  5. Introducing Toast 1 by mplappert — mixedbread.com·HN discussion ↗
  6. Maximizing the value of your Claude Code sessions by twapi — claude.com·HN discussion ↗
  7. Going Dark, and the era of law enforcement hacking by vslira — blog.cryptographyengineering.com·HN discussion ↗
  8. The TEMU-Fication of Software, Digital Goods and Services by surprisetalk — xn--gckvb8fzb.com·HN discussion ↗
  9. Bluesky Protocol Services by danabramov — atproto.com·HN discussion ↗
  10. Don't classify, hallucinate by softwaredoug — softwaredoug.com·HN discussion ↗
  11. Blog about things you don't understand yet by gfysfm — seangoedecke.com·HN discussion ↗
  12. Show HN: Mole – Deep research agent for your terminal by lajosdeme — github.com·HN discussion ↗
  13. Show HN: LuaCAD – Parametric CAD Scripted in Lua by adius — luacad.ad-si.com·HN discussion ↗
  14. Show HN: C# Game Engine with its own scripting language and IDE by am-gm — github.com·HN discussion ↗
  15. Turbo Pascal on CP/M, MSX-DOS and MS-DOS by rbanffy — pascal.hansotten.com·HN discussion ↗
  16. Ultraviolet Bird Photography by EndXA — uvbirds.com·HN discussion ↗
  17. Seven books I keep close because I love them by surprisetalk — blog.plover.com·HN discussion ↗
  18. The Library of Ashurbanipal (2025) by samizdis — historytoday.com·HN discussion ↗
  19. Count Binface receives over a quarter of votes in Clacton by-election by tcp_handshaker — bbc.com·HN discussion ↗
  20. Firefox is now the last major browser that still supports uBlock Origin by DemiGuru — pcworld.com·HN discussion ↗
  21. In Australia, a home battery boom has helped cut wholesale power prices by speckx — e360.yale.edu·HN discussion ↗
  22. RustDesk now supports true unattended remote access on Wayland by rustdesk — rustdesk.com·HN discussion ↗
  23. Differential Heuristics by ibobev — redblobgames.com·HN discussion ↗
  24. Hello, me. It's been a while by somesoftdev — themech.net·HN discussion ↗
  25. I turned my RSS feeds into an e-ink newspaper to stop reading on my phone by speckx — heyjonny.dev·HN discussion ↗
  26. DeepSeek peak/off-peak pricing update by fagnerbrack — api-docs.deepseek.com·HN discussion ↗
  27. France's top court blocks social media ban for under-15s by BlueBerry2001 — reuters.com·HN discussion ↗
  28. GLM-5.3: Frontier coding with emergent cyber capabilities by pella — z.ai·HN discussion ↗
  29. Every Fucking Website (2020) by doubletwoyou — lxe.github.io·HN discussion ↗
  30. AI by Hand by sans_souse — byhand.ai·HN discussion ↗

Browse all issues in the archive →