<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>what's new - twilight ventures</title>
  <subtitle>The newest change note of every twilight ventures product, newest first.</subtitle>
  <id>https://twilightventures.dev/whats-new/</id>
  <link rel="alternate" type="text/html" href="https://twilightventures.dev/whats-new/"/>
  <link rel="self" type="application/atom+xml" href="https://twilightventures.dev/feed.xml"/>
  <updated>2026-09-14T00:00:00Z</updated>
  <author><name>twilight ventures</name></author>
  <entry>
    <title>XLSX Lens 1.5.0</title>
    <id>tag:twilightventures.dev,2026:whats-new/xlsx-lens/1.5.0</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/xlsx-lens/"/>
    <published>2026-09-14T00:00:00Z</published>
    <updated>2026-09-14T00:00:00Z</updated>
    <summary>published 2026-09-14</summary>
    <content type="html">&lt;p&gt;The sheet's own conditional formatting paints in the grid: a cell value rule, the text rules, blanks and errors, duplicate and unique values, top and bottom rank, above and below average, each with the fill and the font colour the file gives it, applied in priority order. A rule the viewer cannot evaluate the way Excel does, a formula rule, a colour scale, a data bar, an icon set, a percent rank, paints nothing and is named in the Info tab under Formatting. Stats opens for everyone now and leads with Duplicate rows, which walks the finished sheet and says how many rows repeat an earlier one, all columns compared, the first occurrence of each kept. Two rows are the same row by the rule the diff uses, the stored value and the formula text, never the number format, so 1 and 1.0 agree and x and X do not. Export the clean copy, a Pro action on that report, writes a workbook with the kept rows on a sheet named for the source and every removed row on a second sheet, _lens_removed, beside the row it repeats. The export dialog takes an .xlsx name as well now, where the filter reads CSV, JSONL, Markdown, Parquet, XLSX or a profile report: the sheet, the search matches or the current view go out as a workbook copy, every cell with its value and its number format, and the finished balloon offers to open the copy in this plugin.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>JSONL Lens for VS Code 0.5.5</title>
    <id>tag:twilightventures.dev,2026:whats-new/jsonl-lens-vscode/0.5.5</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/jsonl-lens-vscode/"/>
    <published>2026-09-14T00:00:00Z</published>
    <updated>2026-09-14T00:00:00Z</updated>
    <summary>published 2026-09-14</summary>
    <content type="html">&lt;p&gt;the activation row a pasted key makes in the Polar portal now ends with the extension name, so the two Lens extensions on one machine read as two rows you can tell apart when you release one.&lt;/p&gt;&lt;p&gt;a .jsonl.gz or .ndjson.gz opens in the viewer. the file is unpacked once to a temp file, the progress bar shows the unpacking over the compressed size, and then the viewer runs on the plain bytes as it does for any other file. the status line says the unpacked size beside the compressed one, and the temp file goes when the tab closes, also when the tab closes while the unpacking is still running. the two names are back in Open With and in both Open in JSONL Lens menus; they were taken out in 0.5.1 because nothing read them yet. an export cannot be saved over the compressed source. a plain file renamed to .gz gets a sentence saying so, and so does a temp disk without the room to unpack. free, like the rest of the viewer.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Parquet Lens for VS Code 0.6.6</title>
    <id>tag:twilightventures.dev,2026:whats-new/parquet-lens-vscode/0.6.6</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/parquet-lens-vscode/"/>
    <published>2026-09-14T00:00:00Z</published>
    <updated>2026-09-14T00:00:00Z</updated>
    <summary>published 2026-09-14</summary>
    <content type="html">&lt;p&gt;the activation row a pasted key makes in the Polar portal now names the extension after the machine digest, so the two Lens extensions on one machine read as two rows you can tell apart when you release one. the viewer itself did not change. the README and the store description now name the two calls a key makes, one to activate when you paste it and one to release when you remove it, and nothing else; the open-time line now names the measured file and times the footer read; the pricing line says what a key covers after its year of updates.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Lens File Viewer for Confluence 2.5.0</title>
    <id>tag:twilightventures.dev,2026:whats-new/lens-file-viewer-confluence/2.5.0</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/lens-file-viewer-confluence/"/>
    <published>2026-09-14T00:00:00Z</published>
    <updated>2026-09-14T00:00:00Z</updated>
    <summary>resubmitted 2026-09-14</summary>
    <content type="html"></content>
  </entry>
  <entry>
    <title>Lens File Viewer for Jira 2.4.0</title>
    <id>tag:twilightventures.dev,2026:whats-new/lens-file-viewer-jira/2.4.0</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/lens-file-viewer-jira/"/>
    <published>2026-09-14T00:00:00Z</published>
    <updated>2026-09-14T00:00:00Z</updated>
    <summary>approved 2026-09-14</summary>
    <content type="html">&lt;p class="site"&gt;Lens File Viewer for Jira is on the Atlassian Marketplace. The listing is public, and the note that follows is the one we filed with the version.&lt;/p&gt;&lt;p&gt;Fix: the attachment list no longer draws the type and size of a file over each other. Each of those two columns keeps its own width and the file name takes the rest of the row, trimmed with an ellipsis when it is long. Nothing else changed since 2.3.0.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>DuckDB Lens 1.2.8</title>
    <id>tag:twilightventures.dev,2026:whats-new/duckdb-lens/1.2.8</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/duckdb-lens/"/>
    <published>2026-09-13T00:00:00Z</published>
    <updated>2026-09-13T00:00:00Z</updated>
    <summary>published 2026-09-13</summary>
    <content type="html">&lt;p&gt;A database that opens to an empty tree, nothing in it yet, no longer counts as an open toward the one review ask. It used to, and the file stayed spent, so a later open of the same database, once it held something, did not count either. The ask still waits for five moments of use and appears once, and No thanks is for good.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Heap Dump Lens 1.2.7</title>
    <id>tag:twilightventures.dev,2026:whats-new/heap-dump-lens/1.2.7</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/heap-dump-lens/"/>
    <published>2026-09-13T00:00:00Z</published>
    <updated>2026-09-13T00:00:00Z</updated>
    <summary>published 2026-09-13</summary>
    <content type="html">&lt;p&gt;A dump that ends early now says "the file is truncated". A heap dump the JVM never finished writing, or a copy that stopped part way, used to fail with "Could not read the dump: null" or a bare byte offset. The reader now names the byte the file ends at and the record it ends in, and a record that claims more bytes than the file holds is refused before anything reads past the end. A file that is not a dump at all still says so.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Parquet Lens 1.8.0</title>
    <id>tag:twilightventures.dev,2026:whats-new/parquet-lens/1.8.0</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/parquet-lens/"/>
    <published>2026-09-11T00:00:00Z</published>
    <updated>2026-09-11T00:00:00Z</updated>
    <summary>published 2026-09-11</summary>
    <content type="html">&lt;p&gt;The profile report, a Pro export. Pick a name ending in .profile.html, .profile.md or .profile.json in the Export Rows dialog and the rows you chose are read once and written out as a report rather than a copy. Every column gets its row, null and empty counts and the kinds of value it holds. A numeric column adds the min, max, mean and standard deviation, the quartiles, a histogram and an outlier count; a text column its lengths, its distinct count and its most frequent values; a date or timestamp column the earliest and latest value, the median step and the largest gap. The whole table gets a duplicate-row count, which stays exact up to two million rows, and a correlation matrix over up to forty numeric columns. Where a figure came from a sample rather than from every row, the report says so beside the number, and it says the same wherever a count stopped at a cap. When the export finishes, the Export finished balloon offers Open report: the HTML opens in your browser, the Markdown and the JSON in an editor tab. A cancelled profile leaves no file, and the open file is refused as a destination, as it is for the other exports.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>SQLite Lens 1.4.0</title>
    <id>tag:twilightventures.dev,2026:whats-new/sqlite-lens/1.4.0</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/sqlite-lens/"/>
    <published>2026-09-11T00:00:00Z</published>
    <updated>2026-09-11T00:00:00Z</updated>
    <summary>published 2026-09-11</summary>
    <content type="html">&lt;p&gt;A column profile report, the second Pro export. Give the export a name ending .profile.html, .profile.md or .profile.json in the Export Rows dialog and the open table, or the search matches, is walked once and profiled instead of copied: every column gets its row, null and empty counts and the kinds of cell it holds; a numeric column its min, max, mean and standard deviation, quartiles, a histogram and an outlier count; a text column its length range, distinct count and most frequent values; a date or timestamp column its earliest and latest value, the median step and the largest gap. The table as a whole gets a duplicate row count, exact up to two million rows and marked when it stops there, and a correlation matrix over its numeric columns, forty at most. The quartiles, the histogram, the outliers and the gaps come from a sample once a column holds more than a thousand values, and the report says so beside each of those figures. The HTML is one page with nothing loaded from outside, and the JSON keeps every number at full precision. The finished balloon offers Open report, and a cancelled run leaves no file. The Pro SQL console also runs several statements in one go now: separated by semicolons they run in order, each timed in the status line; a failing statement stops the run and is named with its line number, the driver's own message and how many ran before it; a semicolon inside a string, a quoted name or a comment stays text; Explain gives one plan per statement; the grid shows the last result set; a statement that would write is refused as before, while BEGIN, COMMIT and ROLLBACK go to SQLite as typed.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>JSONL Lens 1.7.0</title>
    <id>tag:twilightventures.dev,2026:whats-new/jsonl-lens/1.7.0</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/jsonl-lens/"/>
    <published>2026-09-09T00:00:00Z</published>
    <updated>2026-09-09T00:00:00Z</updated>
    <summary>published 2026-09-09</summary>
    <content type="html">&lt;p&gt;Export to Parquet, a Pro action. Pick a .parquet name in the Export Records dialog, where the filter now lists Parquet beside JSONL and CSV, and the current page or the matches of a search or a filter are written as one Parquet file. The columns are the dot paths a sample of the file shows, in the order the grid uses, up to 256 of them. Each column takes its type from the values the exported records hold: whole numbers become int64, any other number double, strings text, true and false a boolean column. A nested object or array is written as the JSON text of itself in a JSON column. Where the records disagree on the kind the column is text, and a field a record does not have is null. Records the reader cut short and records that do not parse are left out and counted on the status line, the same rule the CSV export follows. The open file is refused as a destination, as it is for CSV and JSONL. A cancelled export leaves no file behind, not even the scratch file the writer keeps beside the destination while it works. When the export finishes, the balloon offers Open exported file, and the file lands in Parquet Lens when that is installed; when nothing installed opens Parquet files, the click says so instead and offers the Parquet Lens page. The plugin download is larger than before, because the Parquet writer now ships inside it. The Theme picker ends with two locked entries now: lamplighter, whose line in the open list reads "unlocks when you share Lens with a colleague", and catacombs, whose line reads "unlocks the first time Pro runs for you". Pick a locked one and the plugin opens the way to earn it. For lamplighter that is the share card, also under Help as Share JSONL Lens: plain text for a colleague with the marketplace page, the family page beside it and a referral code of this install's own, under the line "enter it under Theme in any Lens plugin". Copy share card earns the theme here, and a colleague who picks lamplighter in their own Theme picker, types that code into the share card and presses Unlock with code earns it there. Catacombs opens the first time Pro runs for you, and a trial counts. An earned theme stays whatever the license says. Four night themes join the picker, Duskhollow, Abyss, Obsidian and Moonlit Garden; trying one is free for the open window and keeping it is Pro, like the eight.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Log Lens 1.7.0</title>
    <id>tag:twilightventures.dev,2026:whats-new/log-lens/1.7.0</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/log-lens/"/>
    <published>2026-09-09T00:00:00Z</published>
    <updated>2026-09-09T00:00:00Z</updated>
    <summary>published 2026-09-09</summary>
    <content type="html">&lt;p&gt;Export to Parquet, a Pro action. Pick a .parquet name in the Export Lines dialog, whose filter reads Log, JSONL, CSV or Parquet, and the current page, the filtered view, the search matches or the query matches are written as one Parquet file. The columns are the ones the CSV export has, $level, $time and $message first and then one column per parsed field in the order the fields first appear, and a $raw column at the end holds each line exactly as it was read, so nothing the parser did not understand is lost. Each field column takes its type from its values: a number written as an integer becomes int64, any other number double, true and false booleans, text stays text, a nested object or array is written as JSON text, a line without the field leaves a null, and a field that mixes kinds is written as text. $time is text in this cut. The open file is refused as a destination, "That is the open file. Pick another name.", as it is for every export, and a cancelled export leaves no file behind, not even the scratch file the writer keeps beside the destination while it works. When the export finishes, the balloon offers Open exported file, and the file lands in Parquet Lens when that is installed. The Theme picker has two more entries at the end, lamplighter and catacombs, each with a padlock and its own line in the open list, "unlocks when you share Lens with a colleague" and "unlocks the first time Pro runs for you". Pick a locked one and the plugin opens the way to earn it. For lamplighter that is the share card, also under Help as Share Log Lens: the marketplace page, the family page and a referral code of this install's own. Copy share card earns the theme here; a colleague who types the code into their own share card, reached by picking lamplighter in the Theme picker, and presses Unlock with code earns it on their side. Catacombs opens the first time Pro runs for you, a trial included. An earned theme stays whatever the license says. Four night themes join the picker, Duskhollow, Abyss, Obsidian and Moonlit Garden; trying one is free for the open window and keeping it is Pro, like the eight.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Notebook Lens 1.1.8</title>
    <id>tag:twilightventures.dev,2026:whats-new/notebook-lens/1.1.8</id>
    <link rel="alternate" type="text/html" href="https://twilightventures.dev/products/notebook-lens/"/>
    <published>2026-09-09T00:00:00Z</published>
    <updated>2026-09-09T00:00:00Z</updated>
    <summary>published 2026-09-09</summary>
    <content type="html">&lt;p&gt;Two new themes sit at the end of the Theme picker, lamplighter and catacombs, each behind a padlock until you earn it, and the open list says how beside the name: lamplighter "unlocks when you share Lens with a colleague", catacombs "unlocks the first time Pro runs for you". Sharing goes through the share card, under Help as Share Notebook Lens and opened as well when you pick the locked lamplighter entry. The card is a few lines of text for a colleague, the marketplace page and a referral code of your own among them; Copy share card earns the theme right there, and so does entering a code a colleague gave you. Catacombs is yours once Pro has run on your machine, trial or paid, and it stays after the trial ends. An earned theme is kept without Pro, in every Lens plugin, and comes back the next time you open a notebook; the other themes still taste free for the window and keep with Pro, as before.&lt;/p&gt;</content>
  </entry>
</feed>
