Skip to main content

A teaching-oriented simulation of system call formatting in Python

Project description

๐Ÿš ShellKit (libc + pysh)

Learn how echo works from shell to syscall โ€” all in one Python playground.

Python Version PyPI version License: MIT Platform Languages CI

English | ็ฎ€ไฝ“ไธญๆ–‡ | ๆ—ฅๆœฌ่ชž | ํ•œ๊ตญ์–ด


๐Ÿ“– Overview

ShellKit is a Unix-like educational terminal toolkit consisting of two main components:

  • Libc: A Python-based simulation of core C library calls such as syscall, write, and printf. It walks through the transition from user space to kernel space.
  • Pysh: An interactive shell built on top of Libc, featuring internal commands, REPL execution, cross-layer tracing, and multilingual support. Designed for system developers and terminal enthusiasts.

Runs on both macOS and Linux, supporting Arm64 and Intel x86_64 architectures.

โœจ Features

Pysh

  • ๐Ÿง  Built-in commands (cd, echo, pwd, env, etc.)
  • ๐Ÿงต Multilingual support with full manuals (EN/CH/JP/KR)
  • ๐Ÿ” Cross-layer tracing: from command parsing โ†’ libc functions โ†’ C-level syscalls
  • ๐Ÿงน Composable REPL execution model
  • ๐Ÿ”Œ Pluggable command registration system

Libc

  • ๐Ÿ“จ Custom printf engine with %s, %d, %f format specifiers and escape sequences
  • ๐Ÿ“œ Native syscall bridge (Python โ†” C) via syscall/syslib.so
  • ๐Ÿงช Unit-tested via pytest, with benchmarks for key libc behaviors

๐Ÿ“ฆ Installation

Requires Python 3.10 or newer

Install via pip:

pip install shellkit

After installation, launch the interactive shell with:

pysh

๐Ÿš€ Usage

pysh [options]

CLI Options

Option Description
--command Run a single command
--no-banner Skip the startup banner
--no-reminder Disable rest reminder messages
--quiet Quiet mode with minimal output
--safe Enable safety mode (blocks dangerous commands like rm -rf /)
--debug Enable shell-level debug output
--trace-echo Trace echo/printf calls down to libc syscall layer

For more, run:

pysh --help

๐Ÿ“š Examples & Tutorials

Want to see ShellKit in action? Check out our comprehensive examples:

โ†’ Examples & Demos - Real terminal sessions from basic to advanced features

Complete with multilingual demos, debugging tutorials, and advanced printf formatting!

๐Ÿ“ฆ Project Structure (partial)

shellkit/
โ”œโ”€โ”€ native/         # C code for native syscall implementation (builds syslib.so)
โ”œโ”€โ”€ shellkit/       # Main package
โ”‚   โ”œโ”€โ”€ syscall/    # Python-side syscall wrappers via ctypes
โ”‚   โ”œโ”€โ”€ libc/       # Custom libc (printf, write, exit)
โ”‚   โ”œโ”€โ”€ shell/      # Core engine, built-in commands, runtime, REPL
โ”‚   โ”œโ”€โ”€ inspector/  # Debugging and tracing tools
โ”‚   โ””โ”€โ”€ i18n/       # Multilingual dictionaries and support
โ”œโ”€โ”€ benchmarks/     # Performance benchmarks
โ”œโ”€โ”€ examples/       # Usage examples and demo logs
โ””โ”€โ”€ tests/          # Test suite

๐Ÿฅ‰ Platform Support for syslib.so

Platform Supported Notes
Linux x86_64 โœ… Yes Uses rax = 1 + syscall
Linux ARM64 โœ… Yes Uses x8 = 64 + svc #0
macOS Intel (x86) โœ… Yes Uses rax = 0x2000004 + syscall
macOS ARM64 (M1/M2/M3) โœ… Yes Uses syscall(SYS_write, ...) (soft wrapper)
Windows โŒ No Not supported; lacks a unified syscall() ABI

๐Ÿ“Œ Changelog

See CHANGELOG.md for version history.

๐Ÿ“œ License

MIT License. See LICENSE for details.

๐Ÿค Acknowledgments

Inspired by the spirit of classic Unix shells.
Thanks to all system programmers and terminal geeks who paved the way.

Project details


Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

shellkit-0.1.0-cp313-cp313-musllinux_1_2_x86_64.whl (209.2 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

shellkit-0.1.0-cp313-cp313-musllinux_1_2_aarch64.whl (209.6 kB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

shellkit-0.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (210.0 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

shellkit-0.1.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (209.1 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

shellkit-0.1.0-cp313-cp313-macosx_11_0_arm64.whl (206.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

shellkit-0.1.0-cp313-cp313-macosx_10_13_x86_64.whl (205.8 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

shellkit-0.1.0-cp312-cp312-musllinux_1_2_x86_64.whl (209.2 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

shellkit-0.1.0-cp312-cp312-musllinux_1_2_aarch64.whl (209.6 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

shellkit-0.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (210.0 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

shellkit-0.1.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (209.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

shellkit-0.1.0-cp312-cp312-macosx_11_0_arm64.whl (206.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

shellkit-0.1.0-cp312-cp312-macosx_10_13_x86_64.whl (205.8 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

shellkit-0.1.0-cp311-cp311-musllinux_1_2_x86_64.whl (209.1 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

shellkit-0.1.0-cp311-cp311-musllinux_1_2_aarch64.whl (209.6 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

shellkit-0.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (210.0 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

shellkit-0.1.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (209.1 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

shellkit-0.1.0-cp311-cp311-macosx_11_0_arm64.whl (206.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

shellkit-0.1.0-cp311-cp311-macosx_10_9_x86_64.whl (205.8 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

shellkit-0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl (209.1 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

shellkit-0.1.0-cp310-cp310-musllinux_1_2_aarch64.whl (209.6 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

shellkit-0.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (210.0 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

shellkit-0.1.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (209.1 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

shellkit-0.1.0-cp310-cp310-macosx_11_0_arm64.whl (206.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

shellkit-0.1.0-cp310-cp310-macosx_10_9_x86_64.whl (205.8 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

File details

Details for the file shellkit-0.1.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 669ede4f562b804478440b899a649a025e2299eb4b14f904b30dcf03f36c9f2b
MD5 27124ac6072ef46f252ba21946d1dc64
BLAKE2b-256 8bd92f1062c3cdcfee0baa93ba6935cb817bca43c77cbd0ae7d3137f48837b4c

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7034d3429c2207c740879546dd8edb20500d389bd3b3902924e5300e0b62558d
MD5 a0f5d38abf70afec7ea6b190aab5d3da
BLAKE2b-256 79f75e26cc439b705922c84f2ad101718e5d9e0cd17e7f63d9600fa79a64716e

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 2dd741cbad1cef8930455c64cf12e41a09238fbe1177639e948f00b28694db02
MD5 0c236b7fb7970abe86d64bc4be898d6a
BLAKE2b-256 a186d42d04d731eb98e205f49b28d30860ed0c60b9654ff6aa17f3d84f5a3a2c

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 b0188671413e5fa7c6a0f5be9a6cadb4f60833513f3b121381128811247959e4
MD5 c0af4d285bacb2c82766a7148f7e5b29
BLAKE2b-256 73d7958a2a1a4ff08f6c872f1e36765a8f0f26ec7106877febf3f653cca1f66d

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e93340c9ab15fe2bde275a8820884c665cdff2b6044fb910fd3da36b09f6f0f8
MD5 934ab7cc89769bd6dc25c70feabb7166
BLAKE2b-256 6c897a94a7dc39b2f45f8878c7b468efb1df765ce1e636c52837a2d05c0b141f

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 62781c01ab8f8615c0c697c1bc3bbaa35c27149bf60aeb3da2b14344d5c7c9fc
MD5 acdafd10b87ed2916ffb590556ef78d3
BLAKE2b-256 4575e3305cb99edc54b420eea418fea937ddbe0219bdbe911b9b433f44b0b3b7

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 3719b5fd8685f4ef89dfc5fdb6557472f95b8d144e24fde447ad3d7f635dcbca
MD5 7f8cf2de2856920309050213c0059e4e
BLAKE2b-256 4466d7d78b5ab0419268aaa1e8753acb7087c449e1ee96658556c09d2aced839

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 7644d1ce60bd17d68d919bc3df28d4877d9c3fc6bb63654ad5d479a74f09995d
MD5 13ad61e698b27cc4aa0cf3cbfc1c467f
BLAKE2b-256 bc1d6cf2be91698afb8715231c01c71c003f0cd43c97462d790d93394afa88b5

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7707e37c2c2692ab937105010975350712a8d8275fd548844d50f2629cace926
MD5 454ca1a4d30266b6e8e897cffe764bf4
BLAKE2b-256 ad632d1c4508c7d7d29686803610bff7aa95ece1c03b86adfc8a202aa8c3a40c

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 6d1a8969068ed8466bddd02a70354bd5abfb86e418cf07928d46131d3c6189a5
MD5 f149be2c195f0c2f4e461166d45b16ff
BLAKE2b-256 f7c13682423baafbe468fe49f13aa8151c72f6d243a4de615cde141099a15391

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 41b80b20d7a2491dc33ee717fe099994caf0a0a26f05b0b45583225762fe36e9
MD5 8060142d57bb7c0b5387d0cd62fe4df1
BLAKE2b-256 dfdaf2b03bd670958283ffafa22fbd79bf2aee6f89707a091cdcf6c901997d14

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 cfc3391d0d48dcfc8ea9e922a441ddc8558b6082a32c5aa65ec3511cae8d8e17
MD5 8fedfda179c9352b0e140dd6707d0626
BLAKE2b-256 8385bada5a40bb6fd9ddff1b2639982a36419d71769fadc9105d40e2ba64a6b6

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4e96f71bc9395011a77a05b23282182ee81ec5893cdd3b5772c934ebf4f20965
MD5 5952e6ee353a4158318bf718c7476428
BLAKE2b-256 19b9f0c893c4cf0f83fe89a7a4e1e92e4293a467216bcca8f9e7f229056cd933

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 b36c633e55667b3b44eaccdaab51ae8ec96a66b9e189835d10bc7f4dfcd35f6a
MD5 3a737d6c616c097894fe9a00b83d216d
BLAKE2b-256 10a6deee4580170fad6763a59e908f5705ff00f19f2c5f28c3bdf2a9ab7a5fbc

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 ceb843ac1b27413fb9030d85edf8f9ab02b0e4d823170cd6014b9da75d5ffc46
MD5 8c0102eba70fc8c5384b742588c6123e
BLAKE2b-256 de57db8630a2ca511013069de135dd2c13ff772755c3ade94fc871aad42a607f

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 3537b0609ea618edd5746a3a8c86db3d9b8cdfae18ec77d60916da841f8b85d5
MD5 741224c4c0f7242b26cbe3f3813ec98d
BLAKE2b-256 76cded95f68d99cda8fab907f769eb583f2f0b43cde5a64b7f321ab15ffaf0ed

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7207bdf63de9bb368cfc3d654e497a44b08c23d69fbceed4eab8175d58ed9fb2
MD5 5cad494f1e3c2202f712cbd9ca85e960
BLAKE2b-256 aff8e6b8f3b452f33a216414be81844fb97b787e9e056a30d3b86f0adefa8433

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c8f08a66c9f483b741d6e1d413f11a4b39df9a559c1d0d6607896a3c73008784
MD5 82c3ff471970b43f5552a6c29da23169
BLAKE2b-256 d9e9aae19b119c560bd944fef29ab5bd45fdfb03c18093d365f044cfecab8ef7

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 c1ba205b21acba8d02dba417f53ca1b0f2b537899e1ee9da7a34a53d081cbdae
MD5 ff6bb24af687f58b9027f1a13fed6918
BLAKE2b-256 f84c6f9b69d6952ec6c09f0a3916d3dc830a822fde25f00a70325b3e96207427

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 4931330e26173d9405cb9d6a0dc6c1c521e39c0b95ed0eaa1de7c8e675ddc77c
MD5 7a598a9fb5f0222f0e41aabbc995e954
BLAKE2b-256 a277d545cf68dec21a3dedb0a9c150e4f2959804a565dad7858aead6c78d6871

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 0c40b8f2c58410e3675625b9ae66e89e76049c2e73b6989500de470405e46a5e
MD5 c1d12d67c8e0c4761de7bc52c6f9f968
BLAKE2b-256 96363e4da414c2f22f6c469c76cce6252c9487bcc01cc397abf793a8f8724239

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 c01f7545ce7c0a900eece2775f652f2e6280564d8933a1e7db1cd8680fa1e658
MD5 7f85ea46bb205e06352f532b883e09b2
BLAKE2b-256 ef7e1d953bba0e43877b97fe6f42623f6d7c1cb27876382961b44833f5c53219

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cb6a9de64353aa803ffb3057ca90c1db227bd97f0dc6b0a3370a3ee791ad60fa
MD5 f58aa5aa5e7cba354c135517b03d1ce9
BLAKE2b-256 ea8474ef16e16130d5ac14377194edff6d9b4a1804a6353bcec0691daf89aac0

See more details on using hashes here.

File details

Details for the file shellkit-0.1.0-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for shellkit-0.1.0-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 c0c11b6d8e8a9f56dd8f122cc44082f84028d0a0f7d670d7f21bb274d26a9010
MD5 3ad27436e4f6605e45df16d4e133236f
BLAKE2b-256 efbb7021b058b3dbcf806153400e382150ca030d90ceb1523985c5ed24cb8609

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 Pingdom Monitoring Sentry Error logging StatusPage Status page