PDF and Office viewer
Read PDFs and Office documents, inspect spreadsheets and data, and send PDF page notes to an agent without leaving Paseo.
该插件的概览尚未翻译为你的语言,因此以英文显示。
PDF and Office viewer lets you review the files your agents produce without leaving Paseo. Read PDF and Office documents, inspect spreadsheets and data, and send PDF page notes to an agent. When a turn ends, a card lists the documents changed during that turn, with a button to open each one. The Documents panel highlights files changed since your last visit.
Documents are rendered on the machine that runs your Paseo daemon, and the app only receives page images, text and table cells. This works on desktop, web and mobile, and over a relay connection, because the file never has to reach the device first. Everything it needs ships with the plugin: there is nothing to set up, and it does not use LibreOffice, Poppler, ffmpeg or any other program on the host.
Opening documents
- Open Documents from the workspace's new tab menu, including on a phone, or use
/docin a chat. On wide layouts, a Documents button also appears in the workspace header when the workspace scan finds at least one supported file. It checks each workspace every 2 minutes, two workspaces at a time, waiting up to 10 minutes after errors, and checks again as soon as an agent in that workspace finishes a turn (at most every 10 seconds). The header button disappears when no supported files remain. In Paseo 0.12.0 compact layouts the header button is absent; the new tab menu and/docremain available. On desktop and web, the panel can also sit in the explorer. - The Documents panel lists the documents in the workspace under PDF, Word, Spreadsheets and data, PowerPoint, Images, Video and Audio headings, newest first within each, and refreshes every few seconds. Tap a heading to collapse it. Each heading shows how many files of that type the workspace has. The type buttons above the list show each type's icon in its color, and New and Needs review show the icon of their status pill.
- Tap a file in Documents and it opens right there, with Back to documents, the file name and its folder, and Open in tab above the reader. Back returns to the list as you left it: search, type filter, view, collapsed headings and scroll. Previous and Next step through the files the list showed, across types, and Open in tab opens the file in its own viewer tab with the same Previous and Next. The file stays selected until you go back or reload the plugin, also when you switch tabs, and each workspace keeps its own. A file renamed or deleted meanwhile shows File not found. Show documents and the header Documents button always show the list. Below 480 pt, as in the explorer, the reader puts Pages, Add note, Mark reviewed and Download original behind More, so Previous and Next, Find and the review status keep one row; in the narrowest explorer, Previous and Next take a row of their own.
- Elsewhere (a turn card's Open button,
/doc, Open recent document), where a document opens depends on the layout. On a phone it opens in its own screen. On desktop and web, a Documents panel already on screen (in the explorer, a split pane or the active tab) shows it in place and the chat stays where it is. Otherwise the "Open documents" setting decides: Side by side opens Documents in the explorer next to the chat, Full view opens the document in its own tab, and Auto (the default) picks side by side when the window is at least 1,100 pt wide, where the explorer keeps its full 320 pt and the chat about 460 pt, and its own tab below that. The first document opened on desktop or web asks once, with a small picture of each choice and a Decide for me (Auto) link; the answer becomes the setting, for every client of the daemon, and can be changed in Settings, Document viewer. Paseo 0.12.0 gives plugins no back handler, so the browser or hardware Back does not return from a document read in Documents to the list; use Back to documents. - File icons have one color per type (PDF, Word, spreadsheets and data, PowerPoint, images, video, audio), in Documents and on turn cards. The colors were checked to stay apart for red-green and blue-yellow color blindness, and each type also keeps its own icon shape and heading, so color is never the only cue. The light or dark set follows the app theme; on a theme where a color would fall under 3:1 contrast, that icon stays gray. Turn colors off with "Color file types" in Settings, Document viewer; like the other settings, it applies to every client of the daemon, and an open Documents panel picks up a change within about 35 seconds, while it polls (not while the window is hidden). Screen readers hear each row as its file name first, then type, folder, time and status.
- Until you dismiss them, a small card at the top of Documents shows four short tips, one at a time, with Next and Skip. After Skip or Done they stay hidden on every client of the daemon, because the daemon keeps the dismissal in the viewer state folder (see Saved viewer state). The Tips link under the list shows them again.
- A switch beside the search box picks how Documents shows files: List (the default), Details, Previews or Tree. Search, type buttons and the Needs review and New filters work the same in every view. The daemon keeps one choice for phone-sized layouts and one for wide ones, shared by every client, so the phone and the desktop can differ.
- Details shows one line per file in aligned columns: name, folder, size, modified time and status. The time is absolute ("14:32" today, "Yesterday 18:40", "17 Oct", then the full date; a time on a later day, from a clock set ahead, shows its date). The column titles stay over their columns as the list scrolls; screen readers skip them, since each row says every column. Below 640 pt the folder follows the name, and in a narrow explorer the size is left out. On a phone, rows stay 44 pt tall, the folder follows the name, the size is left out and yesterday's time drops the hour.
- Previews shows PDFs, slides and images as tiles with page 1 or the picture itself, in square frames that never crop. Other files stay rows under their heading, and the headings stay under the Needs review and New filters so tiles and rows never mix. A PDF caption adds its page count once the thumbnail is in, and a deck its slide count. Tiles load as they come into view, with the next row, two at a time and behind the document you are reading, and typing in search asks for no thumbnail twice; files over 64 MiB and files with no thumbnail keep a placeholder with their type icon and extension. A file an agent keeps rewriting shows its last picture until a new version has held for one refresh. In an explorer narrower than 240 pt, Previews shows rows.
- Tree shows Documents as folders: folders first, then files, both by name, with numbers in order (run-2 before run-10). A folder row shows how many of the listed documents it holds at any depth, and a folder that only holds one folder shares its row with it ("out/reports"); when a new file splits that row, its folders stay open if the row was open. The top level starts open; Expand all and Collapse all are above the list, and the open folders are kept per workspace, for the last 50 workspaces, until the app restarts. A search or filter shows the matching files with the folders above them, all open. A file row has its type icon, status and, where there is room, its size and time. Screen readers hear a folder row as its name, the folder it sits in, its level, its document count and whether it is open. On the web, Enter or Space toggles a folder or opens a file. Opening a file from Tree lets you step to the other files of its folder with Previous and Next (up to 50 around it). Tree lists up to 1,000 documents, the most recently changed; when the workspace has more, it says so above the list, and that folder counts include only the listed ones. On a phone, rows stay 44 pt tall. Below 360 pt, as in the explorer sidebar, the view switch takes its own row under the search box and rows leave out the size.
- Type buttons above the list show one type at a time, and the search box finds files whose name or folder contains every word you type, ignoring case. Search and type filters cover the whole workspace, not only the files in the list.
- The Command Center has two workspace actions: "Open recent document" opens the most relevant one, and "Show documents" opens the panel. The most relevant document is the newest PDF, Word, spreadsheet or slide file. Images, video and audio, such as test screenshots, are picked only when the workspace has none of those.
- The
/docslash command opens a document by its path in the workspace, or the most relevant one (as for "Open recent document") when you give no path.
An open document checks for changes every few seconds and shows the new version when an agent rewrites the file.
After an agent turn
- When an agent turn ends, the viewer adds one card to that agent's timeline listing the supported documents created or changed while the turn ran, each marked New or Changed with its folder and size, and an Open button that shows it in the viewer. It lists up to 12 rows, files first and then folder rows (see below), then "+N more in Documents". PDFs, decks and images show a small thumbnail (the first page, the deck's picture, or the image) in place of the file icon, as the turn left them; a file rewritten since, over 64 MiB, or that needs a password keeps the icon. Once you open a file in the viewer, its row says Opened instead of New or Changed, also when you opened a later version: at once on the client you opened it on, and on other clients the next time they show the card. Thumbnails load one at a time across all the cards of a client, and give way to an open page map. Files written by shell commands and scripts count, because the card compares file times against a scan taken when the turn started rather than reading tool calls. A turn that changed no documents gets no card, and a stopped or failed turn says so on its card.
- Files a Git checkout wrote do not flood the card. A folder created during the turn that holds a
.gitfolder or file at its end (a clone,git worktree add, a new submodule) becomes one row, such as "proj-gallery/ · New checkout · 65 documents". Any other folder created during the turn that holds more than 12 new files becomes one row too ("New folder · 40 documents"). Show lists up to 12 of its files under the row, with the rest in Documents. The title still counts every file, and a hidden row's files join Previous and Next only once shown. Only new files fold, so a changed file always has a row of its own. A folder that existed when the turn started is never folded: a new file in an existing repository, in a workspace made of several projects, is listed as usual, and so are the files of a folder deleted and made again (rm -rf out, then a build) or turned into a repository (git init, orgit submodule update --initfilling an empty submodule folder). This is decided from the folders the scan sees, without running Git: a branch switch in an existing repository still lists the files it rewrote as Changed, and when only part of the workspace was scanned at the start, only folders with a recorded creation time inside the turn are folded. - "Changed while this turn ran" does not mean the agent wrote the file: a change by you, another agent in the same workspace or any other program during the turn is listed too. A file written, or a folder made, in the second before the turn started counts as new, so a worktree added then still folds into one row. Deleted files are not listed, and folders the scan skips (see What it reads) never appear. In a very large workspace the card says only part of it was scanned.
- Cards are kept in the daemon's memory, like the rest of the timeline rows that plugins add, so they are gone after the daemon restarts. A turn that is running while the plugin restarts gets no card.
- A document opened from a card has Previous and Next buttons with "Document 2 of 4" in the toolbar that step through the card's files in order without going back to the card. Each step opens the file fresh, as if opened from the card. In a viewer tab or on a phone, the app's Back goes to the previous step; in Documents, steps replace the file shown.
- Turn cards are on by default. Turn them off with "Show changed documents after each turn" in Settings, Document viewer, which the Settings link on each card opens (a gear icon on a phone); the setting applies to every client of the daemon. If the app cannot open Settings from the card, the card says where to find the setting instead.
Formats
- PDF: each page is rendered as an image at the width of the view, with Previous and Next page buttons and a page number field to move through the document. Pinch with two fingers on iOS and Android, double tap, or use the zoom buttons to enlarge pages, slides and images up to 3x, re-rendered sharper, and drag with one finger to pan. The text button shows the page's text instead, which you can select or copy in one tap. A password-protected PDF asks for its password first.
- PDF page map: Pages shows a grid of page thumbnails that load as you scroll; tap one to open that page. Pin pages with an optional label and return to them from the map. After the file is rewritten a pin says it may need checking, because page numbers cannot follow inserted or deleted pages.
- Word (.docx): a reading view with headings, paragraphs, lists, tables and pictures. It shows the content, not the printed page layout. Long documents are read in pieces as you scroll, and their footnotes are not shown.
- Excel (.xlsx): sheet tabs and a grid of cell values, paged 200 rows and up to 50 columns at a time, fewer columns on a phone. Numbers follow the cell's number format, such as percentages, currency, fixed decimals, thousands separators, times and durations. Dates show as year-month-day. A formula without a saved result shows as its formula text.
- Spreadsheet details: tap any cell to inspect what the file stores (formula, saved result, raw value, type and number format), kept apart from what the grid displays. Records shows one row as a card labelled by a header row you pick. Issues lists error cells and formulas without a saved result within a time and row budget, and says which rows it inspected. Nothing is recalculated, so saved results can be stale. The header row you pick is remembered per sheet until the app reloads, in memory only, and no cell contents are stored.
- CSV and TSV: the same grid as Excel, one sheet per file. Quoted fields, line breaks inside quotes and a UTF-8 byte order mark are handled; .csv splits on commas and .tsv on tabs. Text that is not UTF-8 is read as Latin-1.
- JSON Lines (.jsonl, .ndjson): one row per line in the same grid. Columns are the keys found in the first 1,000 records; nested objects become columns such as
meta.model, up to 3 keys deep and 500 columns, and arrays stay in one cell with their item count first. A line that is not valid JSON shows its error in its row, and Issues lists invalid lines and keys that first appear after the first 1,000 records, by line number. Records labels each field by its key and can show the whole record as JSON. - Parquet (.parquet): the same grid, with struct columns flattened like JSON Lines and each column's Parquet type in the cell inspector. Only the footer is read to open a file, and each page reads only the row groups and columns it shows. Snappy, gzip, Brotli, Zstandard and LZ4 compression are supported; LZO is not. Decimals show as floating-point numbers.
- Long values: the grid cuts cells at 2,000 characters. In the cell inspector, Show full value reads the whole value (up to 256 KB) when you ask, wrapped and selectable, with a Copy button.
- PowerPoint (.pptx): each slide's text and pictures in order. Zooming enlarges the text too. It does not reproduce the slide layout.
- A deck's tile in Previews and on turn cards is a preview, not a rendered slide: the picture PowerPoint saved with the file if there is one (JPEG or PNG; WMF and EMF are skipped), else the first picture on slide 1, else slide 1's title on a 16:9 card (a turn card keeps the icon then). It reads only those parts of the file, within the same limits as the viewer, behind the document you are reading and outside its cache, runs no other program and is kept per file version.
- Images: PNG, JPEG (with camera orientation applied), GIF, WebP, TIFF and HEIC/HEIF. Images smaller than the view are enlarged to fit it. TIFF, HEIC, WebP and GIF are converted on the daemon so every device can show them.
- Animated GIF and WebP play in the desktop, web and mobile apps. The mobile app plays animated WebP as a GIF converted on the daemon, so long or large WebP animations show their first frame there. Animations larger than 16 MB show their first frame everywhere. While loading, a spinner and byte progress stay visible; Cancel loading keeps the first frame and a Load animation button lets you try again.
- Video: MP4, M4V, MOV and WebM play with their original audio tracks in the desktop and web apps when the device supports the codecs. Files arrive in chunks and load completely before playback, with a spinner, byte progress and a Cancel loading button.
- Audio: MP3, M4A, WAV and FLAC play in the desktop and web apps with play, pause, seek and volume controls, and in the mobile apps through a Play button that streams the file to the app's audio player. Mobile loading shows a spinner and byte progress, and can be cancelled; leaving during loading also cancels playback. Once started, playback runs to the end of the file and has no pause or seek. Files above 32 MiB are not played there. Codec support depends on the device.
- Find in document searches extracted PDF, Word, spreadsheet, JSON Lines, Parquet and slide text, including content outside the current view. Results open the page, text section or cell and highlight the selected match. PDF matches are highlighted in place on the rendered page, which scrolls to the selected match; a match without page geometry opens the page's selectable text instead, scrolled to the match, without changing the mode saved for the document. Ctrl/Cmd+F works while the viewer has focus. Search continues on its own and shows a running count until the document is done or 500 results are listed. Text extraction limits still apply, and scanned pictures are not searched.
- PDF and slide pages, image zoom and spreadsheet sheet/window positions are remembered when reopening. The reset button resets only the reading position. Positions are shared across clients using this daemon, except zoom, which is kept separately for phone-sized and wide layouts so a desktop zoom never crops the page on a phone; Word scrolling and media playback time are not remembered yet.
- Download original prepares a file and then offers Save original, including when previewing fails. It saves the original bytes under the original name, with a 128 MiB limit, and shows a spinner and a cancel action while preparing. Only the file types listed here can be downloaded, and never from hidden files or folders. This was checked in the Paseo web app; saving from the mobile app needs host support.
Reviewing
- Mark reviewed records the version of the file you were looking at. The document toolbar and Documents then show a Reviewed pill, or Changed since review when the file changes, and Documents offers a Needs review filter. Opening or scrolling never marks a file reviewed. Review marks are shared by every client of the daemon and do not compare content: a rewrite that changes only the file's times also counts as a change. Press Mark reviewed again to clear a mark. Files that appeared or changed since you last opened Documents in the workspace, and were never reviewed, show a New pill and filter; the first visit marks nothing as new, and a visit counts once per 30 minutes. Opening a file in the viewer clears its New pill until the file changes again, and turns its rows on turn cards to Opened. Like review marks, visits and opened files are shared by every client of the daemon: opening a file on your phone clears its New pill on the desktop too.
- On a PDF, Add note writes a note about the page you are viewing, optionally with that page's image. Notes from every file in the workspace collect in the Review notes screen, where you can edit or remove them, preview the exact message, copy it, or send it to an agent you pick in the workspace (the most recently active idle agent is selected first, and stays selected if it turns busy). Notes on a file that changed since are marked as an older revision.
- Sending goes only to an agent with no turn in progress and no pending permission: the viewer reads the agent's state again right before sending and refuses if it is busy, and it never asks the daemon to interrupt. One gap remains: if a turn starts in the moment between that check and the send, the daemon adds the review to the running turn on providers that can steer, and replaces the turn on the others. Closing that gap needs an idle-only send in Paseo. A refused or failed send keeps the draft. To offer recipients, the screen reads the workspace's agent list (titles and status) through your daemon.
Limits
- Video does not play in the mobile app yet; it shows the file type and size instead. Media larger than 256 MiB does not play, and media over 32 MiB starts loading only when you ask.
- Clicking a file in the Files tree does not open it here, because Paseo does not let plugins handle file previews yet. Use the Documents panel, the Command Center or
/doc. - Each response is kept under 8 MB. Large pictures are scaled down to fit, and pictures that still do not fit are left out with a note. Very long cells are cut at 2,000 characters in the grid (Show full value reads up to 256 KB), and the text of a PDF page at 100,000 characters.
- File size caps: 512 MB for PDF and JSON Lines, 2 GB for Parquet, 64 MB for Word, Excel, CSV and PowerPoint, 128 MB for images. A JSON Lines line over 16 MB is shown as an invalid line. A Parquet row group that would hold more than 64 MiB of column data in memory (compressed plus uncompressed, for the columns read) is refused before reading; write such files with smaller row groups. Office files that would unpack to more than the plugin can safely hold are refused. Images above 40 megapixels are not decoded.
- Only the first 500 sheets of a workbook are listed. Row and column counts of very large sheets may be estimates.
- Scanned PDF pages and text drawn as outlines have no text to show or copy.
- On a zoomed page, a fast swipe toward the right can still open Paseo's sidebar on Android, and on iOS the sidebar gesture takes priority over panning.
- The password of a protected PDF is sent to the daemon to open the file and is not stored. The viewer keeps it in memory while the document is open, so you enter it again when you reopen the document.
- PDFs with certificate security, password-protected Office files, and the older .doc, .xls and .ppt formats are not supported. You see a message saying so.
What it reads
For document content, the plugin reads files inside the workspace directory. Paths that lead outside it, including through symbolic links, are refused. To build the recent list it scans the workspace, newest folders first, skipping hidden folders, node_modules, __pycache__, venv, target, vendor, and Office lock files. Build output in build, dist and out is scanned last. List, Details and Previews show at most 50 files at a time, and Tree up to 1,000, the most recently changed; search or pick a type to reach older ones. In very large workspaces the scan stops after 50,000 entries, reads at most 5,000 entries of one folder and skips folders more than 16 levels deep, so search does not find files beyond those; Documents says when any of this happened. It reuses a scan for a few seconds (longer when scanning is slow) instead of repeating it for every request, and while the list stays the same, a refresh gets a few bytes back instead of the whole list. For turn cards it scans the workspace the same way when a turn starts and again when it ends, both times afresh, also noting when each folder was created and which folders hold a .git entry, without reading inside it. A start scan begun in the second before is reused, so turns starting together share one, and nothing is scanned while Turn cards is off. It never writes project files. It makes no external network requests: rendered pages go only to your Paseo app, and review notes go only to the agent you send them to.
Review notes
Review notes stay in the app's memory on this device. They are not written to disk and are lost when the app reloads. Nothing leaves the device until you press Send review, which sends one message through your Paseo daemon to the agent you chose. The message contains the file paths, the modified time and size of the version you viewed, page numbers, the labels of pins on those pages and your note text. It also contains the page images you attached: at most 5, each at most 2000 px on each side and about 2 MB, rendered by the daemon from the file at that revision. They become part of that agent's conversation, and so reach whatever model provider that agent uses. Copy review copies the text only.
Saved viewer state
For each document you open, the daemon host keeps a record in positions.json, keyed by a hash of the workspace and file path (salted with a random secret stored beside it, so the file does not list path names). A record can hold the reading position (page, zoom for phone-sized and wide layouts, and text mode, or sheet number and row and column window), page pins (page number, the optional label you typed, and the file revision when pinned), a review mark (the reviewed revision and when you marked it), the revision the viewer showed when you last opened the file and when (this is what clears New, and what turn cards show as Opened), and when the record last changed. A revision is the file's size and modification and change times. Passwords, sheet names, review notes and document contents are never stored. It keeps up to 500 documents and at most 1 MiB, dropping the least recently changed first, which also drops their pins and review marks. Writes take a lock file (positions.lock) and re-read the file under it, so daemons sharing the folder merge their changes. A file that cannot be read is kept as positions.json.bad instead of being overwritten. For the New filter, visits.json in the same folder keeps, per workspace (keyed by a salted hash), the time you last opened Documents there, for up to 200 workspaces. tips.json holds only when the first-run tips were dismissed, shared by every client of the daemon. documents-view.json holds the Documents view chosen for phone-sized and for wide layouts; its writes take documents-view.lock the same way and keep views a later version saved, and a damaged file is kept as documents-view.json.bad.
The folder is $PASEO_DOC_VIEWER_STATE_DIR when set to an absolute path, otherwise $XDG_STATE_HOME/paseo-doc-viewer, otherwise ~/.local/state/paseo-doc-viewer. A daemon whose PASEO_HOME is not ~/.paseo uses a homes/<hash> folder inside it, so an isolated daemon does not share state with your usual one. Remove a pin with its X button and press Reviewed to clear a review mark. The reset button resets only the reading position. To clear everything, delete the folder while the daemon is stopped.






