Repository navigation
Releases: keithadler/plainwin
Release list
Plain for Windows 1.4.4
Download Plain-for-Windows-1.4.4-x64.exe — Windows 10 or 11. One exe, no installer, no administrator. ARM64 and the console twin are below.
A document can gain and lose a paragraph.
The engine learned how in 1.4.3 and nothing could ask it to, so a document — a new one especially, which starts with exactly one paragraph — stayed the length it was. The More menu now offers Add a paragraph after this one and Take this paragraph out while a document is open, acting on the paragraph the caret is in, and the console twin has the same:
plain paragraph report.docx add 3
plain paragraph report.docx remove 4
A paragraph in a table is refused, with the reason: add a row to the table instead.
There is also a new test that opens the real window, opens the real menu with real keystrokes, clicks the item and looks at the file afterwards. What a menu offers is the one thing a unit test cannot see, and that is exactly the gap this release closes.
Plain for Mac is out today too. Plain for Mac 1.0.0 is the same program with a Mac window, running the same engine compiled native, so the two agree about what a file is by construction rather than by intention.
Plain for Windows 1.4.3
Download Plain-for-Windows-1.4.3-x64.exe for ordinary Intel and AMD PCs, or Plain-for-Windows-1.4.3-arm64.exe for Windows on ARM.
Windows 10 or 11. One exe, no installer, no runtime, no administrator. Put it anywhere and double-click. Windows will warn about an unknown publisher: More info, then Run anyway.
SHA256SUMS.txt is published beside them, written by the same job that built them.
Headings written by LibreOffice were shown as bullets
A document exported from LibreOffice, or from anything else that writes a heading the same way, lost its entire outline in Plain: every heading appeared as a list item, and none was styled as a heading.
Two things were read wrongly.
A paragraph can carry numbering whose id is 0, and that means "no numbering at all". Treating any numbering element as a list turned those paragraphs into list items.
And a heading can declare its level outright with outlineLvl rather than by being styled "Heading 1". That is what LibreOffice writes, and reading only the style name missed every one of them.
Both are fixed, with four checks built on a document written the way LibreOffice writes one.
How it was found
By building Plain for Mac. It shows the same blocks the same way, because it is the same engine, and a document of headings and bullets came out as a document of nothing but bullets. A bug found on one is fixed for both.
Nothing else changed. 1,024 checks.
Plain for Windows 1.4.1
Download Plain-for-Windows-1.4.1-x64.exe for ordinary Intel and AMD PCs, or Plain-for-Windows-1.4.1-arm64.exe for Windows on ARM.
A switch's value could end up in your cell
In the console twin, plain set book.xlsx B5 25000 --sheet Summary wrote the text 25000 Summary into B5. The number became words, and a column of words does not add up.
Every switch that takes a value was affected, on every verb that takes both a switch and words of its own, from 1.3 onwards. The console twin now knows which switches are followed by a value, and never reads one as something the verb was given. There are checks for it now.
The window was never affected, and neither was any file already saved correctly. If you have used plain set, plain colour, plain align, plain border, plain tidy or plain height with a switch, look at the cells you changed: a number that came out as text will be sitting on the left of its cell rather than the right.
This was found by measuring what each kind of edit rewrites in a file, rather than by a test. Nothing else changed.
Plain for Windows 1.4.0
Download Plain-for-Windows-1.4.0-x64.exe for ordinary Intel and AMD PCs, or Plain-for-Windows-1.4.0-arm64.exe for Windows on ARM.
Windows 10 or 11. One exe, no installer, no runtime, no administrator. Put it anywhere and double-click. Windows will warn about an unknown publisher: More info, then Run anyway.
What a cell reads, and what reads it
This is the question behind most spreadsheet mistakes. A total looks wrong and you cannot see which cells it is adding up; you change a number and cannot see what else moved because of it. Right-click a cell and Plain says, both ways:
D5 reads:
Summary!C5 26,400
Summary!B5 24,000
D5 is read by:
Summary!D11 =SUM(D5:D10)
Summary!B13 =INDEX(A5:A10,MATCH(MAX(D5:D10),D5:D10,0))
Summary!B15 =SUMIF(D5:D10,">0")
The answer was in the file already. Plain only reads it out.
Tidying a list
Take out rows that say the same thing. The first of each set stays where it is, so what is left is in the order it was in.
Split a column at a comma or a space, into the columns to its right. It refuses rather than writing over the column beside it, and says which column stopped it.
Both refuse, with a reason, wherever a formula would be made to mean something else. That is the same care sorting takes.
The choices a cell will accept
A sheet someone else built often has cells that only take certain values: a status that must be one of four words. Plain does not draw the little arrow, but it reads the rule and says what the cell wants. A cell that silently refuses what you type is worse than one that tells you.
Lines round cells
Thin, medium, thick, dotted, dashed or double. All four sides, or one at a time.
Speaker notes, and the words that describe a picture
Speaker notes travel with every copy of a deck and nobody sees them on the slide. Plain shows what each says and lets it be changed.
Alt text is the thing everyone is asked for and skips. Plain lists every picture, says which have nothing describing them, and writes the description in both the places Word and PowerPoint look, because a picture described in only one of them is described to only half the readers.
Links you can make, and a picture you can put in
A link goes on a whole paragraph. Only ordinary web and mail addresses: Plain will not write into a document a link it would refuse to open itself. The words take the document's own link styling where it has one, and where it has none Plain says so rather than inventing a blue underline.
A picture goes at the end of a document at a size you give. Nothing is scaled or re-encoded, so what goes in is the file you chose.
What is already in the column, offered as you type
A list of clients typed slightly differently each time is the most common way a spreadsheet quietly goes wrong. Type a few letters and Plain offers what is above, with the rest selected, so carrying on typing replaces it and pressing Enter takes it.
Console twin
plain border, plain tidy dedupe|split, plain reads, plain choices, plain notes, plain describe, plain link, plain picture.
1,014 checks, up from 939. Nothing about the file format changed.
Plain for Windows 1.3.0
Download Plain-for-Windows-1.3.0-x64.exe for ordinary Intel and AMD PCs, or Plain-for-Windows-1.3.0-arm64.exe for Windows on ARM.
Windows 10 or 11. One exe, no installer, no runtime, no administrator. Put it anywhere and double-click. Windows will warn about an unknown publisher: More info, then Run anyway.
Sheets
Right-click a sheet tab to add one, rename it, move it or take it out. Slides could already be managed this way and sheets could not.
Renaming is the one that needs care beyond the tab. A formula saying Detail!B2 means the sheet called Detail, so renaming without rewriting the formulas that name it would leave them pointing at a sheet that is not there. Every formula in the workbook is rewritten to follow the new name, and Plain says how many it changed.
Taking a sheet out is refused while any formula still reads it, and says which. Nothing is silently broken. What was on it stays in the file, unused, rather than being deleted.
How a sheet looks
Rows have a height, as columns already had a width. Columns can be held on screen as well as rows; both live in the same pane, so they are set together and neither quietly undoes the other.
Right-click a selection for How these cells look: left, centred, right, wrapped, and a colour behind the cells or for their words. Each change builds on the format the cell is already wearing, so giving a cell a colour does not throw away its number format.
Documents
Headers and footers. The lines that run along the top and bottom of every page: what they say, and a way to change the words. They are the part of a file people forget is there. A header naming the client a template was written for travels with every copy of it, and nobody sees it on screen.
Where a paragraph sits. Ctrl+L, Ctrl+E, Ctrl+R and Ctrl+J, the shortcuts every word processor uses, and the document shows the result rather than only recording it.
Links, and where they actually go
A link's words and its destination are two different things, and a file is one of the easier places to hide that they disagree. Plain lists both side by side.
It will open ordinary web and mail addresses and nothing else. Anything that would run a program is shown in red and left alone. A document should not be able to make something happen because you clicked it.
Compare with another file
What changed between two versions: which parts of the file differ at all, and which lines of text arrived or went. Plain holds a file as the parts it is made of, so it can answer the first question exactly rather than by guessing.
It compares what is there. It does not try to work out how one became the other, so a line that moved reads as one gone and one arrived. Saying that plainly is better than guessing at a move and being wrong.
See the pages first
Print preview, on the paper and margins chosen in settings, using the same laying out that printing does. A preview built a different way would be a picture of something else.
Console twin
plain sheet <file> add|rename|remove|move, plain height, plain align, plain colour, plain band, plain links, plain compare <before> <after>.
939 checks, up from 843. Nothing about the file format changed.
Plain for Windows 1.2.0
Download Plain-for-Windows-1.2.0-x64.exe for ordinary Intel and AMD PCs, or Plain-for-Windows-1.2.0-arm64.exe for Windows on ARM.
Windows 10 or 11. One exe, no installer, no runtime, no administrator. Put it anywhere and double-click. Windows will warn about an unknown publisher: More info, then Run anyway.
Before you send it
One list of what travels with a file that you may not have meant to send: who wrote it and who saved it last, comments arguing about a number, tracked changes showing what a clause used to say, sheets and rows someone hid rather than deleted, speaker notes meant for the presenter.
It takes out only what you tick. Hidden sheets and rows are somebody's working rather than an accident, and speaker notes live in parts of their own, so Plain lists those and leaves them where they are rather than tearing them out. And it says plainly that it can only find what it knows to look for: this is a list, not a promise that a file is safe.
Working in a sheet
Filter. Show only the rows whose cell in a column contains what you type. Nothing is written to the file: it is a way of looking at the sheet, hiding a row never deletes anything, and clearing it puts every row back.
What the selection adds up to, in the status bar: how many numbers, the sum, the average, the lowest, the highest. It is the question a spreadsheet is usually opened to answer, and having it there means not typing a formula into an empty cell and deleting it afterwards.
Getting about. Ctrl with an arrow goes to the end of the run of filled cells, or across a gap to the next thing there is. Ctrl+Home and Ctrl+End go to the corners. Ctrl+G asks which cell and goes there.
Joined cells are drawn as one cell instead of several empty ones with lines through them, and clicking any part of a block selects the corner that holds the value.
Redo
Ctrl+Y, and Ctrl+Shift+Z. Every step now carries how to undo it and, where it can be worked out, how to do it again. A step that cannot say how to repeat itself makes everything after it unrepeatable, so the pile waiting to be redone is thrown away rather than left to put things back in the wrong order. Half a redo is worse than none.
Changing the shape of a file
Slides can be added, taken out and moved. Rows can be added to and taken out of a table in a document; a new row is a copy of a neighbour with the words removed, so it keeps the borders, shading and widths of the table it joins.
A change of shape empties the undo stack and builds the view again from the file, and says so. The numbering of slides and paragraphs is different afterwards, and carrying on with the old numbering is how a tool ends up editing the wrong thing.
Removing a slide takes it out of the running order and leaves its part in the file, unused. That costs a few kilobytes; deleting a part that something unnoticed still points at is how a deck gets broken.
Find in a folder
Which Office files in a folder hold the words, and where in each one. Ctrl+Shift+F.
It only ever reads. It tells you which files matter and then you open those and change them yourself, one at a time, watching what happens. A tool that offered to change forty files at once would be asking for a great deal of trust in exchange for very little work saved.
A file with a password says so
Opening one used to report "no ZIP end record found", which sends someone looking for damage that is not there. A file with a password on it is not a damaged package, it is a different kind of container altogether, and Plain now says that, says it cannot remove the password, and says what would work instead. An older .doc, .xls or .ppt is named as an older file too.
Under all of it
The package can now add a part, which is what a deck needs in order to gain a slide. It is deliberately separate from writing an existing part, so that adding one can never happen by accident, and the checks prove that after a part is added every part that was already there still comes back byte for byte. The promise the whole app rests on is unchanged.
843 checks, up from 744.
Console twin
plain hidden <file> [--remove names,comments,tracked], plain find <folder> <words> [--deep], plain slide <file> add|remove|move, plain tablerow <file> add|remove <table> <row>.
Nothing about the file format changed. Files written by 1.0, 1.1 and 1.2 are the same bytes.
Plain for Windows 1.1.0
Download Plain-for-Windows-1.1.0-x64.exe for ordinary Intel and AMD PCs, or Plain-for-Windows-1.1.0-arm64.exe for Windows on ARM.
Windows 10 or 11. One exe, no installer, no runtime, no administrator. Put it anywhere and double-click. Windows will warn about an unknown publisher: More info, then Run anyway.
Sort rows
By any column, up or down. Numbers sort by value rather than as text, so a hundred comes after twenty. Blank rows go to the bottom whichever way you sort.
Sorting is the one common spreadsheet job that can quietly ruin a file, because moving a row moves what every formula was pointing at. Plain will not guess its way through that. It refuses, and says why, whenever a formula would be made to mean something else: one inside the block being sorted, one reading only part of it, or a lookup whose answer depends on where a value sits.
A total underneath a table is the ordinary case, and it goes ahead. SUM(D2:D8) reads every row of the table, and shuffling those rows does not change the total, so there is nothing to protect you from.
Column widths, and a header that stays
Drag the edge of a column heading to resize it. Double-click the edge to fit the column to its longest value. Widths are written where the file keeps them, so Excel opens the sheet the way you left it.
Right-click and choose to keep the rows above the selected one on screen, and they stay put while the rest scrolls. This is read from and written to the sheet's own pane settings, so a sheet that already had a frozen header keeps it here, and one you freeze here is frozen when it goes back to Excel.
Page setup for printing and PDF
Paper (A4, Letter, Legal, A3, A5), sideways or not, how much white at the edges, and a line at the top and bottom where {page} and {pages} are filled in.
Plain still lays the text out on its own page, and still says so: it does not know where Word would break one, and a PDF that pretended to would be a lie in a format people trust.
Open from Explorer
An optional Edit in Plain line on the right-click menu for Word, Excel and PowerPoint files, and Plain offered under Open with.
It writes under your own account only, so it never asks to be an administrator and never touches anyone else's. It does not make itself the default for anything: Windows decides defaults, and an app that seizes them is the kind of app this one exists as an alternative to. Turning it off takes back exactly what it added, which is checked on every build by counting what is in the registry before and after: thirteen entries on, none left off.
A daily check for a new version
Once a day Plain asks GitHub what the latest release is, and if there is a newer one it puts a line in the status bar with a button to see what changed. That is all it does. No identifier is sent, nothing about your files is sent, nothing is downloaded and nothing installs itself. The switch is in Reading and settings, and turned off Plain makes no network request at all. The console twin never checks, because a scheduled job should not reach the network because of something you did not ask for.
Plain 1.0 said it had no network code at all. That is no longer true, so the README, the Help, PRIVACY.md, the About box and the announcement page now say what the one request is and how to stop it, rather than leaving a promise standing that the app no longer keeps.
Fixed
Bullets and curly quotes came out of a PDF as nonsense. A bullet appeared as €42. Characters above 126 were written as an octal escape of their Unicode number, and a PDF reader takes the first three digits as one character and prints the rest as text. Bullets, dashes, curly quotes and the ellipsis are now written where the built-in fonts actually keep them, and anything genuinely outside those fonts becomes a question mark rather than nonsense. This had been wrong since 1.0.0, and affected any document with a bulleted list.
Console twin
plain sort <file> <range> <col> [down] [sheet], plain width <file> <col> <chars|fit>, plain freeze <file> <rows>, plain explorer on|off|status, and --paper, --landscape, --margin, --header, --footer for plain pdf.
Nothing about the file format changed. Files written by 1.0 and by 1.1 are the same bytes.
Plain for Windows 1.0.1
Download Plain-for-Windows-1.0.1-x64.exe for ordinary Intel and AMD PCs, or Plain-for-Windows-1.0.1-arm64.exe for Windows on ARM.
Windows 10 or 11. One exe, no installer, no runtime, no administrator. Put it anywhere and double-click. Windows will warn about an unknown publisher: More info, then Run anyway.
Typing into a new document and saving no longer loses the words
This is the whole reason for the release, and it was a bad one.
The editors hand their text over when they lose the caret, which is what keeps a long document from rebuilding on every keystroke. Nothing forced that handover before a save. A file with a single box in it, which is exactly what a new blank document is, never loses the caret on its own. So you could make a new document, type a page, press Ctrl+S, and save an empty file.
Every path that reads the file now takes the caret away first: Save, Save a copy, Print, Save as PDF, and the half-minute keeper that guards against a machine stopping. An existing file with several paragraphs was much less likely to hit this, because clicking from one paragraph to another already committed the last one, but the same fix covers it.
The interactive tests were measuring an empty window
The test harness waited for the window to appear and then began typing. Opening the file happens after the frame is on screen, and on a slow machine that is seconds later, so the keystrokes went nowhere. Four checks were failing for that reason, and several others were passing without proving anything: "undo puts the old value back" passed because nothing had ever changed. The harness now waits for the title to name the file before it touches the keyboard, and the suite has a check that follows the exact path this bug was found on.
Both the console suite and the interactive suite pass in full against this build, and the released 1.0.0 fails the new check, which is how the fix was confirmed to do something.
Also
The pictures in the README are taken from a fuller demo file now: a quarterly sheet with real formatting, three sheets and working formulas, a review document with headings, a table and a list, and a six-slide deck. The README says what the download actually weighs, under 60 MB rather than the 57 MB it claimed.
Nothing about the file format changed. A file written by 1.0.0 and a file written by 1.0.1 are the same bytes.
Plain for Windows 1.0.0
Download Plain-for-Windows-1.0.0-x64.exe for ordinary Intel and AMD PCs, or Plain-for-Windows-1.0.0-arm64.exe for Windows on ARM.
Windows 10 or 11. One exe, no installer, no runtime, no administrator. Put it anywhere and double-click. Windows will warn about an unknown publisher: More info, then Run anyway.
The console twin, for scripts: plain-1.0.0-x64.exe and plain-1.0.0-arm64.exe.
Opens Word, Excel and PowerPoint files, edits the basics, and never damages what it doesn't understand.
Every other editor that opens a .docx reads it into its own idea of a document and writes that idea back. Whatever the idea has no room for is quietly gone: the chart, the macro, the tracked changes, the header nobody looked at. Plain opens the file as the package of parts it really is and writes back every part it did not edit as the exact bytes it found.
Open a file, save it without changing anything, and you get the same file back, byte for byte. That is a claim a test can check, and it is checked against real documents on every build. Check it yourself with plain roundtrip *.docx *.xlsx *.pptx.
What it does. Cells, formulas and every sheet of a workbook, with rows and columns that can be inserted and deleted and formulas that follow. The body text of a document with headings, tables and lists. The text on each slide. Find and replace across the whole file, print, save as PDF, comments and tracked changes accepted or turned down one at a time, document properties stripped before a file leaves the building, and the pictures inside it shown so you can see what you are sending.
What it keeps but does not show. Charts, pivot tables, macros, SmartArt, embedded objects, layouts, masters, themes, headers, footers. All of it is in the saved file unchanged, and the panel on the right tells you what is there.
Honest limits. No page layout, so printing and PDF give you what Plain shows rather than Word's pages. No fonts, colours or alignment. English only, left to right. And it has never been opened in Microsoft Office: everything here is checked against LibreOffice, against macOS's PDF engine, and against its own byte-for-byte round trip, which are good proxies that have caught real bugs, but are not the same thing.
Free, MIT, no account, no cloud, and no network code in it at all.