<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Matthias Fahsold</title>
    <description>The latest articles on DEV Community by Matthias Fahsold (@mfahsold).</description>
    <link>https://dev.to/mfahsold</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4188887%2F587a1cc6-3f52-46d3-91db-66c5290d8113.png</url>
      <title>DEV Community: Matthias Fahsold</title>
      <link>https://dev.to/mfahsold</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mfahsold"/>
    <language>en</language>
    <item>
      <title>What's new in Lixity: numbers you can compare, evidence that survives edits</title>
      <dc:creator>Matthias Fahsold</dc:creator>
      <pubDate>Fri, 16 Oct 2026 15:20:58 +0000</pubDate>
      <link>https://dev.to/mfahsold/whats-new-in-lixity-numbers-you-can-compare-evidence-that-survives-edits-3cpk</link>
      <guid>https://dev.to/mfahsold/whats-new-in-lixity-numbers-you-can-compare-evidence-that-survives-edits-3cpk</guid>
      <description>&lt;h1&gt;
  
  
  What's new in Lixity: numbers you can compare, evidence that survives edits
&lt;/h1&gt;

&lt;p&gt;You open a report from last week and one number looks wonderful — for a chapter that is barely two paragraphs long. Or you edit a scene, and the dashboard keeps showing yesterday's chapter count. Neither is a crash; both quietly erode trust. Lixity 0.4.8 is about closing that gap: numbers you can actually compare, and research notes that survive your edits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Small chapters no longer shout
&lt;/h2&gt;

&lt;p&gt;Short texts are noisy. A three-sentence stage note can look extreme in a z-score table — not because the writing is extreme, but because three sentences are simply not much to measure. So comparisons now have a floor, and they tell you when they cannot say something useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chapters under &lt;strong&gt;100 words&lt;/strong&gt; get no z-scores, no effect sizes, no FDR marks.&lt;/li&gt;
&lt;li&gt;Features about sentence variety (staccato, cascade, sentence length variation) need at least &lt;strong&gt;five sentences&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Showing/telling comparisons use the same 100-word floor and mark short chapters "not comparable" instead of giving them a ranking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where a value is withheld, the interface explains why — in all seven supported languages. If you have older reports, rebuild them once before comparing; the new numbers are honest, the old ones were optimistic.&lt;/p&gt;

&lt;p&gt;On the same theme: sentence counting now respects blank-line boundaries. A salutation, a stage note or a sign-off stays one unit, and chapter rhythm, scene units and the corpus statistics finally agree with each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dashboard notices when your manuscript changed
&lt;/h2&gt;

&lt;p&gt;The local dashboard checks your manuscript when the page loads. If the file changed on disk since the last build, it rebuilds itself instead of showing yesterday's numbers with today's confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quotes that survive your edits
&lt;/h2&gt;

&lt;p&gt;Research links between a source quote and a claim are stored as exact anchors — the quote, the paragraph, the line range. Editing is normal, so the review view now tells two cases apart:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Changed outside the quote&lt;/strong&gt; (the quote is still there, the paragraph moved or grew): the link is marked &lt;em&gt;adjusted&lt;/em&gt; and can be re-pinned in one step — in the review tab or with &lt;code&gt;lixity research reconcile-manuscript --accept-moved&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Changed inside the quote&lt;/strong&gt;: the link stays in review. Lixity never re-pins it on its own, because only you can decide whether the meaning survived.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small thing, same spirit: you can now type a plain hyphen between years (&lt;code&gt;1929-1933&lt;/code&gt;). Lixity reads it as the range you meant.&lt;/p&gt;

&lt;h2&gt;
  
  
  A calmer research workspace
&lt;/h2&gt;

&lt;p&gt;The research side keeps sources, dossiers, claims, decisions and evidence in one local archive. Recent polish:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;timeline is a view&lt;/strong&gt;, not a separate world: switch between &lt;strong&gt;List&lt;/strong&gt; and &lt;strong&gt;Timeline&lt;/strong&gt; right where your claims live. The decisions pane says what it is for — deliberate choices with a reason, not historical claims.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zotero stays a catalogue, visibly.&lt;/strong&gt; Cards show a quiet &lt;em&gt;Zotero ↗&lt;/em&gt; link and a type line; tags filter the list. Capturing a source into your archive is still a deliberate click, never a background sync.&lt;/li&gt;
&lt;li&gt;Evidence panels keep their citations when other lists refresh — nothing you loaded gets rebuilt under your hands.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One look, everywhere
&lt;/h2&gt;

&lt;p&gt;The interface had collected a decade of small decisions: ten border radii, fifteen font sizes between 0.72 and 0.84 rem, three different spinners, two kinds of tabs. That is now one small system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One scale&lt;/strong&gt; for corners, text sizes and spacing — shared by the app and the documentation site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One control language&lt;/strong&gt;: the workspace switch and the research tabs are the same control, badges and tags are one family, and touch devices get 44-pixel targets everywhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A component layer&lt;/strong&gt; now renders the list panels (plain vendored JavaScript, no build step). It also fixed a real annoyance: the "Loading…" placeholder no longer lingers next to the loaded list.&lt;/li&gt;
&lt;li&gt;A test suite now fails the build if a new one-off value sneaks in — the system cannot quietly drift back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Logs you can actually find
&lt;/h2&gt;

&lt;p&gt;Diagnostics now go through one logging setup: one line format, standard levels, and a log file that stays bounded (older entries are rotated, not deleted silently). &lt;code&gt;--debug&lt;/code&gt;, &lt;code&gt;LIXITY_DEBUG&lt;/code&gt; and &lt;code&gt;LIXITY_LOG_LEVEL&lt;/code&gt; choose how much you see, and &lt;code&gt;lixity service status&lt;/code&gt; prints the path. Request logs keep the route but never the query string, so research context and project tokens stay out of the file — and log records never contain manuscript text.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your privacy, in plain words
&lt;/h2&gt;

&lt;p&gt;Lixity runs on your computer. Nothing is uploaded, there is no account, and the browser page only runs the scripts that ship with it (that is what the strict Content Security Policy means). Loopback bind, host allow-list, payload limits and explicit non-goals are written down in the project's &lt;code&gt;SECURITY.md&lt;/code&gt;. The statistical signals support your review; they are not a quality score, and they are not an instruction to rewrite your prose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://mfahsold.github.io/lixity/demo/report.html" rel="noopener noreferrer"&gt;Demo report&lt;/a&gt; — invented text, opens in your browser, no install.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mfahsold.github.io/lixity/examples/effi-briest.html" rel="noopener noreferrer"&gt;Effi Briest&lt;/a&gt; and &lt;a href="https://mfahsold.github.io/lixity/examples/pride-and-prejudice.html" rel="noopener noreferrer"&gt;Pride and Prejudice&lt;/a&gt; — complete analyses of public-domain novels.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://mfahsold.github.io/lixity/guides/first-look.html" rel="noopener noreferrer"&gt;First look&lt;/a&gt; — from chapter comparison to the passage behind a number, in three minutes.&lt;/li&gt;
&lt;li&gt;For your own manuscript: &lt;code&gt;uv tool install --python 3.12 --managed-python lixity&lt;/code&gt;, then &lt;code&gt;lixity service start --open&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it: tell me which passage surprised you — that is the feedback that shapes the next release.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mfahsold.github.io/lixity/" rel="noopener noreferrer"&gt;Lixity home&lt;/a&gt; · &lt;a href="https://mfahsold.github.io/lixity/blog/" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; · &lt;a href="https://github.com/mfahsold/lixity/issues" rel="noopener noreferrer"&gt;Report a reproducible issue&lt;/a&gt; · &lt;a href="https://mfahsold.github.io/lixity/#impressum" rel="noopener noreferrer"&gt;Legal notice&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>writing</category>
      <category>nlp</category>
    </item>
    <item>
      <title>Finding tense switches in a novel — and deciding which ones matter</title>
      <dc:creator>Matthias Fahsold</dc:creator>
      <pubDate>Fri, 16 Oct 2026 15:20:32 +0000</pubDate>
      <link>https://dev.to/mfahsold/finding-tense-switches-in-a-novel-and-deciding-which-ones-matter-4j19</link>
      <guid>https://dev.to/mfahsold/finding-tense-switches-in-a-novel-and-deciding-which-ones-matter-4j19</guid>
      <description>&lt;h1&gt;
  
  
  Finding tense switches in a novel — and deciding which ones matter
&lt;/h1&gt;

&lt;p&gt;Something feels off in chapter twelve. You read a few pages and there it is: the scene slipped from past into present. Was that on purpose, or did it just happen? On page 40 you can tell. On page 400 you cannot.&lt;/p&gt;

&lt;h2&gt;
  
  
  A tense break is rarely a typo
&lt;/h2&gt;

&lt;p&gt;The base tense of a novel is a choice. Past tense gives you a narrator looking back. Present tense puts the reader right inside the scene. The historical present adds pressure. A break between them is not a grammar mistake — it is a &lt;em&gt;signal&lt;/em&gt; to the reader. The question is only whether you meant to send it, and whether it arrives at the right moment. Reading an entire manuscript just to find those moments is slow, which is why editors work with passages instead of impressions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Lixity shows you
&lt;/h2&gt;

&lt;p&gt;Lixity reads your manuscript on your own computer and gives every paragraph a simple tense reading: &lt;strong&gt;present&lt;/strong&gt;, &lt;strong&gt;past&lt;/strong&gt;, &lt;strong&gt;mixed&lt;/strong&gt; or &lt;strong&gt;neutral&lt;/strong&gt;. Paragraphs that switch or noticeably mix tenses also get a small strength rating from 0 to 3.&lt;/p&gt;

&lt;p&gt;Out of that come two lists, and they answer different questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flagged passages&lt;/strong&gt; (rating 2 or higher) are your short list: the paragraphs worth a second look.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The chapter line&lt;/strong&gt; tells you the surrounding norm — the tense a reader experiences as the "base" of the scene. Without it, a single switch has nothing to stand out from.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One honest sentence: these readings come from verb forms and markers, not from a grammar parse. Dialogue, nested clauses and reported speech all shape the counts. That is exactly why the last step is always a person reading the passage — not a number.&lt;/p&gt;

&lt;h2&gt;
  
  
  The review loop, step by step
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install and open.&lt;/strong&gt; &lt;code&gt;uv tool install --python 3.12 --managed-python lixity&lt;/code&gt;, then &lt;code&gt;lixity service start --open&lt;/code&gt; and choose &lt;strong&gt;Open Project&lt;/strong&gt; for your manuscript folder. (Windows, macOS and Linux are covered in the &lt;a href="https://mfahsold.github.io/lixity/guides/installation.html" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt;.) If you just want to see the loop first: the &lt;a href="https://mfahsold.github.io/lixity/demo/report.html" rel="noopener noreferrer"&gt;demo report&lt;/a&gt; opens in your browser, no install.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Start with the review panel.&lt;/strong&gt; &lt;strong&gt;Start your review&lt;/strong&gt; offers &lt;strong&gt;Open passage&lt;/strong&gt; (the first paragraph above your threshold, in reading order), &lt;strong&gt;Explore chapters&lt;/strong&gt; and &lt;strong&gt;Open sentence rhythm&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Work the flagged list.&lt;/strong&gt; The &lt;strong&gt;Flagged passages&lt;/strong&gt; panel lists every paragraph at or above your threshold, sorted by strength and line. Click a row and the paragraph opens, the page scrolls, the passage flashes — with the "flagged only" filter set, so the rest of the page gets out of your way.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read the context before you judge.&lt;/strong&gt; Inside the opened paragraph, &lt;strong&gt;Values&lt;/strong&gt; shows the source lines and the measurements. Then look at the scene: is the switch carried by a letter, a memory, an interior monologue? The chapter line in the header shows you the norm you are comparing against.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write your decision where you read it.&lt;/strong&gt; The marker buttons (&lt;strong&gt;+ To-do&lt;/strong&gt;, &lt;strong&gt;+ Check&lt;/strong&gt;, &lt;strong&gt;+ Attention&lt;/strong&gt;) leave a review note in the manuscript as a Markdown comment. It stays invisible while you read and shows up later in the &lt;strong&gt;Work markers&lt;/strong&gt; panel.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  When a switch is on purpose
&lt;/h2&gt;

&lt;p&gt;A high rating measures a change, not a mistake. These cases are usually intentional:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Letters and documents.&lt;/strong&gt; A quoted letter often shifts into present or into a different register; readers expect the frame to change.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flashbacks and frame stories.&lt;/strong&gt; Moving from present to past may be exactly what the structure asked for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free indirect speech.&lt;/strong&gt; A character's inner voice can pull the tense along — effective, but easy to overuse.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A scene turn.&lt;/strong&gt; One present-tense paragraph at the end of a past-tense chapter can be a strong, deliberate accent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The flagged list decides none of this. It makes sure no unintended break hides in a long manuscript — and that the intended ones are visible enough to be a choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this can and cannot do
&lt;/h2&gt;

&lt;p&gt;Verb-form patterns miss irony, ellipsis and unusual syntax. Very short chapters give noisy estimates, which is why Lixity now marks them "not comparable" instead of ranking them. Dialogue-heavy scenes reflect speaker turns, not narrative tense. The &lt;code&gt;flag_min_severity&lt;/code&gt; setting (1–3) controls how strict your short list is; start at 2. Lixity never rewrites anything — it is a flashlight, not a judge. The &lt;a href="https://mfahsold.github.io/lixity/guides/interpretation.html" rel="noopener noreferrer"&gt;interpretation guide&lt;/a&gt; and the &lt;a href="https://github.com/mfahsold/lixity/blob/main/docs/METHODS.md" rel="noopener noreferrer"&gt;methods document&lt;/a&gt; explain the details.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it without installing
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://mfahsold.github.io/lixity/demo/report.html" rel="noopener noreferrer"&gt;demo report&lt;/a&gt; is made from invented text and opens in your browser. The &lt;a href="https://mfahsold.github.io/lixity/examples/effi-briest.html" rel="noopener noreferrer"&gt;Effi Briest&lt;/a&gt; and &lt;a href="https://mfahsold.github.io/lixity/examples/pride-and-prejudice.html" rel="noopener noreferrer"&gt;Pride and Prejudice&lt;/a&gt; examples are complete analyses of public-domain novels. For your own manuscript: install, open the project, and review one chapter — the loop is the same at any length.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://mfahsold.github.io/lixity/" rel="noopener noreferrer"&gt;Lixity home&lt;/a&gt; · &lt;a href="https://mfahsold.github.io/lixity/blog/" rel="noopener noreferrer"&gt;Blog&lt;/a&gt; · &lt;a href="https://github.com/mfahsold/lixity/issues" rel="noopener noreferrer"&gt;Report a reproducible issue&lt;/a&gt; · &lt;a href="https://mfahsold.github.io/lixity/#impressum" rel="noopener noreferrer"&gt;Legal notice&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>writing</category>
      <category>nlp</category>
    </item>
  </channel>
</rss>
