<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Caxton Changelog</title>
    <link>https://caxton.app/changelog</link>
    <description>Release notes for Caxton, the native macOS editor for multi-GB text files and CSVs.</description>
    <language>en-us</language>
    <lastBuildDate>Wed, 09 Sep 2026 09:00:00 -0400</lastBuildDate>
    <atom:link href="https://caxton.app/changelog/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Caxton 1.7.2: A fix release for Log Mode and bookmarks</title>
      <link>https://caxton.app/changelog#v1-7-2</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-7-2</guid>
      <pubDate>Wed, 09 Sep 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">A fix release for Log Mode and bookmarks. Nothing
  new to learn; a few behaviors change on purpose and are called out
  below.</p>

  <h3>Bookmarks and incidents</h3>
  <ul>
    <li><strong>Saved bookmarks are never overwritten.</strong> A
      bookmark set while a large file was still indexing could replace
      the file's saved bookmarks and notes with that one bookmark. The
      saved set and the session's bookmarks are now merged when the
      saved set loads, and every save merges the same way.</li>
    <li><strong>Move Line keeps bookmarks through undo.</strong> Moving a
      line up or down carried its bookmark and note, but undoing the
      move left them on the wrong line. Undo and redo now restore them
      exactly. A move involving the last line of a file with no final
      line ending used to drop the bookmark; it keeps it.</li>
    <li><strong>Join Lines keeps the first line's bookmark.</strong>
      Joining a selection kept the bookmark of the last joined line
      instead of the first; Replace All of a whole line did the same.
      The first line keeps its bookmark and note.</li>
    <li><strong>Extract Incident Window works on a followed log.</strong>
      It refused with "Document changed" on any file that was being
      appended to while the dialog was open. It now refuses only for
      edits made in Caxton, and Delete Bookmarked Lines and Delete Lines
      Matching check the same way.</li>
    <li><strong>The Bookmarks panel.</strong> The Text column no longer
      ends in a replacement character on a long line with accented
      text; a note edit finished after the bookmark moved no longer
      creates a stray bookmark; the title follows a rename; the ring
      tooltip refreshes after the note is edited.</li>
  </ul>

  <h3>Following</h3>
  <ul>
    <li><strong>Rotation under Follow.</strong> When a followed file is
      rotated, the follower finishes reading the old file, shows the
      rotation prompt, and starts fresh on the new file. No byte of the
      old file lands in the new one. A renamed file is followed as
      before, and if the file is deleted the banner says how many bytes
      were read after the rename and how many could not be.</li>
    <li><strong>A Catch Up that cannot reload</strong> leaves the
      follower where it was and says so. Before, it skipped the backlog
      silently or re-read bytes it had already shown.</li>
    <li><strong>Catch Up and dialogs.</strong> The automatic catch-up
      never fires while a dialog is open. Choosing Discard in the Catch
      Up dialog keeps Follow on, and a manual Catch Up leaves Follow the
      way you had it.</li>
    <li><strong>Open Skipped Range as Slice</strong> is disabled for a
      file reopened in another encoding (the tooltip says why) and after
      a rotation clears the range.</li>
    <li><strong>Follow starts exactly where the file was loaded,</strong>
      so bytes written in the instant between the load and the first
      poll are shown once, not twice.</li>
  </ul>

  <h3>Go to Time and timestamps</h3>
  <ul>
    <li><strong>Followed syslogs keep the right year.</strong> A syslog
      followed across a month boundary dated the new lines a year
      earlier and reported the log out of order. The year reference now
      refreshes from the file as it grows, and a year typed in Timestamp
      Format replaces it outright.</li>
    <li><strong>Short logs detect.</strong> A file with one or two
      stamped lines, or a followed file that starts empty, gets a
      timestamp format. Before, it never became a log for the
      session.</li>
    <li><strong>Go to Time lands on the record</strong> when a record is
      followed by a long block without timestamps (a dump or a trace
      longer than the lookback budget), instead of at the end of the
      file.</li>
    <li><strong>More zone forms.</strong> GMT+02:00, UTC+2 and GMT-0530
      are read as offsets. An offset typed with no unit (+5) is refused
      with a hint instead of being read as a line number. A log whose
      lines carry different offsets is shown in a named zone rather than
      one fixed offset.</li>
  </ul>

  <h3>Filtering</h3>
  <ul>
    <li><strong>The bar's Severity gate is the one that applies.</strong>
      Apply and Extract All in the Filter Lines panel use the gate as it
      stands, even when it changed after the panel opened.</li>
    <li><strong>Stack traces follow their record further.</strong> A line
      with no level word and no timestamp follows its record up to
      4,096 lines or 1&nbsp;MB back, the same reach as Go to Time and
      Extract Incident Window. The filter used to stop at 64 lines.</li>
    <li><strong>Whole-second To edges.</strong> A time window's To edge
      typed without a fraction covers its whole second, so 14:10:59
      includes 14:10:59.999.</li>
    <li><strong>Small fixes.</strong> A severity level not in the menu
      shows as its own row instead of a blank; the panel focuses its
      first field when that row is a time or severity row; a gate is
      dropped cleanly when a document leaves Log Mode; a level word cut
      by the scan limit no longer counts by its prefix.</li>
  </ul>

  <h3>Encodings</h3>
  <ul>
    <li><strong>Windows-1252 with sparse accents is detected again.</strong>
      1.7.1 asked for two sampled windows before calling a file legacy,
      which left an export whose only accented bytes were a few names
      open as UTF-8 with replacement characters. A single window that
      reads as text is enough again; a UTF-8 file with a burst of binary
      garbage still stays UTF-8.</li>
    <li><strong>The banner names the likely encoding.</strong> A
      low-confidence UTF-8 open says "Some bytes look like Windows-1252.
      Reopen with that encoding?" and File &#9656; Reopen with Encoding
      preselects it.</li>
  </ul>

  <h3>Under the hood</h3>
  <ul>
    <li><strong>Severity Patterns</strong> states that patterns are tried
      top to bottom with the first match winning; an entry written by a
      newer Caxton shows greyed and can be removed or moved.</li>
    <li><strong>Syntax coloring</strong> after an external reload no
      longer reuses the previous file's states.</li>
    <li><strong>Large pastes and tail appends</strong> no longer make a
      second copy of the inserted bytes.</li>
    <li><strong>Split panes</strong> share the regex-pause state, so both
      panes agree and the pause banner shows once.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.7.1: A hardening release for Log Mode: fixes across following, incident notes, the severity filter, Go to Time, and syntax coloring</title>
      <link>https://caxton.app/changelog#v1-7-1</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-7-1</guid>
      <pubDate>Sun, 06 Sep 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">A hardening release for Log Mode: fixes across
  following, incident notes, the severity filter, Go to Time, and
  syntax coloring. Nothing new to learn, one new menu item.</p>

  <h3>Following</h3>
  <ul>
    <li><strong>Catch Up asks first.</strong> Catching up on a file
      with unsaved edits asks before discarding them; the automatic
      catch-up past half a gigabyte of lag pauses Follow instead.
      Bookmarks and their notes re-anchor into the new window when its
      index completes.</li>
    <li><strong>Reopened files catch up correctly.</strong> A file
      reopened in another encoding resumed from the wrong byte after
      Catch Up, re-appending part of the file or reporting a
      truncation that never happened. The follower now resyncs to the
      source file's length. The automatic catch-up is off for those
      files; View &#9656; Log &#9656; Catch Up to Live does it on
      demand.</li>
    <li><strong>Nothing dropped silently, kept honest.</strong> Follow
      starts from the bytes already loaded, so lines written between
      the open and the first poll stream in. A rotation prompt names
      any bytes of the old file that had not been read. A read error
      pauses Follow with the reason. The Following pill and the
      automatic catch-up track the lag against the last report, so a
      steady drift is reported.</li>
    <li><strong>The read size grows only when a tick was full.</strong>
      A trickling log no longer walks the read size to its ceiling and
      then absorbs the next burst in a single 128&nbsp;MB read.</li>
    <li><strong>Open Skipped Range as Slice.</strong> View &#9656; Log
      &#9656; Open Skipped Range as Slice opens the bytes a Catch Up
      left outside the window in their own window, and the banner's
      byte range is the range actually outside the window.</li>
  </ul>

  <h3>Bookmarks and incidents</h3>
  <ul>
    <li><strong>Notes stay on their line.</strong> Delete Line, Move
      Line Up and Down, Delete Non-Bookmarked Lines, Delete Bookmarked
      Lines, and undo of any of them keep notes with the lines they
      belong to. A note on a deleted line goes with it instead of
      landing on the next record.</li>
    <li><strong>Notes persist within seconds</strong> of a change,
      not at quit.</li>
    <li><strong>A rename during indexing no longer loses the
      sidecar.</strong> Bookmarks and markers from earlier sessions
      follow a move even while the index is still building, markers
      added this session follow too, and changes made after the move
      reach both paths.</li>
    <li><strong>The Bookmarks panel</strong> is titled with its
      document, closes with it, keeps an in-progress note edit through
      other changes, refreshes its text after edits, and edits a note
      on Return. Hovering a noted bookmark's ring shows the note.</li>
    <li><strong>Extract Incident Window</strong> validates Before and
      After, refuses when the document changed while the dialog was
      open, writes headers in the document's line ending, and bounds a
      seconds window that runs into untimestamped lines. Copy as
      Incident Notes flattens newlines and tabs and cuts long text on
      a character boundary.</li>
    <li><strong>Severity Patterns apply top to bottom.</strong>
      Literals and regexes are tried in the order listed, first match
      wins, Move Up and Move Down reorder them, blank rows are not
      saved, and a malformed entry no longer discards the others.</li>
  </ul>

  <h3>Filtering</h3>
  <ul>
    <li><strong>Severity is a gate.</strong> The bar's Severity popup
      applies over every condition, OR joiners included, and the digest
      says so. The Filter Lines panel keeps its Severity rows on Apply
      and Extract All, and gains Time window rows (From and To in the
      Go to Time forms).</li>
    <li><strong>Stack traces stay with their record.</strong> A line
      with no level word and no timestamp follows the record above it,
      so Error and above keeps the trace under its error line.</li>
    <li><strong>One vocabulary.</strong> The row tint, the minimap
      ticks, the filter and the Bookmarks panel classify a line the
      same way; bracketed levels, <code>level=ERROR</code> and JSON
      logs tint the way they filter. Changing Severity Patterns re-runs
      an active severity filter, the split pane takes the rules, and a
      slow pattern pauses regex patterns for ten seconds instead of
      stalling scrolling.</li>
  </ul>

  <h3>Go to Time and timestamps</h3>
  <ul>
    <li><strong>The log's own zone.</strong> Typed times and the
      landing banner use the zone the lines carry when they carry one,
      instead of this Mac's.</li>
    <li><strong>More formats recognized.</strong> Apache access and
      error logs, nginx error logs and Go's log package parse now.</li>
    <li><strong>Detection votes among recognized lines</strong> and
      waits for the full sample, so a log whose records span several
      lines detects. Day-first dates win when any sampled line proves
      them. Syslog years roll per line across New Year. UTC and GMT
      and a DST boundary are read correctly, February 31 and request
      IDs are not dates, and the Timestamp Format choice is kept with
      the session.</li>
    <li><strong>Honest landings.</strong> A continuation line deep in
      a stack trace keys to its own record, the banner says when a log
      is not in time order near the landing, and a Go To entry that
      does not parse says why instead of closing.</li>
  </ul>

  <h3>Under the hood</h3>
  <ul>
    <li><strong>Syntax coloring stays right after Replace All.</strong>
      The incremental re-lex invalidates on bulk edits, applies each
      edit at its own line, settles on the right line for multi-line
      pastes, and extends its states when the index completes.</li>
    <li><strong>Encoding detection needs two windows to call a file
      legacy.</strong> One window of bad bytes in an otherwise UTF-8
      file is damage, not a reason to transcode the whole file.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.7.0: Log Mode</title>
      <link>https://caxton.app/changelog#v1-7-0</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-7-0</guid>
      <pubDate>Fri, 04 Sep 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Log Mode. A log is a first-class view now: jump by
  time, filter by severity, note the incident, extract the window
  around it, and follow a file that grows faster than you can read.</p>

  <h3>Time and severity</h3>
  <ul>
    <li><strong>Go to Time.</strong> In a log whose lines start with a
      timestamp, the Go To field (<span class="kbd">&#8997;&#8984;L</span>)
      takes <code>14:03</code>, <code>2026-09-04 14:03</code>, or
      <code>+5m</code> from the caret line, and lands on the first line
      at or after it. The search probes a few dozen lines through the
      index, so it is instant at 10&nbsp;GB, and the banner names the
      line and time it landed on.</li>
    <li><strong>Timestamps recognized.</strong> ISO 8601, syslog,
      Apache and nginx, Unix epoch in seconds or milliseconds, and
      slash-dated forms. Caxton votes the format from the first lines;
      View &#9656; Log &#9656; Timestamp Format&hellip; overrides the vote,
      the zone for lines that carry none, and the year syslog lines
      lack.</li>
    <li><strong>Filter by severity.</strong> The filter bar gains a
      Severity popup in log documents (Warn and above, Error and above,
      Fatal only, and the rest), and any row in the Filter Lines panel
      can match by level instead of text. One vocabulary drives the row
      tint, the new red and amber ticks in the minimap, and the filter:
      ERROR, WARN, INFO, DEBUG, FATAL and their relatives, plus your
      own words or regexes from View &#9656; Log &#9656; Severity
      Patterns&hellip;, which win over the built-ins.</li>
  </ul>

  <h3>Incidents</h3>
  <ul>
    <li><strong>Notes on bookmarks.</strong> Edit &#9656; Bookmarks
      &#9656; Add Note to Bookmark&hellip; puts a note on the caret line,
      bookmarking it first if needed. A noted bookmark shows as a ring
      in the gutter; notes move with their line, go when it goes, and
      survive relaunch.</li>
    <li><strong>The Bookmarks panel</strong> (<span class="kbd">&#8997;&#8984;M</span>)
      lists every bookmark with its timestamp and severity in a log,
      its first line of text, and its note, editable in place.
      Double-click navigates. Copy as Incident Notes puts the table on
      the clipboard as plain text for a ticket.</li>
    <li><strong>Extract Incident Window&hellip;</strong> takes the lines
      around every bookmark, N lines before and after, or in a
      timestamped log N seconds before and after by record time,
      merges overlapping windows, and writes them to a new document
      with a header naming each block's source span.</li>
  </ul>

  <h3>Following a fast file</h3>
  <ul>
    <li><strong>Behind by how much.</strong> When a file grows faster
      than one poll absorbs, the Following pill says how far behind it
      is and the read size adapts to what a tick can take.</li>
    <li><strong>Catch Up to Live.</strong> Past half a gigabyte of
      backlog Caxton reloads the last 64&nbsp;MB and tells you exactly
      which byte range it skipped; View &#9656; Log &#9656; Catch Up to
      Live does the same on demand. Nothing is dropped silently.</li>
    <li><strong>Follow works on reopened files.</strong> A file
      reopened in another encoding can Follow now; appended bytes are
      transcoded as they arrive, code units split across a poll
      included.</li>
  </ul>

  <h3>Fixed</h3>
  <ul>
    <li><strong>The reopen hint stopped nagging.</strong> 1.6.1 showed
      "Detected: UTF-8 (85%)" on every plain text file over 256&nbsp;KB.
      Detection now samples four windows through the file plus the
      tail: all-ASCII is near-certain, a valid multibyte window
      confirms UTF-8, and only a window that is not UTF-8 keeps the
      hint, naming the encoding it found. A stray bad byte is treated
      as damage, not a legacy encoding.</li>
    <li><strong>Scratch files from a killed Caxton</strong> are swept at
      the next launch instead of after a day; each Tier-2 line index
      was 1.2&nbsp;GB on disk.</li>
    <li><strong>Bookmarks and markers follow a rename.</strong> When a
      file is moved or renamed under an open window, its bookmarks and
      markers are copied to the new path and the banner names it.</li>
    <li><strong>Under the hood.</strong> Fold detection runs off the
      main thread, syntax coloring re-lexes from the edited line
      instead of the whole file, and the code base builds clean under
      Swift's complete concurrency checking.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.6.1: A hardening release: fixes across saving, folding, filtering, the grid, encodings, and the file watcher</title>
      <link>https://caxton.app/changelog#v1-6-1</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-6-1</guid>
      <pubDate>Tue, 01 Sep 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">A hardening release: fixes across saving,
  folding, filtering, the grid, encodings, and the file watcher.
  Nothing new to learn.</p>

  <h3>Saving</h3>
  <ul>
    <li><strong>Closing waits for the save.</strong> Closing a window
      or quitting while a save was still writing used to tear the
      document down underneath it. The close now waits, and a
      streaming save finishes first.</li>
    <li><strong>Symlinks save through.</strong> A file opened through
      a symbolic link is written to its target in every save tier. The
      atomic path used to replace the link with a plain file and leave
      the target untouched.</li>
    <li><strong>Lost-update checks before the write.</strong> A save
      compares the file on disk with what was opened before writing
      the temporary copy and again before the swap. An external change
      you chose to overwrite once is asked about again if the file
      changes again.</li>
    <li><strong>Recovery, tidied.</strong> The recovery journal writes
      off the main thread. A journal whose file has moved offers
      Locate, Discard, or Decide Later instead of being deleted, and
      replaying recovered edits rebuilds the index once. Untitled
      documents keep their backing file under Application Support and
      never appear in a session.</li>
    <li><strong>Tail mode saves honestly.</strong> Saving a file that
      grew while you followed it stops with an offer to Save As
      instead of writing a stale copy.</li>
    <li><strong>Save As of a reopened file says UTF-8.</strong> A file
      reopened in another encoding is written as UTF-8 on Save As, and
      the panel says so before you click.</li>
  </ul>

  <h3>Editing</h3>
  <ul>
    <li><strong>Invalid bytes are left alone.</strong> Text menu
      transforms refuse a target that contains invalid UTF-8 and name
      the line, instead of quietly rewriting those bytes as
      replacement characters.</li>
    <li><strong>The Text menu works under a filter.</strong> With a
      filter or Narrow active, transforms apply to the visible lines.
      Operations that reorder or change the line count need one
      contiguous block and say so.</li>
    <li><strong>Folds and bookmarks survive bulk edits.</strong>
      Replace All, Delete Lines Matching, and the other bulk
      operations rebase folds and bookmarks in one pass. Typing on a
      fold's first line no longer unfolds it.</li>
    <li><strong>Split view targets the focused pane.</strong> Every
      Text menu operation, &#8984;/ and the bracket commands act on
      the pane with focus, not always the left one.</li>
    <li><strong>Multiple cursors, completed.</strong> Cut removes
      every selection, Copy joins them in document order, completion
      lands at every caret, and snippet stops follow mirrored
      typing.</li>
    <li><strong>Small truths.</strong> Alphabetical sort is stable for
      lines that compare equal. Hard Wrap keeps runs of spaces. Word
      Count counts lines the way the gutter does. A per-pattern tab
      width applies to indenting and outdenting, not only to display.
      Clicks and the caret agree with the screen on wrapped long
      lines.</li>
  </ul>

  <h3>Find, Filter, Compare</h3>
  <ul>
    <li><strong>Exact counts past two million.</strong> Find keeps
      counting after the highlight cap and reports the total with how
      many are highlighted. Replace All still replaces every
      one.</li>
    <li><strong>Replace All, faster.</strong> The regex compiles once
      and each line is scanned once. Fifty thousand matches on one very
      long line no longer rescan it per match.</li>
    <li><strong>Whole word means the same everywhere.</strong> Filter's
      word boundaries read the neighboring character the way Find
      does, and Find accepts zero-length regex matches the way Filter
      does.</li>
    <li><strong>Extract All refuses a partial view.</strong> When a
      regex filter timed out before covering the whole file, Extract
      All and cut-visible say so instead of exporting the scanned
      prefix.</li>
    <li><strong>Batch Replace.</strong> Runs report each pair as it
      starts and cancel between pairs. Across all open documents, each
      window keeps its own undo and its own caret. Pair lists import
      with quoted newlines intact, a .tsv extension means tabs, and
      export offers .tsv. A match after an invalid byte on its line is
      replaced instead of dropped.</li>
    <li><strong>Compare, made careful.</strong> CR-only files compare
      line by line, differing line endings are noted, a target that
      changes on disk is flagged when you return, Save Report reports
      write failures, a copy waits for the alignment it belongs to,
      and the window reads under VoiceOver.</li>
    <li><strong>Sort by Match Text is off the main thread.</strong> A
      million-match results panel sorts without freezing the
      window.</li>
  </ul>

  <h3>CSV</h3>
  <ul>
    <li><strong>Decimal commas do not make a column.</strong> A comma
      that mostly sits between digits forfeits its vote, so semicolon
      and tab files with European decimals detect correctly. A file
      with one value per line opens as a one-column grid.</li>
    <li><strong>Edits during a save say so.</strong> Grid paste, clear,
      fill, row delete, transpose, and the column operations banner
      when a save is in flight instead of failing silently or claiming
      success.</li>
    <li><strong>Header truths.</strong> Insert Sequential Numbers
      respects the header flag, Promote Row to Header flips it after
      the move lands, and Delete Row on a one-row table works.</li>
    <li><strong>Filters and structure.</strong> A structural operation
      on a filtered grid releases the row filter and tells you. A
      quoted field followed by a bare carriage return is reported
      instead of silently re-encoded.</li>
  </ul>

  <h3>Opening and watching</h3>
  <ul>
    <li><strong>One bad byte no longer fails the open.</strong> Legacy
      encodings decode in chunks; a chunk that fails is bisected and
      only the undecodable bytes become replacement characters.
      Transcoding runs in the background with progress and a
      cancel.</li>
    <li><strong>Detection admits what it does not know.</strong>
      Confidence is capped for a pure-ASCII head of a larger file,
      overlong and surrogate sequences are rejected, and a forced
      encoding wins over the BOM sniff.</li>
    <li><strong>The external-change prompt gains Compare.</strong> See
      the difference before choosing. Keep Mine covers one change; a
      later external write asks again. A deleted, renamed, or
      unmounted file is reported in tail mode too.</li>
    <li><strong>One file, one window.</strong> The same file opened
      through different paths lands in the existing window. Files
      opened while a panel is key join the last active editor's
      group.</li>
    <li><strong>Window menu.</strong> Show Previous Tab and Show Next
      Tab (&#8963;Tab, &#8679;&#8963;Tab) walk the tabs. Quitting with
      several unsaved documents offers Review Changes, Discard
      Changes, or Cancel.</li>
  </ul>

  <h3>Licensing</h3>
  <ul>
    <li><strong>Deactivation reports what happened.</strong> Released;
      released on this Mac after the server refused; or kept when the
      server could not be reached, in which case the Mac stays
      activated so a retry can free the seat.</li>
    <li><strong>Banners name the reason.</strong> A refused edit says
      the document is read-only, or that editing is off until Caxton
      is licensed, instead of "unavailable while saving" for
      everything. Trial state is written to the keychain only when it
      changes.</li>
  </ul>

  <h3>Also</h3>
  <ul>
    <li><strong>Markers.</strong> A marker whose regex does not
      compile says so in the Markers panel. A pattern that takes too
      long to match is disabled for that document with one banner
      instead of stalling every redraw.</li>
    <li><strong>Quieter when idle.</strong> The status bar refreshes
      at most ten times a second, the caret blink repaints only the
      caret, and the syntax rebuild for large source files is linear
      in bytes and cancels when a newer one starts.</li>
    <li><strong>Workspaces and slices.</strong> Workspace import and
      export report failures and confirm overwrites, Windowed Slice
      validates its range, and the Command Palette re-validates a menu
      action before running it.</li>
    <li><strong>Privacy policy.</strong> Names Lemon Squeezy as
      merchant of record and lists exactly what activation
      sends.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.6.0: Compare Lite</title>
      <link>https://caxton.app/changelog#v1-6-0</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-6-0</guid>
      <pubDate>Wed, 26 Aug 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Compare Lite. What changed between these two
  files, plus the keyboard manners and Find panel depth an everyday
  editor owes you.</p>

  <h3>Compare, completed</h3>
  <ul>
    <li><strong>Copy changes across.</strong> Click a difference to
      select it, then copy it left or right. A file that is open in
      Caxton compares as its live text, unsaved edits included and
      labeled, and copies land in its buffer as one undo step.
      After a copy the panes recompute, and a comparison left open
      catches up when you come back to it.</li>
    <li><strong>Ignore Case joins Ignore Whitespace.</strong> ASCII
      case folding; accented case stays significant.</li>
    <li><strong>A report you can file.</strong> Save Report writes
      the differences as plain text: line numbers, minus and plus
      lines, one hunk per change.</li>
    <li><strong>Honest at scale.</strong> Copy works only on fully
      captured sides, refuses blocks over 64 MB, and the arrows are
      &#8984;&#8595; and &#8984;&#8593;.</li>
  </ul>

  <h3>The keyboard you expect</h3>
  <ul>
    <li><strong>Tab indents the block.</strong> With a selection,
      Tab indents the selected lines and &#8679;Tab outdents them,
      repeatable, one undo step each. It used to replace the
      selection with a tab character.</li>
    <li><strong>Rectangles from the keyboard.</strong> &#8997;&#8679;
      with &#8593;&#8595; starts or grows a rectangular selection at
      the caret, &#8592;&#8594; widen it, PgUp and PgDn extend it a
      viewport at a time, and a mouse-started rectangle keeps
      growing from the keyboard.</li>
    <li><strong>Home, End, and pages.</strong> Home and End jump to
      the line's start and end (&#8984; variants: the document's),
      and PgUp and PgDn move the cursor a viewport at a time instead
      of only scrolling. &#8679; extends throughout.</li>
    <li><strong>&#8984;D selects the next occurrence.</strong> First
      press selects the word under the caret; each press adds a
      cursor at the next occurrence, wrapping around, bounded to a
      64&nbsp;MB scan per press on very large files.</li>
  </ul>

  <h3>The Find panel, filled in</h3>
  <ul>
    <li><strong>Search Mode.</strong> Normal, Extended (escape
      sequences), or Regular expression: one choice in its own
      group, Notepad++ grammar.</li>
    <li><strong>In selection.</strong> Count, Find All, Bookmark
      All, and Replace All stay inside the selection you had when
      you checked it. The zone follows your edits and clears
      visibly when it can no longer be trusted.</li>
    <li><strong>Backward direction.</strong> Find Next walks toward
      the top of the document.</li>
    <li><strong>Two Find Alls.</strong> Find All in Document opens
      the results panel; Find All in Open Docs hands the query to
      Find in Files on its All Open Documents scope and runs
      it.</li>
  </ul>

  <h3>Fixed</h3>
  <ul>
    <li><strong>A five-agent review hardened all of it.</strong>
      Seventeen fixes before release; the ones worth naming: a copy
      refreshes the edited window's display, a copy refused during
      a save says so instead of claiming success, comparing a file
      with unsaved edits against its own path is a buffer-versus-disk
      check again, and an armed In selection scope applies
      immediately rather than after the next option change.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.5.1: A blank sheet</title>
      <link>https://caxton.app/changelog#v1-5-1</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-5-1</guid>
      <pubDate>Fri, 21 Aug 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">A blank sheet. The grid no longer needs a file
  to start from: empty documents, emptied tables, and raw pasted
  records all become a working CSV.</p>

  <h3>Start from nothing</h3>
  <ul>
    <li><strong>A blank sheet that works.</strong> Delete every row
      of a headerless table and a sheet remains: numbered columns,
      the select-all corner, a blank row 1, and the add row below
      it. The table keeps its width, and typing starts row 1 at
      full width.</li>
    <li><strong>New document, new CSV.</strong> Toggle CSV Grid on
      an empty document and a fresh three-column sheet appears,
      comma delimited, rows numbered from 1. Empty .csv, .tsv, and
      .psv files open straight to the sheet their extension
      promises instead of a could-not-parse banner.</li>
    <li><strong>Type past the last column.</strong> One empty
      column now sits past the last on every editable sheet. Type
      in it and the column materializes with your value at that
      row; the + in its header still adds an empty column with one
      click. Rows already worked this way; columns now match.</li>
    <li><strong>Paste builds tables.</strong> Raw delimited lines
      pasted into a cell spread across cells and rows, quotes
      respected. Pasted into a blank sheet they become the whole
      table. Prose with a comma in it stays one cell.</li>
  </ul>

  <h3>Fixed</h3>
  <ul>
    <li><strong>Wide pastes tell the truth.</strong> A paste wider
      than the table clips the overflow on every row the same way,
      and the banner counts exactly what was dropped. It used to
      truncate quietly on existing rows while appending full-width
      rows below.</li>
    <li><strong>Wide-table safety.</strong> On tables past the
      grid's 512-column display cap the type-past-the-end column
      stays off, so typing there can never overwrite a column the
      grid was not showing.</li>
    <li><strong>An emptied table forgets its troubles.</strong>
      Emptying a table that had parse warnings resets the
      structure state, so the blank sheet accepts typing instead
      of refusing with a stale warning. Sorting an empty sheet now
      says there is nothing to sort.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.5.0: Power editing</title>
      <link>https://caxton.app/changelog#v1-5-0</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-5-0</guid>
      <pubDate>Mon, 17 Aug 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Power editing. The everyday depth that makes
  Caxton a daily driver: comments, brackets, snippets, completion,
  clipboard history, and per-file rules, plus a grid corner with
  Excel manners.</p>

  <h3>Power editing</h3>
  <ul>
    <li><strong>Comment anything.</strong> &#8984;/ toggles line
      comments across the selection as one undo step, language
      aware, markers in a straight column, blank lines untouched.
      &#8997;&#8984;/ wraps a block comment, and HTML routes
      &#8984;/ there automatically since it has no line
      marker.</li>
    <li><strong>Brackets behave.</strong> Typing a bracket or
      quote closes the pair with the caret between; typing the
      closer walks over it; backspace on a fresh pair removes
      both. Hand-typed closers are never swallowed and apostrophes
      stay single in prose. The matching bracket highlights at the
      caret, and Edit &#9656; Brackets jumps to, selects, deletes,
      or changes the surrounding pair.</li>
    <li><strong>Snippets with tab stops.</strong> Author them in
      Edit &#9656; Snippets: placeholders with defaults, mirrors
      that type in two places at once, date and filename
      variables. Type the abbreviation, press Tab, and walk the
      stops while they track your typing. Esc bails out. Malformed
      syntax passes through untouched; a snippet never eats
      text.</li>
    <li><strong>Complete from the document.</strong> &#8997;&#9099;
      lists identifiers from the file itself, frequency first, in
      a panel at the caret. No dictionary and no guessing, and the
      scan is bounded, so it is instant in a 10&nbsp;GB log.</li>
    <li><strong>Clipboard history.</strong> &#8679;&#8984;V shows
      everything you cut or copied in Caxton, searchable. Pin what
      you reuse; pins survive relaunch. It never reads the system
      pasteboard, entries over a megabyte are not kept, and copies
      from files that look like secrets (.env, key material) are
      never recorded. With several cursors, &#8997;Return spreads
      a matching multi-line entry one line per cursor.</li>
    <li><strong>Per-file rules.</strong> Glob patterns set wrap,
      tab width, encoding, and syntax at open: *.log opens
      unwrapped as a log, and the vendor who ships Shift-JIS every
      week just opens right. First match wins per setting.</li>
  </ul>

  <h3>The grid, with Excel manners</h3>
  <ul>
    <li><strong>The select-all corner.</strong> The header row's
      gutter cell carries the corner triangle and selects every
      data row. Delete then clears the data and keeps the header;
      on a headerless file it can honestly empty the table, one
      undo either way, and nothing is left active afterward.</li>
    <li><strong>Numbers that agree.</strong> With a header row,
      data starts at 1 in the gutter, the status bar, and
      VoiceOver alike; the header names itself.</li>
    <li><strong>Autofit reads the title.</strong> Double-click a
      divider and the column fits its header as well as its data.
      Several columns selected fits them all; everything selected
      fits the table.</li>
    <li><strong>A fuller toolbar catalog.</strong> Customize
      Toolbar now offers Quick Open, Commands, Clipboard, Go To
      Line, Find in Files, Word Wrap, Split, and Bookmark, and
      every tile shows its icon.</li>
  </ul>

  <h3>Fixed</h3>
  <ul>
    <li><strong>Fold chevrons on HTML files.</strong> Brace
      islands in a style block suppressed the indent chevrons for
      the whole file, while clicking where they belonged still
      folded. Detection now merges brace and indent regions, which
      is what the folding release promised.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.4.1: Grid edits used to rebuild the whole table</title>
      <link>https://caxton.app/changelog#v1-4-1</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-4-1</guid>
      <pubDate>Thu, 13 Aug 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Grid edits used to rebuild the whole table.
  Now they adjust it in place, so column work on big files is fast
  and the view stays where you left it. Six fixes from field
  reports round it out.</p>

  <h3>The grid stopped rebuilding</h3>
  <ul>
    <li><strong>Add Column is quick now.</strong> Adding, inserting,
      or deleting a column used to rewrite the whole file and parse
      it again. Caxton now makes one small edit per row and updates
      the table as it goes. On a million-row file, Add Column lands
      in under a second, and undo is still one step.</li>
    <li><strong>You keep your place.</strong> Adding rows, deleting
      rows, filling cells, and column edits no longer throw the
      grid back to the top. Sort and column moves still rebuild,
      but they put you back where you were when they finish.</li>
    <li><strong>Add a row from the gutter.</strong> The empty row
      past the end now shows a plus in the gutter. Click it and you
      get a fresh row with the first cell selected, ready to type.
      Typing straight into the empty row works like before.</li>
    <li><strong>Any delimited file opens in the grid.</strong> A
      file with real table structure goes straight to grid mode no
      matter the extension, so a tab-delimited .txt lands in the
      grid like a .tsv would. Tabs need only consistent columns;
      commas, semicolons, and pipes need near-perfect structure
      across the whole sample first, so logs and prose stay
      text.</li>
  </ul>

  <h3>Extract acts like a new document</h3>
  <ul>
    <li><strong>No more temp paths.</strong> Extract, match export,
      column extract, and streamed rewrites used to open with a
      temporary path in the title bar, and saving quietly wrote to
      that temp file. They now open as unsaved documents named for
      what made them, like &ldquo;server-log (filtered)&rdquo;, and
      the first save always asks where.</li>
    <li><strong>The right extension.</strong> A result extracted
      from a CSV saves as a CSV. The Save panel suggests the
      document&rsquo;s real extension instead of .txt.</li>
  </ul>

  <h3>Fixed</h3>
  <ul>
    <li><strong>A license could register the same Mac twice.</strong>
      Pressing Return while an activation was already running sent
      a second activation, and the key showed two devices for one
      Mac. Activation now locks while it runs, and entering a key
      this Mac already holds revalidates the existing seat instead
      of taking a new one. If a key of yours shows a duplicate
      device, write hello@caxton.app and we will clear it.</li>
    <li><strong>Opening from Finder flashed a blank window.</strong>
      A leftover window from the app template showed for a moment
      before the document appeared, longest on large files. It is
      gone.</li>
    <li><strong>Change markers below a deletion.</strong> Deleting
      lines marked every line after them in the gutter instead of
      only the seam. Only the seam carries the tick now.</li>
    <li><strong>The gutter behaves like a control.</strong> The
      pointer over the line-number gutter is an arrow instead of
      the text cursor, and clicking the gutter to select a line
      works while scrolled sideways.</li>
    <li><strong>Toolbar labels moved into the buttons.</strong>
      With Icon and Text on, each button in the pill shows its own
      name instead of one &ldquo;Actions&rdquo; caption under the
      whole group.</li>
    <li><strong>Filtering landed at the bottom.</strong> Applying
      a filter from deep in a file left the view clamped to the
      bottom of the shorter result. It now goes to the top of the
      results, and keeps your cursor in view when its line
      survives the filter.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.4.0: Navigation and shell</title>
      <link>https://caxton.app/changelog#v1-4-0</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-4-0</guid>
      <pubDate>Wed, 12 Aug 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Navigation and shell. Get anywhere in any file
  in a keystroke or two, work in more than one window at last, fold
  what you don&rsquo;t need, and see exactly what you&rsquo;ve
  changed since the last save.</p>

  <h3>Go anywhere</h3>
  <ul>
    <li><strong>Quick Open.</strong> &#8679;&#8984;O fuzzy-searches
      your open tabs, recent files, and every file your workspaces
      reference, with size, modified time, and path on every row.
      Picking an already-open file switches to it instead of
      reopening. No folder crawling, ever: the candidates are the
      files Caxton already knows about.</li>
    <li><strong>Go To grew three targets.</strong> &#8984;L still
      takes a line number; now <code>50%</code> jumps to the middle
      of the file (it works even while a huge file is still
      indexing), <code>b1234</code> lands on an exact byte without
      ever splitting a character, and <code>r1234</code> goes to a
      record when the document has one.</li>
    <li><strong>Change markers.</strong> Lines you&rsquo;ve edited
      since the last save carry an accent bar in the gutter;
      deletions leave a tick at the seam. &#8963;&#8984;&#8593; and
      &#8963;&#8984;&#8595; jump between changes, and Revert
      Selected Change puts the original bytes back as one undo
      step. Sorting a CSV marks moved rows honestly: marked, but
      revert points you at undo instead of guessing.</li>
  </ul>

  <h3>Windows, tabs, and folding</h3>
  <ul>
    <li><strong>More than one window.</strong> Drag a tab out of
      the strip (or Window&nbsp;&#9656;&nbsp;Move Tab to New
      Window) and it becomes its own window; drag it onto another
      window&rsquo;s tab row to move it there. Drag within the
      strip to reorder.</li>
    <li><strong>Pin and reopen.</strong> Right-click a tab to pin
      it: pinned tabs lead the row behind a pin glyph and lose
      their close button, so a stray click can&rsquo;t take them
      down. &#8679;&#8984;T reopens the last closed tab with its
      cursor, scroll position, and mode intact.</li>
    <li><strong>Folding.</strong> Indented regions and brace pairs
      fold from the gutter chevrons, the keyboard
      (&#8997;&#8984;&#8592; and friends), or Fold All, which runs
      as a cancellable job on big files. A folded anchor shows how
      many lines it hides; search hits and Go To targets inside a
      fold open it automatically. Braces inside strings and
      comments never fool it.</li>
  </ul>

  <h3>Workspaces that travel</h3>
  <ul>
    <li><strong>Relative paths and moved files.</strong> Workspaces
      remember their common folder, so a project that moves or
      mounts elsewhere still opens. A file that moved inside the
      project is found again by name, size, and modified time,
      with the search bounded so it can never crawl your disk.</li>
    <li><strong>Export and import.</strong> A workspace exports as
      a JSON file you can drop in the project folder or send to
      another Mac; importing resolves files against wherever the
      definition sits.</li>
  </ul>

  <h3>Looks and feel</h3>
  <ul>
    <li><strong>The gutter has its own plane now.</strong> In dark
      mode the gutter, tab bar, and status bar share one chrome
      tone with a clean separator against the editing surface, in
      both the text view and the grid.</li>
    <li><strong>A real toolbar pill.</strong> Find, Filter, and
      CSV live together in a single capsule, Safari-style, and the
      Find button now closes the bar on a second click. Document
      tabs are larger and stand out from the bar.</li>
    <li><strong>Recovered new documents behave.</strong> A new
      document restored after a crash is still called
      &ldquo;Untitled&rdquo; and saving it always asks where, so a
      temp path never leaks into your face.</li>
    <li><strong>Crash loops break themselves.</strong> If two
      launches in a row die while restoring the previous session,
      Caxton offers to start without restoring; the session is
      kept either way.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.3.1: Two crash fixes from field crash reports</title>
      <link>https://caxton.app/changelog#v1-3-1</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-3-1</guid>
      <pubDate>Thu, 06 Aug 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Two crash fixes from field crash reports. Both
  are in the release gate now, so they stay fixed.</p>
  <h3>Fixed</h3>
  <ul>
    <li><strong>A disk that vanishes no longer takes Caxton with
      it.</strong> If a file&rsquo;s storage stopped answering
      while Caxton was reading it (a network drive dropping off,
      an external drive ejected, a cloud file evicted from local
      storage), the app crashed, and since the next launch
      reopened the same file, it crashed again. Unreachable bytes
      now read as empty, the app stays up, and the changed-on-disk
      prompt handles the rest.</li>
    <li><strong>Sorting a CSV with a column selected.</strong>
      With a header row on and a whole column selected, the
      selection statistics could catch the grid mid-rebuild right
      after a sort and crash. They now sit out the rebuild.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.3.0: Search everywhere</title>
      <link>https://caxton.app/changelog#v1-3-0</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-3-0</guid>
      <pubDate>Mon, 03 Aug 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Search everywhere. One release for the find
  side of the house: replace hundreds of things at once, work the
  results like data, and search whole folders honestly.</p>

  <h3>Batch Replace</h3>
  <ul>
    <li><strong>Hundreds of find/replace pairs, one run.</strong>
      Edit&nbsp;▸&nbsp;Find&nbsp;▸&nbsp;Batch Replace… holds a pairs
      list with per-pair case, whole-word, and regex options. Two
      modes, stated plainly in the panel: one pass (every pair
      matches the original text, overlaps go to the earlier pair,
      one undo step) or in order (each pair sees the previous
      pair's output, one undo step per pair).</li>
    <li><strong>Per-pair results.</strong> Every row reports found,
      replaced, and dropped counts after a run; a bad regex in one
      pair never stops the others.</li>
    <li><strong>Pair lists travel.</strong> Import and export as
      CSV or TSV; save named presets, mode included. Apply to one
      document or every open document.</li>
  </ul>

  <h3>Find All results</h3>
  <ul>
    <li><strong>Group and sort.</strong> Group matches by regex
      capture value or by CSV column; sort by match text. Grouping
      caps at 100,000 matches and says so.</li>
    <li><strong>Filter to Matches</strong> routes the search query
      into the filter bar in one click; <strong>Export</strong>
      writes grep-style numbered lines to a new document.</li>
    <li><strong>Saved searches.</strong> Named presets with the
      full option set and replacement text, plus JSON import and
      export for moving them between Macs.</li>
  </ul>

  <h3>Find in Files</h3>
  <ul>
    <li><strong>Filename patterns</strong> (<code>*.log; *.csv</code>),
      an All Open Documents scope, and a skip report: files over
      the 50&nbsp;MB scan cap, binary files, and unreadable files
      are listed, never silently omitted.</li>
    <li><strong>UTF-16 files are searched now</strong> (they
      previously matched nothing), and a very long single line no
      longer produces wrong line numbers; literal matches on such
      lines are exact at any length.</li>
    <li><strong>Replace across files</strong>, carefully: a preview
      with per-file counts before anything is touched, .bak backups
      on by default, atomic writes, and a report covering every
      file skipped and why. Documents open in Caxton are left to
      Batch Replace.</li>
  </ul>

  <h3>Fixed</h3>
  <ul>
    <li><strong>The grid never shows shifted data after a bulk
      edit.</strong> A big fill, paste, or its undo could briefly
      paint columns misaligned while the index caught up. The index
      now rebuilds before the repaint; what you see during the
      catch-up is honest progressive loading.</li>
    <li><strong>Undo after a partially-applied bulk edit is exact.</strong>
      Internal replacements that overlap now drop cleanly and never
      leave a wrong undo record.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.2.1: A quick polish pass from field reports, same day</title>
      <link>https://caxton.app/changelog#v1-2-1</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-2-1</guid>
      <pubDate>Thu, 30 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">A quick polish pass from field reports, same day.</p>
  <h3>Fixed</h3>
  <ul>
    <li><strong>Panels open where you are.</strong> The advanced
      filter, Fill Series, and friends now appear centered over your
      document window instead of wherever the screen felt like,
      and a panel you reposition stays where you put it.</li>
    <li><strong>The unsaved-changes dot is instant.</strong> Editing
      a cell in the grid marks the window and tab modified
      immediately, not after switching modes.</li>
    <li><strong>The CSV menu opens instantly.</strong> With a cell
      selected in a dense file, menu validation was scanning up to
      200,000 rows to decide whether Fill Down should be enabled.
      It now checks exactly one.</li>
  </ul>
  <h3>Added</h3>
  <ul>
    <li><strong>Does Not Contain</strong> in the Advanced
      Filter&rsquo;s match menu, and with the <em>any column</em>
      scope it means what you&rsquo;d hope: no field contains the
      text.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.2.0: The grid, finished</title>
      <link>https://caxton.app/changelog#v1-2-0</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-2-0</guid>
      <pubDate>Thu, 30 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">The grid, finished. Table Mode grows the column
  tools, filters, and sorts a working data editor needs, and a
  cell editor that can finally show you everything in a cell.</p>

  <h3>Columns &amp; navigation</h3>
  <ul>
    <li><strong>Hide and freeze columns.</strong> CSV&nbsp;▸&nbsp;Hide
      Column tucks columns out of view (data and operations still
      include them, Excel semantics); Freeze Columns pins the
      first one to three (or up to the selected column) during
      horizontal scroll. Auto-Fit All Columns sizes everything to
      content.</li>
    <li><strong>Go to Cell.</strong> Cmd+L in the grid accepts
      <code>5000</code> or <code>5000:12</code> and lands on the exact
      cell, header-aware, honest when a row filter hides the
      target.</li>
    <li><strong>Selection statistics.</strong> Select a block of cells
      and the status bar shows count, sum, average, numeric and blank
      tallies, computed off the main thread, capped honestly on
      giant selections.</li>
    <li><strong>Header tools.</strong> Promote any row to the header,
      Rename Column&hellip; edits a header name in place, and Add
      Header Row generates Column1&hellip;ColumnN placeholders above
      headerless data, each one undoable.</li>
  </ul>

  <h3>Sorting &amp; filtering</h3>
  <ul>
    <li><strong>Typed sorts.</strong> Sort Rows now understands six
      interpretations: Text, Text (case-sensitive bytes),
      Natural (Finder-style, &ldquo;file2&rdquo; before
      &ldquo;file10&rdquo;), Numeric, Currency (symbols and thousands
      separators stripped, accounting parentheses read as negative),
      and Date. Currency columns are detected automatically for
      header-click sorts.</li>
    <li><strong>Sort presets.</strong> Save a sort configuration under
      a name and re-apply it from the dialog&rsquo;s Preset menu.</li>
    <li><strong>Filter by Column Values.</strong> The Excel-style
      value browser: every distinct value in a column with its count,
      searchable, with checkboxes, check what you want to see
      and apply.</li>
    <li><strong>Right-click quick filters.</strong> Filter to a
      cell&rsquo;s value, exclude it, or filter greater/less than a
      numeric value, one click from any cell.</li>
    <li><strong>Greater Than / Less Than conditions.</strong> The
      advanced filter&rsquo;s match menu grew numeric comparisons
      alongside Contains and Equals.</li>
    <li><strong>Filters play fair.</strong> The text filter bar and
      CSV row filters used to silently overwrite each other&rsquo;s
      view; now the last one applied wins, a banner says what
      happened, and clearing one hands the view back to the
      other.</li>
  </ul>

  <h3>Cell editing &amp; CSV fidelity</h3>
  <ul>
    <li><strong>Full-value cell editor.</strong> Multiline and long
      values open in a real editor sheet instead of a read-only
      popover, edit the decoded value with quoting handled for
      you, or flip to Raw to see and edit the stored bytes exactly as
      they are in the file. Cmd+Return saves, Esc cancels.</li>
    <li><strong>Ragged rows, visible and fixable.</strong> Cells a
      short row doesn&rsquo;t actually have are drawn dimmed;
      editing one materializes it, padding the row out to that
      column.</li>
    <li><strong>Fidelity verbs.</strong> Quote All Cells, Remove
      Unnecessary Quotes, and Normalize Column Count&hellip; (pads
      short rows; optionally trims surplus cells), each a
      single undoable rewrite that never touches rows with quoting
      problems. Plus Convert Fixed-Width to Columns&hellip;: split a
      fixed-width text file into a delimited document at the
      character widths you give, with a live preview, at any file
      size.</li>
    <li><strong>CR-only CSV files open in the grid.</strong>
      Classic-Mac line endings no longer stop CSV detection.</li>
    <li><strong>Column settings follow their columns.</strong> Widths,
      hidden flags, and sort choices now travel with a column through
      moves, inserts, deletes, splits, and combines instead of
      sticking to positions.</li>
  </ul>
  <p class="relnote">Caxton remains signed and notarized by Apple,
  with Hardened Runtime enabled; updates install automatically.</p>]]></description>
    </item>
    <item>
      <title>Caxton 1.1.1: A Table Mode and editor-feel batch: one advanced filter that follows your mode, numbered columns for headerless files, whole-column operations, a caret you can find, and windows that open ready to work</title>
      <link>https://caxton.app/changelog#v1-1-1</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-1-1</guid>
      <pubDate>Mon, 27 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">A Table Mode and editor-feel batch: one advanced
  filter that follows your mode, numbered columns for headerless
  files, whole-column operations, a caret you can find, and windows
  that open ready to work.</p>

  <h3>Table Mode</h3>
  <ul>
    <li><strong>One Advanced Filter, everywhere.</strong> The filter
      bar&rsquo;s expand button and the menus now open a single
      advanced filter that matches your mode: in the text view,
      multi-condition line filtering as before; in the grid, row
      filtering where each condition targets the <em>whole line</em>,
      any column, or one specific column, with Contains/Equals,
      match case, ≠ exclude, and and/or chaining (AND binds tighter
      than OR). Whole-line conditions test the raw record, a
      query containing a comma can match across fields, which
      per-column filtering can&rsquo;t. The panel keeps your
      conditions between opens so a filter can be tweaked and
      re-run.</li>
    <li><strong>Numbered columns without a header row.</strong> With
      First Row Is Header off, the grid now shows a frozen numbered
      band (1, 2, 3&hellip;, EmEditor-style): click it to
      select a column, drag to select several, resize and sort on it
      exactly like a real header. Dialogs use the same numbers, so
      &ldquo;column 3&rdquo; means the same thing everywhere.</li>
    <li><strong>Whole-column selection enables column
      operations.</strong> Clicking a column header no longer greys
      out the CSV menu: Insert/Delete/Move/Split/Combine Column,
      Extract Column, and Count Frequent all work from a column
      selection, and the sort and filter dialogs preselect that
      column. Row operations still ask for a cell, a column
      has no anchor row.</li>
  </ul>

  <h3>Editor feel</h3>
  <ul>
    <li><strong>The caret blinks.</strong> Standard cadence, solid
      the instant you type or move, steady when a pane isn&rsquo;t
      focused, and much easier to find in a wall of
      text.</li>
    <li><strong>Option+Shift+Click places cursors on every line
      between.</strong> Click one spot, Option+Shift+Click another:
      the column selection sweeps the whole span, the click
      version of the Option+Drag you already have.</li>
    <li><strong>Line numbers are readable in Dark.</strong>
      Near-white, matching the status bar, no more squinting
      at slate-on-slate.</li>
    <li><strong>Tabs show the whole filename.</strong> No more
      mid-name cutoff; tabs only compress when the strip truly runs
      out of room.</li>
    <li><strong>Documents open filling the screen</strong> (the
      regular kind of full, menu bar and Dock stay). The
      welcome window keeps its compact size.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.1.0: Word wrap, finally, plus a full text toolbox: structural selection, line surgery, case and whitespace tools, numeric editing, escapes and hashes, and honest statistics</title>
      <link>https://caxton.app/changelog#v1-1-0</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-1-0</guid>
      <pubDate>Sun, 26 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Word wrap, finally, plus a full text toolbox:
  structural selection, line surgery, case and whitespace tools, numeric
  editing, escapes and hashes, and honest statistics. Four feature waves,
  each gate-checked against the release before it.</p>

  <h3>Word wrap</h3>
  <ul>
    <li><strong>Soft wrap is here.</strong> View &#9656; Word Wrap (&#8997;&#8984;W)
      wraps at the window edge or a fixed column (80/100/120, with a
      guide line), with &#8618; continuation markers in the gutter,
      visual indent on wrapped rows, and full syntax color, selection,
      marker, and input-method overlays under wrap.</li>
    <li><strong>Built for big files.</strong> Wrap stays responsive on
      multi-gigabyte documents; a pathologically long line (hundreds of
      KB without a break) opts out with an &#8596; marker instead of
      stalling the window.</li>
    <li><strong>Arrows, Home/End, clicks, and the caret think in visual
      rows</strong> when wrap is on, including under filters and
      in split view, where each pane wraps to its own width.</li>
    <li><strong>Large grid fills got faster along the way</strong>
     , building wrap surfaced a shipped double-refresh in the
      CSV grid, now removed.</li>
  </ul>

  <h3>Selection &amp; navigation</h3>
  <ul>
    <li><strong>Expand / Contract Selection (&#8963;&#8679;&#8984;&#8594; /
      &#8963;&#8679;&#8984;&#8592;)</strong> grows the selection
      structurally, word, dotted token, quoted string, brackets,
      line, paragraph, and steps back exactly.</li>
    <li><strong>Word-wise everything:</strong> &#8997;&#8592;/&#8594;
      moves by word, &#8997;-deletes remove a word at a time, and
      &#8984;-deletes clear to the ends of the visual row, all
      multi-cursor aware.</li>
    <li><strong>Empty files show their caret.</strong> A 0-byte document
      now has a line 1 like every other file.</li>
  </ul>

  <h3>Lines &amp; paragraphs</h3>
  <ul>
    <li><strong>Text &#9656; Lines:</strong> duplicate (&#8679;&#8984;D),
      delete (&#8679;&#8984;K), copy, move up/down
      (&#8997;&#8984;&#8593;&#8595;), join (&#8963;J), split at a
      delimiter, shuffle, remove empty, keep only duplicates,
      indent/outdent (&#8984;] / &#8984;[), number lines, add
      prefix/suffix. Duplicates and moves are byte-exact, even on
      lines containing invalid UTF-8.</li>
    <li><strong>Text &#9656; Paragraphs:</strong> hard wrap to a column,
      reflow paragraphs, unwrap paragraphs, quote and comment
      prefixes are kept on every wrapped line, and a list dash
      isn&rsquo;t multiplied into new bullets.</li>
  </ul>

  <h3>Case, whitespace &amp; numbers</h3>
  <ul>
    <li><strong>Case:</strong> Sentence case, Toggle case, and identifier
      conversions, camelCase, PascalCase, snake_case, kebab-case,
      CONSTANT_CASE, dot.case, space case.</li>
    <li><strong>Whitespace:</strong> trims, collapse repeated spaces,
      convert non-breaking spaces, tabs &#8596; spaces, normalize
      indentation, detect mixed indentation, plus a configurable
      tab width (2/3/4/8) the editor actually renders with.</li>
    <li><strong>Show Invisibles</strong> (View menu): faint marks for
      spaces, tabs, and line ends, with non-breaking and zero-width
      characters highlighted, the classic invisible-diff
      culprits from PDFs and web copy-paste.</li>
    <li><strong>Numbers:</strong> increment/decrement every number in a
      selection, arithmetic on all of them, zero-padding, base
      conversion (2/8/10/16), and a sum / count / average readout.
      Padded columns keep their shape, 007&nbsp;+&nbsp;1 is
      008.</li>
  </ul>

  <h3>Escapes, hashes &amp; dates</h3>
  <ul>
    <li><strong>Escapes:</strong> HTML entities, XML, JSON strings (full
      surrogate handling, malformed input is refused, never
      mangled), hex, \uXXXX Unicode escapes, ROT13, and Unicode
      normalization (NFC/NFD/NFKC/NFKD).</li>
    <li><strong>Hash a selection</strong>: SHA-256, SHA-512,
      SHA-1, MD5, shown in a panel with a Copy button, never
      replacing your text.</li>
    <li><strong>Insert Date/Time:</strong> six stable formats (ISO 8601
      local and UTC, epoch seconds, and friends) that never depend on
      the display locale, inserted at every cursor.</li>
  </ul>

  <h3>Statistics &amp; fixes</h3>
  <ul>
    <li><strong>Text &#9656; Statistics:</strong> bytes, characters,
      Unicode scalars, words, lines, paragraphs, sentences, blank and
      unique lines, longest and average line, reading time, and an
      indentation report, for the document or the selection.</li>
    <li><strong>Word Count now counts CRLF files correctly.</strong>
      Windows-style documents reported one line no matter their
      size.</li>
    <li><strong>A bulk edit that grows the file no longer truncates line
      tracking.</strong> A growing Replace All or a large multi-cursor
      edit could leave line numbers and navigation stuck at the old
      file size until the next save.</li>
    <li><strong>Text transforms refused during a save say so</strong>
     , instead of reporting &ldquo;applied&rdquo; for an edit
      that never landed.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.0.7: A trust release: what Caxton tells you is now always what actually happened</title>
      <link>https://caxton.app/changelog#v1-0-7</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-0-7</guid>
      <pubDate>Sat, 25 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">A trust release: what Caxton tells you is now always
  what actually happened. Dozens of small fixes across saving, search,
  the CSV grid, and the menus.</p>

  <h3>Saving &amp; recovery</h3>
  <ul>
    <li><strong>Quit waits for an in-flight save.</strong>
      &ldquo;Quit Anyway&rdquo; answers the unsaved-changes question
     , it no longer aborts a save that&rsquo;s still streaming to
      disk.</li>
    <li><strong>Anything refused during a save says so.</strong> Sorts,
      delimiter conversions, row and line deletes, cell edits, and
      multi-cursor typing that land while a save is writing now show
      &ldquo;unavailable while saving&rdquo; instead of reporting
      success that didn&rsquo;t happen.</li>
    <li><strong>Crash-recovery data is safer.</strong> It moved out of
      the purgeable system cache into Application Support, survives a
      failed restore instead of being deleted with it, and is kept when
      a file&rsquo;s volume is simply unplugged.</li>
    <li><strong>Cell edits during a long save queue up</strong>:
      tabbing across several cells no longer keeps only the last
      one.</li>
  </ul>

  <h3>Fresh data, honest dialogs</h3>
  <ul>
    <li><strong>Sort, dedupe, row filters, and bookmark/pattern line
      deletes re-check the file after their dialogs.</strong> If the
      document changed underneath (a growing log, an external reload),
      the operation asks you to run it again instead of applying stale
      coordinates.</li>
    <li><strong>The CSV grid stops painting stale rows</strong> while it
      rebuilds after bulk operations, and if a reloaded file no
      longer parses as CSV, Caxton returns to the text view honestly
      instead of keeping the old grid on screen.</li>
    <li><strong>Structure problems now block single-cell edits too</strong>
     , the same rule every bulk operation already followed.</li>
  </ul>

  <h3>Search &amp; filter</h3>
  <ul>
    <li><strong>Wrap Around now means it</strong>: with the toggle
      off, Next stops at the last match instead of looping.</li>
    <li><strong>A reopened find bar searches again.</strong> Closing the
      bar with &#x2715; and reopening left Return doing nothing.</li>
    <li><strong>Regex <code>(?i)</code> patterns find everything</strong>
      under Match Case, a fast-path filter was silently dropping
      matches.</li>
    <li><strong>Searches started during indexing finish the job</strong>
     , they re-run automatically when indexing completes, same as
      filters since 1.0.6.</li>
    <li><strong>Replace with <code>$1</code> captures never inserts the
      literal template</strong>: a site that can&rsquo;t be
      re-verified is skipped, with an honest count.</li>
    <li><strong>Entire-file filter scans report failures</strong> instead
      of presenting an empty result as &ldquo;no matches,&rdquo;
      cancelling one from the Jobs panel no longer freezes the filter
      bar, and closing a window stops its background scan.</li>
  </ul>

  <h3>Editing &amp; menus</h3>
  <ul>
    <li><strong>Edit &#9656; Delete and File &#9656; Revert to Saved
      work now.</strong> (Revert deliberately has no shortcut;
      ⌘R belongs to CSV Fill Right.)</li>
    <li><strong>Menus enable truthfully</strong>: no more
      clickable Undo with nothing to undo, or Paste on a read-only
      file.</li>
    <li><strong>Home, End, ⌘↑ and ⌘↓ clear extra cursors</strong> like
      the arrow keys always did.</li>
    <li><strong>Filtered-out lines can&rsquo;t be edited blind</strong>
     , a cursor stranded inside hidden lines refuses to type
      into content you can&rsquo;t see.</li>
    <li><strong>Chinese and Japanese input compose correctly</strong>
     , the candidate highlight landed on the wrong characters
      for all non-ASCII composition.</li>
    <li><strong>Markers on very long lines no longer tank the frame
      rate</strong>, and the diagnostics overlay is off by default
      (View &#9656; Diagnostics Overlay brings it back).</li>
  </ul>

  <h3>Files</h3>
  <ul>
    <li><strong>Empty files open.</strong> A freshly-created 0-byte file
      no longer shows &ldquo;Could not open, file is
      empty.&rdquo;</li>
    <li><strong>Format XML preserves your data</strong>:
      <code>&gt;</code> inside attribute values, comments, and CDATA no
      longer splits the document.</li>
    <li><strong>External truncation mid-operation can&rsquo;t spin or
      crash</strong>: indexing stops cleanly and sorting
      tolerates the shorter file.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.0.6: Crash recovery and external-change handling, hardened end to end, plus safer giant edits and exact indexing in two rare corners</title>
      <link>https://caxton.app/changelog#v1-0-6</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-0-6</guid>
      <pubDate>Fri, 24 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Crash recovery and external-change handling, hardened
  end to end, plus safer giant edits and exact indexing in two rare
  corners.</p>

  <h3>Crash recovery</h3>
  <ul>
    <li><strong>Recovered edits survive every path.</strong> Choosing
      Restore used to delete the recovery data immediately, if the
      open was then cancelled, failed, or landed read-only, the edits were
      gone for good. Recovery data now survives until your restored work is
      safely re-protected, cancelling says &ldquo;Recovery postponed,&rdquo;
      and relaunching by double-clicking the crashed file in Finder no
      longer skips the restore.</li>
  </ul>

  <h3>Files changed outside Caxton</h3>
  <ul>
    <li><strong>Safe-saves from other apps are recognized as changes, not
      deletions.</strong> Most editors (and tools like rsync) save by
      writing a new file over the old one, Caxton misread that as
      &ldquo;file was deleted&rdquo; and stopped watching. It now reloads
      (or asks, if you have unsaved edits) and keeps watching the new
      file.</li>
    <li><strong>&ldquo;Keep Mine&rdquo; now really means it.</strong>
      After keeping your version over an external change, Save used to
      fail forever with &ldquo;the file changed on disk.&rdquo; Keeping
      your version now authorizes exactly that overwrite, the next
      Save writes your version, once.</li>
    <li><strong>Moved or renamed files are reported honestly</strong>
     , a clear banner instead of silence, with your content intact
      and Save re-creating the file at its original path.</li>
  </ul>

  <h3>Editing</h3>
  <ul>
    <li><strong>Very large edits warn before becoming non-undoable.</strong>
      Deleting or typing over a selection past the undo memory cap now asks
      first, same as large pastes always have, instead of
      silently losing undo (and briefly doubling memory) after the
      fact.</li>
    <li><strong>Sorting or deduplicating very large CSVs streams to a new
      document</strong> instead of holding the whole reordered file in
      memory, same policy the other big-file transforms already
      follow, original untouched.</li>
    <li><strong>Filters started while a file is still indexing now finish
      the job</strong>: the filter re-runs automatically when
      indexing completes, so matches always cover the whole file.</li>
    <li><strong>Line-index exactness</strong> in two corners: typing at the
      very end of a file after a final newline now registers the new last
      line, and edits made while a huge file is still being indexed can no
      longer skew the line offsets that indexing produces.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.0.5: A reliability release: a batch of CSV grid correctness fixes, safer find &amp; replace, and tougher handling of non-UTF-8 files</title>
      <link>https://caxton.app/changelog#v1-0-5</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-0-5</guid>
      <pubDate>Thu, 23 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">A reliability release: a batch of CSV grid correctness
  fixes, safer find &amp; replace, and tougher handling of non-UTF-8 files.</p>

  <h3>CSV grid</h3>
  <ul>
    <li><strong>Excel/Windows CSV exports with a quoted last column could
      open in a degraded state</strong>: every row flagged malformed,
      CSV editing disabled. The parser now reads the CRLF line ending
      correctly after a closing quote.</li>
    <li><strong>Fill and copy no longer use the display version of a
      cell.</strong> Values over 1,000 characters or containing embedded
      newlines were written back truncated (with a trailing &hellip;) or
      with ↵ standing in for the newline. Both now read the exact stored
      value.</li>
    <li><strong>Grid stability:</strong> cell edits committed while a save
      or a background parse was still running could knock the grid&rsquo;s
      row map out of sync (the same family as 1.0.3&rsquo;s undo fix);
      they now apply the moment it&rsquo;s safe. Undo during a save says so
      instead of guessing. Keyboard focus can no longer land on the hidden
      raw-text view after a dialog or app switch. Fixed a crash when find
      navigation landed on a field beyond the displayed columns of a
      ragged row.</li>
    <li><strong>⇧⌘C now toggles Grid View</strong>, as the docs always
      said, a leftover Show Colors menu item was swallowing the
      shortcut.</li>
  </ul>

  <h3>Find &amp; Replace</h3>
  <ul>
    <li><strong>Replace All always acts on the current query.</strong>
      Clicked in the moment between typing a new query and its search
      finishing, it could operate on the previous query&rsquo;s results.
      It now searches first and replaces exactly what you asked for.</li>
    <li><strong>Results reset when the file reloads.</strong> After an
      external change or log rotation, old results could linger with
      outdated positions, and Replace could edit the wrong bytes.
      Results now clear and the search re-runs automatically.</li>
    <li><strong>Byte-exact matches on lines with invalid UTF-8.</strong>
      Matches after an invalid byte reported skewed positions; replacing
      at those positions could corrupt surrounding bytes.</li>
  </ul>

  <h3>Non-UTF-8 files</h3>
  <ul>
    <li><strong>A disk read error is no longer mistaken for the end of the
      file.</strong> Opening could silently show a truncated document;
      saving could write a truncated copy over the original. Both now stop
      with an error instead.</li>
    <li><strong>Mis-detected files are no longer unopenable.</strong>
      Encoding detection samples the first 256&nbsp;KB; a wrong guess used
      to dead-end with an error. Caxton now offers to open the file as
      Windows-1252 so you can switch encodings once it&rsquo;s open.</li>
    <li><strong>Follow tail is disabled for converted (non-UTF-8)
      documents</strong> instead of appending garbled bytes to the view.</li>
  </ul>

  <h3>New</h3>
  <ul>
    <li><strong>Caxton&nbsp;▸&nbsp;Automatically Check for Updates</strong>
     , a menu toggle for Sparkle&rsquo;s automatic update checks,
      as described in the privacy policy.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.0.4: Two important correctness fixes, one in the fast save path, one in how large UTF-16 files are opened</title>
      <link>https://caxton.app/changelog#v1-0-4</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-0-4</guid>
      <pubDate>Tue, 21 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Two important correctness fixes, one in the fast
  save path, one in how large UTF-16 files are opened. Recommended for
  everyone.</p>

  <h3>Fixed</h3>
  <ul>
    <li><strong>Save could skip the changes made by a bulk operation.</strong>
      When everything unsaved came from bulk edits, Replace All, CSV
      grid operations, multi-cursor typing, the quick in-place save
      could report success without actually writing those changes to the
      file. Bulk edits now save byte-for-byte, verified against the file on
      disk before and after writing. (Same-length Replace All also now gets
      the fast save path it was always meant to have.)</li>
    <li><strong>Large UTF-16 files could turn to garbage partway
      through.</strong> If an emoji or other 4-byte character sat exactly
      astride an internal 4&nbsp;MB read boundary, every character after it
      decoded wrong. The converter now keeps UTF-16 code units aligned
      across boundaries, and an incomplete character at the very end of a
      file shows as a replacement character instead of silently
      disappearing.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.0.3: Fill and Fill Series in the CSV grid, rebuilt from the ground up, plus a fix for an undo bug that could make grid data appear shifted into the wrong columns</title>
      <link>https://caxton.app/changelog#v1-0-3</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-0-3</guid>
      <pubDate>Fri, 17 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Fill and Fill Series in the CSV grid, rebuilt from the
  ground up, plus a fix for an undo bug that could make grid data appear
  shifted into the wrong columns.</p>

  <h3>Fill, done right</h3>
  <ul>
    <li><strong>Fill Series dialog</strong> (right-click&nbsp;▸&nbsp;Fill
      Series…), linear and growth series, dates and times (days,
      weekdays, weeks, months, quarters, years, hours, minutes, seconds),
      text-plus-number patterns like <code>Item01</code>, weekday and month
      name lists, or repeat the selection as-is. Terminate by selection,
      count, or stop value; optionally fill only empty cells. A live preview
      shows exactly what will be written before you commit.</li>
    <li><strong>The fill handle now drags in all four directions</strong>,
      with a live summary of what it will do (&ldquo;Fill 1,234 cells &middot;
      Linear series, step 5&rdquo;). Hold ⌥ to copy instead of extending a
      series, and use the options chip afterwards to switch between Auto,
      Copy, and Repeat.</li>
    <li><strong>Fill Down ⌘D, Fill Up, Fill Right ⌘R, Fill Left</strong> in
      the CSV menu and the right-click menu, straight copies of the
      selection edge, Excel-style.</li>
    <li><strong>Smarter, safer AutoFill.</strong> Dates continue by their real
      calendar rules (Jan&nbsp;31 → Feb&nbsp;28 → Mar&nbsp;31; Feb&nbsp;29
      returns in the next leap year), <code>Item007</code> counts up without
      losing its padding, <code>1.50, 2.00</code> keeps two decimals, and
      decimal math is exact, never <code>0.30000000000000004</code>.
      A single number copies instead of incrementing, and irregular values
      repeat as a pattern instead of inventing a trend.</li>
    <li>Very large fills report how many cells they will replace before
      running; every fill is one undo step.</li>
  </ul>

  <h3>Fixed</h3>
  <ul>
    <li><strong>Undo in the grid could show data shifted into the wrong
      columns</strong> after a find-bar replace or a quick series of edits.
      The file&rsquo;s bytes were never corrupted, the grid&rsquo;s map
      of row boundaries could go stale and freeze that way. The grid now
      re-checks its map before every undo, redo, and cell commit.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.0.2: A maintenance release that fixes automatic updates and removes a needless restriction on which files Caxton can recover</title>
      <link>https://caxton.app/changelog#v1-0-2</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-0-2</guid>
      <pubDate>Thu, 16 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">A maintenance release that fixes automatic updates and
  removes a needless restriction on which files Caxton can recover.</p>

  <h3>Fixed</h3>
  <ul>
    <li><strong>Automatic updates now install correctly.</strong> Earlier builds
      could detect an update but failed at the last step with
      &ldquo;An error occurred while launching the installer.&rdquo; Caxton now
      updates itself cleanly through Caxton&nbsp;▸&nbsp;Check for Updates….</li>
    <li><strong>Crash recovery works for files anywhere on your Mac</strong>,
      including network drives and external volumes, not just files inside the
      app&rsquo;s former sandbox container.</li>
  </ul>
  <p class="relnote">Caxton remains signed and notarized by Apple, with Hardened
  Runtime enabled. If you are still on 1.0.0 or 1.0.1, this is a one-time manual
  update: <a data-analytics="changelog-archive" href="download">download the
  current version</a> and drag it over the copy in your Applications folder.
  Future updates install automatically.</p>]]></description>
    </item>
    <item>
      <title>Caxton 1.0.1: A quality pass focused on the CSV grid and a network-drive save fix, plus a few desktop-app niceties</title>
      <link>https://caxton.app/changelog#v1-0-1</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-0-1</guid>
      <pubDate>Thu, 16 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">A quality pass focused on the CSV grid and a network-drive
  save fix, plus a few desktop-app niceties.</p>

  <h3>Fixed</h3>
  <ul>
    <li><strong>Saving to a network drive</strong> no longer fails with a false
      &ldquo;not enough disk space.&rdquo; The pre-save space check misread free
      space on SMB/NFS/AFP shares; it now proceeds and reports a real error only
      if the volume is genuinely full.</li>
    <li><strong>The CSV grid refreshes after Replace&nbsp;All</strong> (and other
      bulk edits) instead of showing stale cells until you switched views.</li>
    <li>Large delete-lines operations now tell you honestly whether they can be
      undone on your Mac, matching Replace&nbsp;All.</li>
  </ul>

  <h3>CSV grid, spreadsheet editing</h3>
  <ul>
    <li><strong>Select ranges</strong>: drag across cells, or Shift-click to
      extend a selection of cells, rows, or columns.</li>
    <li><strong>Resize columns</strong> by dragging the header border; double-click
      the border to auto-fit to content.</li>
    <li><strong>Fill</strong>: drag the fill handle to copy a value or extend a
      number series; double-click it to fill down; right-click for Fill Down /
      Fill Series.</li>
    <li><strong>Paste blocks</strong> from Excel or Sheets straight into the grid
      (no need to open a cell first); paste a single value to fill a selection.</li>
    <li><strong>Delete</strong>: a selected row or column is removed; selected
      cells are cleared. All one undo step.</li>
    <li><strong>Rename a column</strong> by double-clicking its header, and
      <strong>reorder</strong> rows or columns by dragging them.</li>
  </ul>

  <h3>Desktop app</h3>
  <ul>
    <li>Closing the last window now returns to the launcher instead of forcing a
      blank new document.</li>
    <li>Wider default window, sized to your screen.</li>
    <li>The About panel shows version and build details.</li>
    <li>Now runs on macOS 13 (Ventura) and later, on both Apple Silicon and Intel.</li>
    <li>Shift-clicking a line number in the text editor extends the selection to
      every line in between.</li>
  </ul>]]></description>
    </item>
    <item>
      <title>Caxton 1.0.0: Initial release, a native macOS editor built for files that break other editors: memory-mapped, fully indexed, 10 GB logs and CSVs open in seconds</title>
      <link>https://caxton.app/changelog#v1-0-0</link>
      <guid isPermaLink="true">https://caxton.app/changelog#v1-0-0</guid>
      <pubDate>Wed, 15 Jul 2026 09:00:00 -0400</pubDate>
      <description><![CDATA[<p class="relnote">Initial release, a native macOS editor built for files that
  break other editors: memory-mapped, fully indexed, 10&nbsp;GB logs and CSVs open
  in seconds.</p>
  <ul>
    <li>Find, filter, and Replace&nbsp;All at multi-gigabyte scale.</li>
    <li>CSV workbench: sort, dedupe, frequency, column operations.</li>
    <li>Live tail with follow, bookmarks, color markers, multi-cursor, split view.</li>
    <li>Crash recovery and power-loss-durable saves.</li>
    <li>7-day trial; licensed via <a href="pricing">caxton.app</a>.</li>
  </ul>]]></description>
    </item>
  </channel>
</rss>
