Perfect World Project · Foreign Exchange

The records exist.
Nothing you own can open them.

Ask a city for its files and you get WordPerfect ordinances, Lotus budgets, dBASE permit logs, Excel 95 salary tables, Outlook .msg dumps, and TIFFs of paper. None of it is secret. All of it is unreadable in practice, which does the same work as secret and costs the agency nothing.

This is the desk that changes the money. Hand it a currency nobody accepts anymore and it gives you back plain text, CSV, and JSON — identified by its bytes, never by its file extension, with the exchange recorded line by line so anyone can check the rate.

01Drop a file

One file, read in memory and thrown away. Nothing is stored, nothing is logged, and nothing leaves this server. To convert a whole vault, use the command line below — that runs on your machine and never uploads anything.

or drag one here — .doc .wpd .wk1 .dbf .xls .msg .pdf .zip .dbf .shp, or anything at all

stateless · 25 MB limit · nothing retained

02What the desk accepts

Generated from the running code, so this page cannot promise more than the engine delivers. Where the rate is poor, it says so.

full — the content is read properly · tables — the grid comes out · text — the words, not the layout · partial — real but knowingly incomplete · detect — identified precisely, with the tool you'd still need named. A format we can only half-read says so; that honesty is the difference between an archive and a pile.

03Convert a whole vault

The engine is pure Python with no dependencies. Copy the folder onto any machine with Python 3.9 or newer — a laptop, a library computer, a Raspberry Pi — and it runs. Start with scan: it reads nothing into a database and writes nothing at all, it just tells you what you were sent.

# what did they actually send us?
python3 -m app.foreign_exchange scan ./vault

# convert it, keeping the originals
python3 -m app.foreign_exchange convert ./vault \
    -o ./bundle --keep-originals --sqlite

# one file, in detail
python3 -m app.foreign_exchange inspect odd-file.doc
# what comes out
bundle/
  manifest.json     census + what ran
  records.jsonl     one object per file
  dataset.csv       the same, flat
  text/<id>.txt     extracted text
  tables/<id>.N.csv extracted grids
  provenance.jsonl  every success AND failure
  originals/        byte-for-byte sources

Every record carries the SHA-256 of the original bytes, which adapter read it, and whether the conversion lost anything. Files that could not be read are in the bundle saying so, rather than quietly missing. An archive that can't show its work isn't evidence.