[{"data":1,"prerenderedAt":4},["ShallowReactive",2],{"readme-html:EDM115\u002Fminiproto:codex\u002Fv1":3},"\u003Ch1 id=\"miniproto\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"miniproto\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#miniproto\">miniproto\u003C\u002Fa>\u003C\u002Fh1>\n\u003Cp>\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">miniproto\u003C\u002Fspan>\u003C\u002Fcode> is the fast, reusable MTProto engine and SDK for Python. It is async-first, designed for server workloads, and backed by a bundled Rust\u002FPyO3 native layer for crypto, TL, byte-buffer, and other protocol hot paths.\u003C\u002Fp>\n\u003Ch2 id=\"package-boundary\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"package-boundary\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#package-boundary\">Package Boundary\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">miniproto\u003C\u002Fspan>\u003C\u002Fcode> owns MTProto correctness: authorization, sessions, DC migration, transports, encrypted message framing, raw API invocation, generated raw types\u002Ffunctions, update state recovery, peer\u002Faccess-hash handling, media upload\u002Fdownload primitives, and a small set of core convenience methods such as \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">get_me\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>, \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">resolve_peer\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>, \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">send_message\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>, \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">send_file\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>, \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">download_media\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>, and \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">iter_updates\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>.\u003Cbr>\n\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">mpgram\u003C\u002Fspan>\u003C\u002Fcode> is the separate Telegram application framework package. It should depend on public \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">miniproto\u003C\u002Fspan>\u003C\u002Fcode> APIs and own routers, filters, decorators, middleware, command handling, plugins, dependency\u002Fcontext helpers, conversation helpers, bound message methods, and broad high-level Telegram developer ergonomics.\u003Cbr>\nThe sibling \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-title class_\">MPGram\u003C\u002Fspan>\u003C\u002Fcode> repository already exists next to this repository in the same Git folder. The PyPI names \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">miniproto\u003C\u002Fspan>\u003C\u002Fcode> and \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">mpgram\u003C\u002Fspan>\u003C\u002Fcode>, plus the \u003Ca href=\"http:\u002F\u002Fcrates.io\" target=\"_blank\" rel=\"noopener noreferrer\">crates.io\u003C\u002Fa> name \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">miniproto\u003C\u002Fspan>\u003C\u002Fcode>, are already reserved with dummy low-version packages.\u003C\u002Fp>\n\u003Ch2 id=\"native-layer\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"native-layer\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#native-layer\">Native Layer\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The Rust crate lives in \u003Ccode class=\"hljs\">rust\u003Cspan class=\"hljs-regexp\">\u002Fminiproto\u002F\u003C\u002Fspan>\u003C\u002Fcode> and is named \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">miniproto\u003C\u002Fspan>\u003C\u002Fcode> for \u003Ca href=\"http:\u002F\u002Fcrates.io\" target=\"_blank\" rel=\"noopener noreferrer\">crates.io\u003C\u002Fa> ownership. For Python users it is still imported as the private extension module \u003Ccode class=\"hljs\">miniproto._native\u003C\u002Fcode>; direct Rust reuse is not a v1 priority, though the crate layout should not block a future public Rust API.\u003Cbr>\n\u003Cbr>\n\u003C\u002Fp>\n\u003Cp>The wheel declares \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">cryptography\u003C\u002Fspan>\u003C\u002Fcode> and the platform-appropriate \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">uvloop\u003C\u002Fspan>\u003C\u002Fcode>\u002F\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">winloop\u003C\u002Fspan>\u003C\u002Fcode> backend as normal dependencies and is tested on normal CPython 3.13\u002F3.14 plus free-threaded CPython 3.14t with the GIL actually disabled. CPython 3.13t is not supported because the project prioritizes the current PyO3 dependency line. Protected-session AES-256-GCM and Scrypt expose explicit Rust and cryptography implementations; the normal wrappers select Rust per available capability because the actual small, Scrypt-dominated session workload benchmarks faster there, then fall back to cryptography when that native capability cannot be loaded. Manual wheel automation covers Linux glibc and musl on x86_64 and aarch64\u002FARMv8 plus native Windows\u002FmacOS x86_64 and aarch64, installing every wheel with its declared dependencies before runtime acceptance. ARMv7 is not supported.\u003C\u002Fp>\n\u003Ch2 id=\"event-loop\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"event-loop\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#event-loop\">Event Loop\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Importing \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">miniproto\u003C\u002Fspan>\u003C\u002Fcode> never installs or replaces the process-wide asyncio policy. Scripts that own their top-level coroutine can use \u003Ccode class=\"hljs\">event_loop.run\u003Cspan class=\"hljs-punctuation\">(\u003C\u002Fspan>main\u003Cspan class=\"hljs-punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">)\u003C\u002Fspan>\u003C\u002Fcode>; embedded applications keep ownership of their running loop, and advanced callers can pass \u003Ccode class=\"hljs\">event\u003Cspan class=\"hljs-number\">_\u003C\u002Fspan>loop.\u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan>\u003Cspan class=\"hljs-number\">_\u003C\u002Fspan>event\u003Cspan class=\"hljs-number\">_\u003C\u002Fspan>loop\u003C\u002Fcode> to \u003Ccode class=\"hljs\">asyncio.Runner\u003Cspan class=\"hljs-punctuation\">(\u003C\u002Fspan>loop_factory=...\u003Cspan class=\"hljs-punctuation\">)\u003C\u002Fspan>\u003C\u002Fcode>. The legacy \u003Ccode class=\"hljs\">event_loop.install\u003Cspan class=\"hljs-punctuation\">(\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">)\u003C\u002Fspan>\u003C\u002Fcode> helper is an explicit deprecated compatibility path for Python versions before 3.16.\u003C\u002Fp>\n\u003Ch2 id=\"session-security\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"session-security\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#session-security\">Session Security\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>\u003Ccode class=\"hljs\">Client\u003Cspan class=\"hljs-punctuation\">(\u003C\u002Fspan>ClientConfig\u003Cspan class=\"hljs-punctuation\">(\u003C\u002Fspan>...\u003Cspan class=\"hljs-punctuation\">)\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">)\u003C\u002Fspan>\u003C\u002Fcode> persists an encrypted session by default. It uses \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-title class_\">EncryptedSQLiteSessionStorage\u003C\u002Fspan>\u003C\u002Fcode> at the relative path \u003Ccode class=\"hljs\">miniproto.\u003Cspan class=\"hljs-keyword\">session\u003C\u002Fspan>.sqlite\u003C\u002Fcode> and requires a constructor key or \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">MINIPROTO_SESSION_KEY\u003C\u002Fspan>\u003C\u002Fcode>; without adequate key material, construction fails before connecting or creating a file. This quickstart deliberately uses explicit in-memory storage, so it is executable without creating or retaining credentials:\u003C\u002Fp>\n\n          \u003Cdiv class='code-block'>\n            \u003Cdiv class='code-block-header'>\n              \u003Cspan class='code-block-lang'>python\u003C\u002Fspan>\n              \u003Cbutton class='copy-code-button' type='button'>\n                Copy\n              \u003C\u002Fbutton>\n            \u003C\u002Fdiv>\n            \u003Cpre>\u003Ccode class='hljs python'>\u003Cspan class=\"hljs-keyword\">from\u003C\u002Fspan> miniproto \u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> Client, ClientConfig, InMemorySessionStorage\n\nclient = Client(ClientConfig(api_id=\u003Cspan class=\"hljs-number\">12345\u003C\u002Fspan>, api_hash=\u003Cspan class=\"hljs-string\">&quot;...&quot;\u003C\u002Fspan>, session_storage=InMemorySessionStorage()))\n\u003C\u002Fcode>\u003C\u002Fpre>\n          \u003C\u002Fdiv>\n        \u003Cp>\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-function\">\u003Cspan class=\"hljs-title\">InMemorySessionStorage\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">()\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode> intentionally does not persist credentials; use it only for tests or throwaway clients. For durable clients, provision a unique \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">MINIPROTO_SESSION_KEY\u003C\u002Fspan>\u003C\u002Fcode> through your deployment secret manager (or pass constructor key material) before constructing the default client, and choose a distinct \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">session_path\u003C\u002Fspan>\u003C\u002Fcode> for each account. \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attr\">session_storage\u003C\u002Fspan>\u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan>\u003C\u002Fcode> takes precedence over \u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">session_path\u003C\u002Fspan>\u003C\u002Fcode>. See \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FEDM115\u002Fminiproto\u002Fblob\u002Fcodex\u002Fv1\u002Fdocs\u002Fsession-security.md\" target=\"_blank\" rel=\"noopener noreferrer\">Session Security\u003C\u002Fa> for key handling, envelope behavior, persisted session data, migration guidance, and redaction rules.\u003C\u002Fp>\n\u003Ch2 id=\"raw-api\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"raw-api\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#raw-api\">Raw API\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The generated raw API is pinned to Telegram Schema Layer 228: TDLib is the canonical structural source, and Telegram Desktop supplies the validated layer after exact shared-declaration checks. See \u003Ca href=\"https:\u002F\u002Fgithub.com\u002FEDM115\u002Fminiproto\u002Fblob\u002Fcodex\u002Fv1\u002Fdocs\u002Fraw-api.md\" target=\"_blank\" rel=\"noopener noreferrer\">Raw API\u003C\u002Fa> for source provenance and drift, the lazy facade\u002Fshard layout, RPC error database details, and current runtime scope.\u003C\u002Fp>\n\u003Ch2 id=\"non-goals-for-v1\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"non-goals-for-v1\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#non-goals-for-v1\">Non-Goals For v1\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attribute\">miniproto\u003C\u002Fspan>\u003C\u002Fcode> v1 will not implement a full Pyrogram-compatible framework API, smart plugins, complex filters, middleware, conversation FSM, broad admin helpers, stars\u002Fpayments helpers, web app helpers, stories helpers, business helper layers, calls, or secret chats unless a later roadmap explicitly makes them protocol-core requirements. Raw schema compatibility is different from high-level helper ownership.\u003C\u002Fp>\n\u003Ch2 id=\"references\" tabindex=\"-1\">\u003Cspan\n                class=\"header-copy-icon\"\n                role=\"button\"\n                data-slug=\"references\"\n              >\n                \u003Csvg>\u003Cpath fill=\"currentColor\" d=\"M10.59 13.41c.41.39.41 1.03 0 1.42c-.39.39-1.03.39-1.42 0a5.003 5.003 0 0 1 0-7.07l3.54-3.54a5.003 5.003 0 0 1 7.07 0a5.003 5.003 0 0 1 0 7.07l-1.49 1.49c.01-.82-.12-1.64-.4-2.42l.47-.48a2.98 2.98 0 0 0 0-4.24a2.98 2.98 0 0 0-4.24 0l-3.53 3.53a2.98 2.98 0 0 0 0 4.24m2.82-4.24c.39-.39 1.03-.39 1.42 0a5.003 5.003 0 0 1 0 7.07l-3.54 3.54a5.003 5.003 0 0 1-7.07 0a5.003 5.003 0 0 1 0-7.07l1.49-1.49c-.01.82.12 1.64.4 2.43l-.47.47a2.98 2.98 0 0 0 0 4.24a2.98 2.98 0 0 0 4.24 0l3.53-3.53a2.98 2.98 0 0 0 0-4.24a.973.973 0 0 1 0-1.42\"\u002F>\u003C\u002Fsvg>\n              \u003C\u002Fspan>\u003Ca class=\"header-anchor\" href=\"#references\">References\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>The project takes API ergonomics inspiration from Pyrogram and forks, Telethon, Grammers, TDLib, GramJS, mtcute, Telegram Web K\u002Ftweb, and Telegram’s official MTProto docs, but it does not copy GPL\u002FLGPL reference code. The focus is speed, low memory use, reliable reconnect\u002Fupdate behavior, type hints, documentation, and a clean split between protocol SDK and framework package.\u003C\u002Fp>\n",1786753341448]