Skip to content

Performance budget

What each @aparte package weighs, how soon a streamed chunk is on screen, and what a 500-message conversation costs — the ceilings every change is checked against.

On this page

These are ceilings, not averages: a change that crosses one fails the checks that every pull request runs, and raising a ceiling is a decision written in the change that needs it, with the reason.

WhatCeilingHow it is measured
A streamed chunk, to the screen95% of chunks within 50 msA reply of 145 small Markdown chunks, 20 ms apart, through the real provider, client and renderers. Each chunk is timed from the moment it leaves the network layer to the first frame whose text shows it.
A 500-message conversation, in memory20 MB of heap500 messages set at once (half of them answers with bold text, code and a list), the heap read after a forced garbage collection, against the same page before them.
A 500-message conversation, drawn1500 msThe setMessages call for those 500 messages, until it returns.

Measured in Chromium (the heap is read through the DevTools protocol) on every pull request, with no other test running beside it: a time measured beside other tests measures them too. The numbers each run measured are in its log.

What a page downloads to start a working chat — the chat with Markdown while it streams, its own client for any OpenAI-compatible API, and the agent loop with tools and approvals — is 119.5 KB of JavaScript and 22.5 KB of CSS, gzipped, measured with aparté 0.32.1 (the comparison shows the method and the other libraries).

What each package ships, every JavaScript and CSS file gzipped at level 9 and summed (source maps and type declarations do not reach a browser), may not exceed:

PackageJavaScriptCSS
@aparte/angular32.3 KB—
@aparte/core250.3 KB23.8 KB
@aparte/docs-mcp4.0 KB—
@aparte/engine4.3 KB—
@aparte/locales24.0 KB—
@aparte/plugin-approval3.0 KB—
@aparte/plugin-artifacts18.0 KB—
@aparte/plugin-ask-user7.5 KB—
@aparte/plugin-cards188.0 KB—
@aparte/plugin-chartjs12.0 KB—
@aparte/plugin-compaction9.8 KB—
@aparte/plugin-echarts13.0 KB—
@aparte/plugin-katex2.3 KB—
@aparte/plugin-marked5.0 KB—
@aparte/plugin-mermaid6.3 KB—
@aparte/plugin-model-selector8.8 KB—
@aparte/plugin-shiki1.5 KB—
@aparte/plugin-storage-idb3.3 KB—
@aparte/plugin-streaming-markdown1.5 KB—
@aparte/plugin-titler0.5 KB—
@aparte/provider-ai-sdk4.3 KB—
@aparte/provider-openai-compat9.5 KB—
@aparte/provider-scenario6.5 KB—
@aparte/provider-transformers10.8 KB—
@aparte/react5.0 KB—
@aparte/runner-ag-ui10.5 KB—
@aparte/runner-n8n10.0 KB—
@aparte/svelte5.0 KB—
@aparte/vue5.5 KB—

A package’s figure counts everything it ships, including the parts a page loads only when it uses them (a card’s own code, a chart library’s adapter): it is the weight npm serves, an upper bound on what a page loads.