1. Opening files
Four ways in, all leading to the same place:
- Drag the file onto the window.
- "Open file" button in the top right, or
⌘O. - Double-click in Finder, if ProgViewer is associated with that file type.
- Recently opened, on the start screen or under File → Open Recent.
One file at a time, but as many tabs as you like. Dragging several at once opens one tab for each.
Open with the system app
When the file isn't text — a PDF, a video, an image — ProgViewer shows a screen saying it doesn't display that format, with a button to open it in the system's default app. It refuses executables: a file with the execute bit set is never launched, even if you ask.
2. Tabs
- Switch tabs: click one,
⌘1through⌘9to jump to the Nth, or⌥←/⌥→to cycle. - Close: the tab's
✕, or⌘W. - Tab context menu (right-click): reload from disk, copy path, show in Finder, close others, move to new window.
- Reorder: drag the tab along the bar.
- Move to another window: drag the tab onto it. Dropped outside the bar, it becomes a new window.
Hovering a tab shows the file's full path.
There is a ceiling of 20 tabs. Past that, the least recently used one leaves on its own.
3. Reading comfortably
| Feature | How |
|---|---|
| Zoom | ⌘+, ⌘−, ⌘0 back to 100%. Or type the value in the header field. |
| Theme | ⚙ → Theme: System, Light or Dark. ⌘⇧L toggles light/dark. |
| Code theme | ⚙ → Code theme: can differ from the rest of the app. |
| Line wrap | ⚙ → "Wrap long lines", or ⌘⇧B. |
On System, the app follows the macOS appearance live — change it there and it changes here, with no reload.
4. Finding what matters
Search
⌘F opens the search bar. Enter goes to the next match, ⇧Enter to the previous, and Esc
closes it. The count appears next to the field.
Search crosses syntax highlighting and finds text inside collapsed blocks — when a match is inside a fold, the fold opens to reveal it.
Go to line
Type :200 in the search bar to jump straight to line 200. It doesn't count as a search
match, and a line that doesn't exist is ignored quietly.
Outline
Markdown files get a clickable outline of their headings. Toggle it in ⚙, with the ☰
button in the header, or with ⌘⇧S.
Folding blocks
In code files, the line-number column shows a trigger next to lines that open a block. Click to collapse.
- Collapse or expand everything: the button in the block's top-left corner, or
⌘⇧E. - Keyboard:
Tabreaches the fold column,↑/↓move between triggers,EnterorSpacefolds. - Fold state belongs to the tab: switching away and back undoes nothing.
Copying a selection that crosses a fold takes the hidden content with it.
5. Selecting and copying
- Copy the whole block: the Copy button, which appears when you hover the block.
- Copy only the selection: select and use Copy selection, or
⌘C. - Select whole lines: click and drag in the line-number column.
Line numbers and fold triggers never end up in what you copy — they live outside the text precisely for that reason.
6. Images and links
Both are switches in ⚙, and apply to every file:
- Show images (
⌘⇧I) — off, an image in Markdown appears asin text. - Enable URLs (
⌘⇧U) — off, addresses become plain text, with no colour and no click. - Enable file links (
⌘⇧K) — the same for references to files.
Local images work: ProgViewer reads images from the open file's folder and its subfolders. Remote images are never fetched — they become a chip with the alt text, and nothing leaves for the internet.
Clicking a file link opens it in a new tab. Clicking a web link opens your system browser — the page is never loaded inside ProgViewer.
7. Preview
Some formats get a Preview button (⌘⇧V) that shows the result instead of the code:
| Format | What you see |
|---|---|
.html |
The rendered page |
.svg |
The drawing |
.css |
The declared colour tokens and a sample page with the CSS applied |
.scss .sass .less .styl |
The declared variables (not compiled — see §11) |
The preview runs sandboxed, in a frame that cannot reach the rest of the app.
8. The file changed on disk
ProgViewer checks the open file every 1.5 seconds. If it changed, the screen updates by itself, keeping your reading position.
- If the file is deleted or renamed, the app warns once and stops checking.
- The tab's
⟳button (or⌘R) forces a reread and restarts the polling. - While the window is hidden, polling rests — it won't hit the disk in the background.
9. Printing
⌘P, the 🖨 button in the header, or File → Print….
Only the document reaches the paper: no header, no tabs, no search, no outline. White background, 12 mm margin, and external links with their URL printed alongside. Collapsed blocks print in full — folding is a reading aid, not a content cut.
To produce a PDF, use PDF → Save as PDF in the macOS print panel.
10. Multiple windows
File → New Window (⌘N) opens another window with its own set of tabs. Drag tabs between
them.
Under ⚙ → "Open files in" you choose whether a new file arrives as a tab or as a new window. The choice also applies to Finder and to the recent list.
Each window remembers its position and size, and returns there when the app reopens.
11. Known limits
None of this is a defect: they are choices, and each announces itself on screen when it acts.
A large file degrades features, never content.
| Situation | What changes |
|---|---|
| Line longer than 10,000 columns | The remainder sits behind a clickable marker |
| File above 2 MB | Syntax highlighting is dropped |
| JSON above 5 MB | It is not re-indented |
| File with more than 20,000 lines | Simple mode: no numbering, no folding, no highlighting |
| File with more than 500,000 lines | The excess is not displayed — the only ceiling that cuts content |
| File above 25 MB | Does not open |
In simple mode, features that depend on line numbering — go to line, folding, selecting by column — do not exist, and say so when you try to use them.
CSS pre-processors are not compiled. .scss, .sass, .less and .styl show the
declared variables, not the result: compiling depends on the project's @import tree, and a
one-file-at-a-time viewer doesn't have it.
Embedded scripts never run in an opened file — neither in the document nor in the preview.
12. Privacy
- Nothing goes to the network. Not content, not file names, not usage statistics. The app is sealed for it: it can only talk to itself.
- No file is ever modified. ProgViewer only reads.
- What is kept on your computer are preferences (theme, zoom, switches, shortcuts) and the recent-files list — the paths only, never the content.
- Remote images are never fetched, so whoever hosts an image never learns that you opened the file.