Skip to main content

soon

The next command, before you type it.

A local-first terminal agent that predicts, repairs, and suggests your next full command.

crates.io PyPI CI License: MIT

Website · v0.5.0 Hybrid Prediction Engine · Roadmap

Beta status: v0.5.0 ships the opt-in Zsh ghost-suggestion loop, the measured contextual policy as the local default, and optional model-backed Rerank, Repair, and explicit Generate paths. Interactive integration is supported on native Linux and macOS; other shells and packaged platforms remain experimental unless listed in the release contract.

An 18-second terminal demo: a failed Git command triggers a local Repair suggestion, Ctrl-F accepts it into the editable buffer, and the user decides when to execute it.

Try the beta

Install the same v0.5.0 release through Cargo or PyPI:

cargo install soon
# or: python -m pip install soon-bin

Enable the integration for the current Zsh session:

eval "$(soon init zsh)"

At an empty prompt, soon computes in the background and renders one dim full-command suggestion. Press Ctrl-F to place it in the editable buffer, then review, edit, or run it yourself. Start typing to ignore it. soon never presses Enter for you.

The default prediction path uses local history, not a model or network service. It can choose a Next-step suggestion after success, a Repair suggestion after failure, or predict on demand when you run soon.

The v0.5.0 package defaults to the local contextual policy after it passed the replay promotion gate. Model-backed candidates remain disabled unless explicitly configured or requested with soon generate.

The idea

Your shell already knows what you typed. soon asks a different question: given the workflow you just followed, what complete command are you likely to run next?

The agent is a small local feedback loop:

  1. Observe the completed command and its result.
  2. Remember only safe, useful local context.
  3. Rank complete commands from recurring transitions.
  4. Render one editable ghost suggestion without blocking the prompt.
  5. Learn whether it was accepted, executed, or dismissed.

Why another shell tool?

Tool category You provide It returns
History search, including Atuin and McFly A query or key chord A past command matching the search
Prefix autosuggestions in Fish or Zsh The beginning of a command A completion for that prefix
Prompt-driven command generation A natural-language request A newly generated command
soon's target interaction An empty prompt after a familiar workflow One predicted full command, locally

soon is not trying to replace search or completion. The product succeeds only if accepting a correct prediction is faster than recalling and typing the command yourself.

Keep it enabled

Add the same eval line to ~/.zshrc. When no suggestion is visible, Ctrl-F keeps its previous behavior. To remove the hooks and restore the previous binding in the current session, run:

soon-disable

The last background prediction latency is available without printing command content:

print -r -- "$SOON_LAST_LATENCY_MS ms"

Cargo and PyPI are published together from one versioned tag. AUR and standalone binaries remain unsupported until they have tested artifact workflows. To install the current development branch instead:

cargo install --git https://github.com/HsiangNianian/soon

The supported interactive beta surface is Zsh on Linux and macOS. Other history parsers and packaged platforms remain on-demand or experimental. Maintainer guarantees are documented in RELEASING.md.

Use the current prototype

# Predict one full command from the detected shell history
soon

# Inspect the matching evidence
soon --debug

# Confirm which shell and history source were detected
soon which

# Show the most common executables in local history
soon stats

# Measure the current policy against past local transitions
soon replay

# Compare both policies, or switch back to the v0.4 fallback
soon config set prediction.policy v0.4-baseline

# Export aggregate adoption metrics that are safe to share
soon report
soon report --json

# Explicitly ask a configured OpenAI-compatible provider; never auto-executes
soon generate

Override shell detection when needed:

soon --shell zsh

The current source can parse Bash, Zsh, Fish, Nushell, Elvish, PowerShell, and tcsh history. Parsing a format does not mean interactive integration for that shell is complete.

What v0.5 ships

Shipped surface Release evidence
On-demand command plus opt-in Zsh loop Clean-session install-to-uninstall smoke test
Manual, successful-command Next-step, and failed-command Repair triggers Native Linux and macOS lifecycle regression coverage
Retained events plus chronological quality and latency replay Deterministic fixture with a 20 ms Zsh p95 budget
Sensitive-command filters plus idempotent Zsh history import Documented privacy behavior and aggregate-only inspection
Contextual ranking plus opt-in model candidate sources Baseline comparison, mock providers, and a documented 0.5B evaluation

The implementation plan lives in RFC #4. Work is tracked in the public Personal Terminal Agent Project.

How the current predictors work

The v0.4 baseline matches recurring transitions, preserves complete historical commands including arguments, and deterministically ranks result, directory, frequency, and recency evidence.

The contextual policy separates candidate retrieval from ranking, then combines first- and second-order transitions, cwd, optional repository and branch, original time, result, duration, frequency, recency, and accepted/executed feedback. Missing metadata contributes no evidence. Its additive smoothing, weights, debug contract, and deterministic tie-breaking are documented in Contextual prediction policy.

Optional local and OpenAI-compatible sources can rerank safe history candidates, suggest a Repair after failure, or Generate only on explicit request. They have a hard deadline and silently retain the deterministic result on timeout, unavailability, or invalid output. The default is prediction.model_mode = "off". The exact provider payload, output filters, ranking feature, and fallback protocol are documented in Optional model candidate sources.

The small local model gate tested Qwen2.5-Coder 0.5B Q4_K_M on an Intel Mac. It added one exact cold-start Repair across eight public fixtures at 676.2 ms p95, which was enough to validate the optional path but not enough quality evidence to enable it by default.

The v0.5.0 release promotes contextual after it improved exact top-1 without reducing coverage or exceeding the 20 ms p95 budget in both the deterministic fixture and a local aggregate replay. v0.4-baseline remains an explicit offline fallback.

Agent roadmap

The v0.4 Local Agent MVP combines safe command lifecycle events, explicit soon, Next-step after success, Repair after failure, a private history-import path, and measured local replay.

The closed v0.4.1 Adoption Sprint added the public demo, launch assets, and privacy-safe report. The planned ten-user pilot and final timed launch measurements were explicitly closed as not planned rather than reported as completed.

The completed v0.5 Hybrid Prediction Engine promotes the contextual probabilistic ranker from #16 and adds the opt-in local-model/OpenAI-compatible layer from #17. Model output is never required for the default hot path.

Privacy

With the default prediction.model_mode = "off", soon, soon now, soon replay, soon report, soon init zsh, and the local learning commands read files on your machine and do not require a network service. The Zsh integration invokes the predictor in a background process and does not block the prompt while waiting for a result. An opt-in model mode or explicit soon generate may contact only the configured provider.

The current source rejects likely inline API keys, tokens, authorization headers, password flags, private-key material, and known credential prefixes before storing a command or suggestion. It applies the same filter again before ranking or rendering shell history, old event data, legacy learn data, provider context, and model output. Rejections report a category, not the command text.

Add exact case-sensitive exclusions or regular-expression exclusions without editing stored data:

soon config set privacy.excluded_literals 'company-deploy --production'
soon config set privacy.excluded_patterns '(?i)^kubectl .*--context production'

Comma-separated values configure more than one exclusion. Literal values are redacted from soon config, config get, and successful config set output. Invalid regular expressions are rejected before the configuration is saved.

The v0.5 model candidate path sends at most six filtered commands, the current command and result class, and at most five local candidates to an OpenAI-compatible endpoint. It omits paths, repository metadata, event IDs, timestamps, duration, feedback, stdout, and stderr. Model output is filtered again for control characters, credentials, configured exclusions, and dangerous commands before entering the contextual ranker. The older soon learn ask experiment remains separate and includes the filtered current directory.

Provider credentials are read at request time from an environment variable and are never stored or printed by soon. The default variable is SOON_LLM_API_KEY; configure a different variable name with llm.api_key_env. For example, this Zsh flow keeps the value out of shell history:

soon config set llm.provider openai-compatible
soon config set llm.api_url https://provider.example/v1
read -rs 'SOON_LLM_API_KEY?API key: '
print
export SOON_LLM_API_KEY

A local OpenAI-compatible endpoint can run without a credential. The legacy llm.api_key setting is rejected.

The Zsh lifecycle integration stores local command and suggestion events in a retained JSONL log under the operating system's application-data directory. When cwd is inside a Git worktree, the background recorder also reads the repository root and symbolic branch directly from .git/HEAD; it does not spawn git. Inspect the store's exact path, schema version, retention, and aggregate counts without printing command text:

soon events inspect

The default retention is 10,000 events. It is user-controlled, and clearing requires explicit confirmation:

soon config set events.retention 5000
soon events clear --yes

Give a fresh profile useful event memory by previewing a Zsh history import first:

# Uses ~/.zsh_history
soon events import-zsh --preview
soon events import-zsh

# Or pass current and rotated files explicitly, oldest first
soon events import-zsh --preview \
  --path ~/.zsh_history.1 \
  --path ~/.zsh_history
soon events import-zsh \
  --path ~/.zsh_history.1 \
  --path ~/.zsh_history

Plain command-per-line history and Zsh extended history (: <epoch>:<duration>;<command>) are supported. Extended timestamps and durations are preserved; unavailable cwd, exit status, and plain-history timestamps remain unknown. Preview and import summaries report importable, sensitive, malformed, duplicate, and already-imported counts without printing command text. Stable event IDs make repeated imports idempotent, including identical rotated files.

Compare the v0.4 baseline and contextual policy against that local event memory:

soon replay

Replay follows JSONL append order rather than event timestamps. For each linked command transition it predicts first, scores the result, and only then exposes that transition to later samples, so future observations cannot leak into training. Unknown exit status is classified as manual; exit status zero is next-step; any other status is repair.

Samples counts eligible linked transitions. Coverage is predictions divided by samples, and top-1 match is exact command matches divided by all samples. Overall and per-trigger rows preserve the v0.4 baseline metrics. The policy comparison runs both baseline and contextual prediction through the same production module and reports coverage, top-1, p50, and p95 for each. Candidate-source rows retain the computed deterministic-history baseline and separately score other suggestions that were actually recorded before the next command. Model attempts aligned to a later command also report timeout, invalid-output, and deterministic-fallback rates.

The report is aggregate-only: it prints no command text and performs no upload. The deterministic CI fixture has a Zsh hot-path p95 budget of 20 ms. Replay also prints a contextual promotion gate that requires strictly better top-1, no coverage regression, and contextual p95 at or below that budget.

Export the smaller adoption report when sharing beta feedback:

soon report
soon report --json

This is an explicit, offline read of the same local event store. Both forms contain aggregate counters and latency distributions only—never raw commands, arguments, paths, hostnames, usernames, event IDs, timestamps, or database rows. The human form is designed for an issue or discussion; --json is suitable for scripts and uses schema version 2:

JSON field Meaning
schema_version Report schema version; currently 2
samples.eligible_transitions Linked command transitions eligible for chronological replay
samples.predictions Eligible transitions for which the deterministic replay produced a prediction
samples.prediction_coverage_percent predictions / eligible_transitions * 100
suggestions.shown Retained suggestion events with the shown outcome
suggestions.accepted Retained suggestion events with the accepted outcome
suggestions.acceptance_percent accepted / shown * 100
suggestions.executed Retained suggestion events with the executed outcome
suggestions.execution_percent executed / shown * 100
latency_ms.replay.samples Eligible transitions benchmarked by chronological replay
latency_ms.replay.p50, latency_ms.replay.p95 Offline replay-computation percentiles in milliseconds
latency_ms.suggestion.samples Valid shell-observed latency samples from shown events
latency_ms.suggestion.p50, latency_ms.suggestion.p95 Shell-observed suggestion-result percentiles in milliseconds

A percentage is null when its denominator is zero. Each latency distribution has an explicit sample count and returns null percentiles when that count is zero. Suggestion latency counts only valid non-negative shown rows, so later accepted, executed, or dismissed outcomes do not duplicate one displayed suggestion. Human output prints n/a for unavailable distributions.

Schema version 2 replaces the version 1 latency_ms.p50 and latency_ms.p95 fields with latency_ms.replay and latency_ms.suggestion. Use the suggestion distribution for user-facing adoption studies and the replay distribution for policy benchmarking.

Config lives at ~/.config/soon/config.toml:

soon config init
soon config path
soon config get general.ngram
soon config set general.ngram 5
soon config get prediction.policy
soon config set prediction.policy v0.4-baseline  # explicit fallback
soon config get prediction.model_mode            # off by default
soon config set prediction.model_mode repair      # opt-in model path
soon config set prediction.model_timeout_ms 1500
soon config set update.channel cargo  # or pip

Commands

soon                    Predict the next full command
soon now                Run the same prediction explicitly
soon generate           Explicitly request a model candidate
soon init zsh           Print the opt-in Zsh integration
soon stats              Show the most-used executables
soon which              Show shell and history diagnostics
soon config             View or change local configuration
soon events             Inspect, clear, or import local agent events
soon replay             Measure local prediction quality and latency
soon report             Export privacy-safe aggregate adoption metrics
soon learn              Use the experimental learning tools
soon update             Check the configured release channel

Contributing

The accepted direction is recorded in RFC #4. The completed v0.5 Hybrid Prediction Engine delivered the contextual ranker in #16 and the opt-in model candidate layer in #17.

For local verification:

cargo fmt --check
cargo test --locked
cargo clippy --locked --all-targets -- -D warnings
cargo run --locked -- --help

License

MIT © 2025-present HsiangNianian

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

soon_bin-0.5.0.tar.gz (992.4 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

soon_bin-0.5.0-py3-none-win_amd64.whl (2.6 MB view details)

Uploaded Python 3Windows x86-64

soon_bin-0.5.0-py3-none-win32.whl (2.1 MB view details)

Uploaded Python 3Windows x86

soon_bin-0.5.0-py3-none-musllinux_1_2_x86_64.whl (3.1 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

soon_bin-0.5.0-py3-none-musllinux_1_2_i686.whl (3.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ i686

soon_bin-0.5.0-py3-none-musllinux_1_2_armv7l.whl (2.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARMv7l

soon_bin-0.5.0-py3-none-musllinux_1_2_aarch64.whl (3.0 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

soon_bin-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

soon_bin-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl (3.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ s390x

soon_bin-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (3.4 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ppc64le

soon_bin-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl (3.1 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ i686

soon_bin-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (2.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARMv7l

soon_bin-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (3.0 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

soon_bin-0.5.0-py3-none-macosx_11_0_arm64.whl (2.8 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

File details

Details for the file soon_bin-0.5.0.tar.gz.

File metadata

  • Download URL: soon_bin-0.5.0.tar.gz
  • Upload date:
  • Size: 992.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for soon_bin-0.5.0.tar.gz
Algorithm Hash digest
SHA256 81458b0ce22c16c9d85e6f26ae4672a9eeeeaf8404bdf300fe4bdd319296d3cc
MD5 a838bece0aa88efbf2f76222172bc1b6
BLAKE2b-256 9cb7ee670feb5dff9ea767cf2bba7a7e24af0b8e2497f3b3466f383e9dd038a6

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-win_amd64.whl.

File metadata

  • Download URL: soon_bin-0.5.0-py3-none-win_amd64.whl
  • Upload date:
  • Size: 2.6 MB
  • Tags: Python 3, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for soon_bin-0.5.0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 6ebb3853b2bda8bd263e5c326098760eea857ec0a4567031f961d9e6f6c3bde9
MD5 83cb52833b2755f59f21129fe628021e
BLAKE2b-256 0a1664c26c631ab7e64fa99a4c88e26b39ab0d324d55cc529b875e260b968bfb

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-win32.whl.

File metadata

  • Download URL: soon_bin-0.5.0-py3-none-win32.whl
  • Upload date:
  • Size: 2.1 MB
  • Tags: Python 3, Windows x86
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.14.1

File hashes

Hashes for soon_bin-0.5.0-py3-none-win32.whl
Algorithm Hash digest
SHA256 3811091c8a5e4d7651e5b9834f7ff517375c8af084266555712773870257c988
MD5 f121778b897779baf1efd0dad90702c5
BLAKE2b-256 923e9f804b88d7e22c2726bb93eceaba69ee71c30c9c9e432c951816dffc9fae

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 bf1deb025e973cd0396e4b27d61a19cba64007be443baf587519f17132933fef
MD5 00927fdd98194f68c8d6de1e2b22d73f
BLAKE2b-256 ebddd44fbddee17c1d665984e0a670c92f8ce383435d17a296d0c645dc2e3ca4

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-musllinux_1_2_i686.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-musllinux_1_2_i686.whl
Algorithm Hash digest
SHA256 cc8971f2d9f59f1a301b1827711b32f6ea29dbf0b5d9192021d521cf276204f0
MD5 cb8d5baff6140e719d062ebd930c06ca
BLAKE2b-256 9af22a77837264664d1867c3604077d9af60d23bd8458a195796bc9a615b41f4

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-musllinux_1_2_armv7l.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-musllinux_1_2_armv7l.whl
Algorithm Hash digest
SHA256 d6c1076b5abe2d77242561551707472bdd858a91a1948adce4470859a6b93f57
MD5 5ca052edf445bca9a6efdc6a358f3639
BLAKE2b-256 fcf4ad7fe05f698d54765b436e418e92540476e49ae24f2e0f7744d0f0618f1b

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 652e65390cc5792591b139efc4bd7b70ac07329228f9ffd9da32b47d18edaf91
MD5 c8097728772aad4b4a0007b4c9e6fa2d
BLAKE2b-256 fed0db6d070662b1112aed05592c019607e6b6aa2478f184ef224d8c030b16b7

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 5a0a7bff6a8a08cc77274533b5a3b3e3e469aa91daacb3e7b16f682e8521b89d
MD5 0d2b45ceaa8898a8f815deb43e69067b
BLAKE2b-256 ac0114591a4b43f1fe14e88e8894ef1255f1ebe7d401163738027d7a9f229bf0

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 d9a96a9bfa4b82dbc97cc299f3be25d6589b190c58ba282e4431c3fc636bb97a
MD5 a3eb2835f16180d9baa11c281bc39c81
BLAKE2b-256 60d152802c3e566bf6b7e0a1b4603b52586b008c40c88ed0b9dc02046eea5114

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 f699a23a8bde17b3453a12832444294ed918fb3b15794ead4d9e2c50c65f0fb5
MD5 1386bc61c22e7d807dca09087ecc16af
BLAKE2b-256 1d1ec6022efc7fa556a061d4fe2ec1c55a32607f0114b3e5b890540e1568c954

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl
Algorithm Hash digest
SHA256 1ed10ab5203eaee5698e2448937704888c5436e8482c464b9f7b2e41401f9b14
MD5 3d43385fcb787b82281e210a88a69f2e
BLAKE2b-256 252322d6f4642ee07fc76ad0ef4d7771c24574880dd93b098fd90e47d8cb158f

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 f784c4f71e5925aa7f70d487bce0c65146ebbcd42b8725eaaa2a9e503d69a077
MD5 63c613e6d88a30fe47877f85ae37be89
BLAKE2b-256 46fafb7fd74ecf188f33b5cf76c963613839bbdb98a8cd42f85ba57ff7a2b619

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 2b2e2357f67458b4cc983815a22169406b467aefd3252f5d73c72e8f41dd8935
MD5 94c656b55c62c181a2cbd33331621b3c
BLAKE2b-256 73901851eab170012bdc8d20e4d1aa58405b3ecb6386c3ffde3b1e2bf31826e7

See more details on using hashes here.

File details

Details for the file soon_bin-0.5.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for soon_bin-0.5.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5d9feadb07f15f5ebba73e89664f2955c456ceaa5e297ee9a4d5ad1ce77519c1
MD5 65cc63513b618f8d16e32b7a7a9d2f78
BLAKE2b-256 9e1f044d7c00100b36fd02f198492455d6fc1ebfa55140889fdfa61482e954a6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page