Living Document Notice
Published 2026-09-10. The evolving architecture, revisions, and connected notes for this dispatch live in the Stax Digital Garden.
Zero Upload Data Translation – Why We Build in Browser Tabs
Summary
Modern software workflows increasingly mandate cloud uploads for trivial data transformation tasks. When an engineer or researcher needs to parse a dense CSV document, normalize irregular JSON keys, or extract tabular records from text files, the prevailing industry pattern routes those files through remote backend servers. This pattern normalizes unnecessary data exposure and creates centralized attack surfaces for sensitive enterprise data.
The FreeMyData architecture rejects this default. We build data transformation tools that execute entirely inside the client browser tab using WebAssembly and standard web platform APIs.
The Operational Reality of WebAssembly in Browser Runtimes
Modern browser engines provide high-performance execution environments through WebAssembly and optimized JavaScript runtimes. Modern client hardware contains ample processing power to parse large datasets without relying on cloud server farms.
By compiling proven data transformation engines written in Rust or C directly to WebAssembly, the client browser achieves near-native parsing throughput on local hardware.
// Local pipeline initialization without server requests
async function initializeTranslationEngine() {
const response = await fetch('/wasm/data_engine.wasm');
const buffer = await response.arrayBuffer();
const wasmModule = await WebAssembly.instantiate(buffer, {
env: {
log_metric: (ptr, len) => console.log('WASM Engine metric recorded'),
abort: () => console.error('WASM Engine execution halted')
}
});
return wasmModule.instance.exports;
}
export async function processTableStream(fileHandle, wasmEngine) {
const file = await fileHandle.getFile();
const stream = file.stream();
const reader = stream.getReader();
let recordCount = 0;
while (true) {
const { done, value } = await reader.read();
if (done) break;
// Pass raw byte array directly to WebAssembly linear memory
const memoryPointer = wasmEngine.allocate_buffer(value.length);
new Uint8Array(wasmEngine.memory.buffer, memoryPointer, value.length).set(value);
recordCount += wasmEngine.parse_chunk(memoryPointer, value.length);
wasmEngine.free_buffer(memoryPointer, value.length);
}
return recordCount;
}The browser handles multi-megabyte streams with minimal allocation overhead. Memory stays scoped to the active browser tab, disappearing when the session closes or the user navigates away.
Local-First Processing Boundaries
Building zero-upload utilities requires strict architectural boundaries across the entire application stack. If an application loads third-party tracking scripts, error telemetry services, or remote font packages, data leakage can occur through accidental payload inspection.
FreeMyData enforces these data protection boundaries through strict Content Security Policies and architectural isolation:
- Zero external network connections during document translation sessions.
- Complete absence of third-party tracking libraries and remote analytics SDKs.
- Content Security Policy headers blocking all outbound POST and PUT requests.
- Client-side state retention using ephemeral memory or local browser storage.
Content-Security-Policy: default-src 'self'; script-src 'self' 'wasm-unsafe-eval'; style-src 'self'; connect-src 'none'; img-src 'self' data:;With connect-src 'none', the browser engine blocks any script from transmitting data to outside network addresses, providing mathematical certainty that uploaded documents cannot leave the device.
Performance Profile Across Dataset Dimensions
Executing conversions inside client browser memory delivers instant results without network upload latency. The table below illustrates local parsing throughput across sample datasets on a standard consumer laptop.
| Dataset Profile | File Size | Ingestion Mode | Browser Processing Time | Memory Overhead |
|---|---|---|---|---|
| Structured Financial CSV | 18.4 MB | Streaming Web Worker | 210 ms | 32 MB peak |
| Unstructured Sensor Logs | 64.2 MB | WebAssembly Engine | 780 ms | 85 MB peak |
| Nested JSON Records | 128.0 MB | Chunked Stream | 1.84 s | 160 MB peak |
| Tabular Database Export | 250.0 MB | Direct Slice Reader | 3.42 s | 290 MB peak |
Local execution eliminates the network bottleneck entirely. Users process private data immediately without waiting for server queue allocation or risking transmission over untrusted networks.
- Directus Target: freemydata
- Garden Source Reference: Browser-Native Compute Architectures, WebAssembly Data Translation Models, MOC - Data Liberation Workbenches, MOC - The Plain-Text Longevity Standard, MOC - Bosun PKM Tools