Skip to main content

fsticker

PyPI Downloads Python versions Build Ruff License: Apache 2.0

Multi-broker, deduplicated market-data feed for Shoonya/NorenWS-style WebSocket protocol (Shoonya, Flattrade, and compatible brokers). Connects to several broker accounts at once, merges their ticks into a single deduplicated stream, and optionally builds OHLC candles from that stream.

Disclaimer: fsticker is an independent, unofficial project built for personal use. It is not affiliated with, endorsed by, or connected to Shoonya, Flattrade, NorenWS/Noren, Kambala, or any broker referenced in this repo. All trademarks belong to their respective owners.

Features

  • Multi-broker merge — subscribe the same instruments across several broker sessions; receive one deduplicated tick stream.
  • Auto-reconnect & auto-resubscribe — exponential backoff with jitter, per broker, independent of the others. Once a broker reconnects, every instrument you'd previously subscribed on it is automatically re-subscribed — no manual resubscribe logic needed on your end.
  • Optional IP pinning — resolves a broker's hostname to its candidate IPs and fails over between them.
  • Optional candle engine — turn the merged tick stream into OHLC candles at any number of timeframes, live (partial + complete) or closed-only, with optional anchored to each exchange's real session open.
  • Optional TimescaleDB sink — persist completed candles straight into a Postgres/TimescaleDB hypertable, with zero effect on the rest of the feed if it's not configured or the database isn't reachable.
  • Sync and async APIs — fsticker.MergedFeed (blocking run()) and fsticker.AsyncMergedFeed (asyncio-native).

Install

fsticker is available on pypi. For Installation, run :

pip install fsticker

Prebuilt self-contained wheels are provided for Linux, macOS and Windows.

Platform support

OS Minimum version Notes
Linux glibc-based, manylinux_2_28+ (x86_64, aarch64) musl (Alpine) not supported
Windows Windows 10+ (amd64, arm64)
macOS 15.4 (Sequoia) or newer, both Intel and Apple Silicon see below

Why macOS needs 15.4+: the optional TimescaleDB candle sink statically links PostgreSQL's libpq, which — with the toolchain used to build it — cannot be built targeting macOS versions older than 15.4. Since this feature is on by default, the published macOS wheels target 15.4+ across the board.

If you're on an older macOS and don't need TimescaleDB persistence, build from source with the sink disabled:

pip install fsticker --no-binary fsticker \
    --config-settings=cmake.define.FSTICKER_ENABLE_TIMESCALE=OFF

Requirements

  • Python 3.11 – 3.14 (CPython only)

Quickstart (sync)

import fsticker

brokers = [
    fsticker.Credentials(
        name="shoonya",
        ws_endpoint="wss://api.shoonya.com/NorenWSAPI/",
        user_id="YOUR_USER_ID",
        token="YOUR_SESSION_TOKEN",
        access_type=fsticker.AccessType.API,
    ),
]

feed = fsticker.MergedFeed(brokers)
feed.start(on_tick=lambda tick: print(tick))
feed.subscribe(["NSE|26000", "NSE|26009"])
feed.run()  # blocks until Ctrl+C

Quickstart (async)

import asyncio
from fsticker import AsyncMergedFeed, Credentials

async def main():
    feed = AsyncMergedFeed([
        Credentials(
            name="shoonya",
            ws_endpoint="wss://api.shoonya.com/NorenWSAPI/",
            user_id="YOUR_USER_ID",
            token="YOUR_SESSION_TOKEN",
        ),
    ])

    await feed.start(on_tick=lambda tick: print(tick))
    await feed.subscribe(["NSE|26000", "NSE|26009"])

    try:
        await feed.wait_closed()  # blocks until stop()/Ctrl+C/SIGTERM, or every broker closes
    finally:
        await feed.aclose()

asyncio.run(main())

For fuller, runnable examples — including order/error/stall callbacks, multi-broker setup, and the candle engine — see examples/sync_example.py and examples/async_example.py.

Configuration

MergedFeed and AsyncMergedFeed take the same constructor parameters:

Feed(
    brokers: list[Credentials],
    candle_timeframes: list[tuple] | None = None,
    exchange_anchors: dict[str, int] = {  # see defaults below
        "NSE": 13500, "BSE": 13500, "NFO": 13500, "BFO": 13500,
        "MCX": 12600, "CDS": 12600, "BCD": 12600,
    },
    timescale: TimescaleConfig | None = None,
    tick_queue_capacity: int = 100_000,
    tick_queue_overwrite: bool = True,
    candle_queue_capacity: int = 100_000,
    candle_queue_overwrite: bool = True,
)
Param Type Default Meaning
brokers list[Credentials] required See below.
candle_timeframes list[tuple] | None None See below.
exchange_anchors dict[str, int] shown above See below.
timescale TimescaleConfig | None None See below.
tick_queue_capacity int 100_000 Max buffered raw ticks before the overwrite policy below kicks in.
tick_queue_overwrite bool True When the tick queue is full: drop the oldest queued tick to make room for the new one, instead of blocking/erroring.
candle_queue_capacity int 100_000 Same as tick_queue_capacity, for the candle queue.
candle_queue_overwrite bool True Same drop-oldest behavior, for candles.

brokers — list[Credentials] (required)

One Credentials entry per broker session you want merged into the feed. You can pass a single broker, or several — including two sessions on the same broker (e.g. one AccessType.API and one AccessType.WEB), which is exactly the "if one disconnects the other keeps feeding" merged-feed use case.

Field Type Default Meaning
name str required Unique per-broker label. Used in every per-broker callback (on_order, on_error, on_open, on_close, on_stalled) and as the target= argument to subscribe()/unsubscribe() when you want to address one broker instead of all of them.
ws_endpoint str required The NorenWS-compatible websocket URL for this specific session. A broker's plain API endpoint and its "Web" endpoint are different URLs with different access_types — see the two Shoonya endpoints in the examples below.
user_id str required The broker account's client/user ID used to authenticate this session.
token str required The session/auth token from that broker's login flow — not your account password, and a live secret (see the warning below if you're publishing example code).
access_type AccessType AccessType.API AccessType.API, AccessType.WEB, or AccessType.MOB. Must match whichever flavor of ws_endpoint/token you're using — mixing them (e.g. a Web token against an API endpoint) will fail to authenticate.
verify_ssl bool False Verify the websocket's TLS certificate.
enable_ip_pinning bool False Resolve ws_endpoint's hostname to its candidate IPs up front and fail over between them on reconnect, instead of re-resolving DNS each time (see "Optional IP pinning" above).

candle_timeframes — list[tuple] | None

Each tuple is (period: int, live: bool, auto_finalize: bool), or with an optional 4th element, (period, live, auto_finalize, auto_finalize_grace_seconds: float).

  • period — the candle's timeframe in seconds; any positive integer.
  • live — True emits both a partial (current) and completed (previous) candle per tick, in the dict[dict] shape described below. False emits once, only on candle completion, as a plain dict.
  • auto_finalize — normally a candle is only marked complete once the next timeframe's first tick arrives for that token. Set True to instead force-finalize it a fixed grace period after the timeframe boundary — useful for illiquid instruments that might not tick again for a while.
  • auto_finalize_grace_seconds (optional, default 4.0) — how long after the timeframe boundary auto_finalize=True waits before force-emitting the candle. Only relevant when auto_finalize=True.

eg. [(60, True, True)] — 1-minute, live partials + completed, auto-finalized after the default 4s grace. eg. [(60, True, True, 10.0)] — same, but with a 10s grace period instead of the default.

When provided, candle_timeframes activates the candle engine, which is inert by default. Candles are constructed from the same deduplicated feed.

Each candle carries fields: e, tk, ts, period, time, o, h, l, c, v, oi, oi_delta.

On live mode (live=True), each tick emits a dict[dict] with keys 'previous' (complete) and 'current' (partial):

previous current
Day first tick None is_new: true (a field in candle tick current)
interval first tick emit candle is_new: true
mid interval None is_new: false
trigger auto_finalize emit candle None

exchange_anchors — dict[str, int] | None

It takes eg. {"NSE": 13500}

Per-exchange session-open offset in seconds since UTC midnight. Keys are exchange codes ("NSE", "MCX", ...). The default covers the Indian exchanges this library targets (NSE/BSE/NFO/BFO 09:15 IST = 13500; MCX/CDS/BCD 09:00 IST = 12600).

The dict is not required to be exhaustive: any exchange not present is treated as UTC-midnight-aligned (offset 0) -- its candles still form, just bucketed on UTC boundaries instead of a session anchor. So you can pass a partial dict to override only the exchanges you care about.

Pass None (or {}) to disable anchoring entirely, making every exchange UTC-aligned.

timescale — TimescaleConfig | None

If not passed, the TimescaleDB sink is completely inert — no connection is attempted and the rest of the feed is unaffected.

TimescaleConfig fields:

Field Type Default Meaning
host str required Postgres/TimescaleDB host.
dbname str required Database name (e.g. fsticker_db).
user str required Postgres role to connect as.
password str required Password for that role.
port int 5432 Postgres port.
table str "candles" Base table name completed candles are written to.
table_mode TableMode TableMode.TIMEFRAME TableMode.SINGLE ("single") writes every candle period into one shared table; TableMode.TIMEFRAME ("per_timeframe") writes one table per period (<table>_60, <table>_300, ...).
connect_timeout float 5.0 Seconds to wait for the initial Postgres connection before giving up.
auto_bootstrap_schema bool True Create the table(s)/hypertable(s) automatically on first use if they don't exist. See below.

Schema

With auto_bootstrap_schema=True (the default), nothing inside the database to set up by hand: on first successful connection the sink creates the table(s) it needs (CREATE TABLE IF NOT EXISTS) and, best-effort, upgrades them to TimescaleDB hypertables. If the timescaledb extension isn't installed, or your database user lacks privilege to create it, the sink logs that once and quietly continues as plain Postgres tables — persistence still works, you just don't get hypertable chunking/compression. With auto_bootstrap_schema=False, the sink issues no DDL at all — you are responsible for creating matching table(s) yourself before starting the feed.

We'd recommend leaving auto_bootstrap_schema=True and letting the library manage the schema. The definition below is shown so you know exactly what gets created — for verification, writing your own read queries, migrations, etc. — not as something you're expected to run by hand; auto_bootstrap_schema=False exists for locked-down environments where the app's database role genuinely can't be granted DDL privileges.

Expected schema per table (table_mode=TIMEFRAME produces one of these per configured period, named <table>_<period>). The steps below are what auto_bootstrap_schema=True already does for you automatically; they're spelled out here as the exact DDL to run yourself if you're on auto_bootstrap_schema=False, or just want to see precisely what's being created.

CREATE TABLE candles_60 (
    exchange TEXT NOT NULL,
    token TEXT NOT NULL,
    trading_symbol TEXT,
    period BIGINT NOT NULL, 
    "time" BIGINT NOT NULL,             
    ts TIMESTAMP GENERATED ALWAYS AS
        (to_timestamp("time") AT TIME ZONE 'Asia/Kolkata') STORED,
    open DOUBLE PRECISION,
    high DOUBLE PRECISION,
    low DOUBLE PRECISION,
    close DOUBLE PRECISION,
    volume BIGINT,
    open_interest BIGINT,
    oi_delta BIGINT,
    PRIMARY KEY (exchange, token, period, "time")
);

-- Step 2: the integer-now function. Create this ONCE per database -- -- it's shared by every hypertable you convert, not redeclared per table. -- Skip this step entirely if you already ran it for an earlier table.

CREATE OR REPLACE FUNCTION fsticker_sec_now() RETURNS BIGINT
LANGUAGE SQL STABLE AS $$ SELECT EXTRACT(EPOCH FROM now())::BIGINT $$;

-- Step 3: convert to a hypertable. . chunk_interval (86400 = 1 day, in seconds) is yours to choose -- -- fsticker itself scales this with the candle period when it bootstraps a -- table automatically; pick something similar for your own timeframe.

SELECT create_hypertable('candles_60', by_range('time', 86400::BIGINT),
                          if_not_exists => TRUE);

-- Step 4: register the function against THIS table specifically. Repeat -- this one line (only this one) for every additional hypertable you create -- -- 'fsticker_sec_now' already exists from step 2, don't recreate it.

SELECT set_integer_now_func('candles_60', 'fsticker_sec_now');

See docs/timescaledb-setup.md for a full guide to getting a Postgres/TimescaleDB server running (Docker, dedicated role setup, native install, and troubleshooting) — this section only covers the table fsticker itself creates/expects.

Methods

Sync (MergedFeed) and async (AsyncMergedFeed) expose the same methods; the async versions are coroutines (await feed.subscribe(...), etc.).

Callbacks — via start(), or as direct attributes

MergedFeed exposes every callback as a property (feed.on_tick = ...), and AsyncMergedFeed exposes them as plain settable attributes — so you can assign callbacks either before or after start(), as an alternative to passing them all as start() kwargs.

start(...) (async: await start(...))

Registers callbacks and begins connecting every configured broker:

Callback Fires with
on_tick one merged, deduplicated tick (dict)
on_candle one completed/partial candle payload
on_order (broker, payload) order updates
on_error (broker, payload) broker errors
on_open (broker, payload) on connect
on_close (broker,) on disconnect
on_stalled (broker, consecutive_failures)

Every callback is optional and independent — a sync def or async def callback both work in async implementation.

subscribe(instruments, feed_type=FeedType.Touchline, target="")

Subscribes to a list of instrument tokens (e.g. ["NSE|26000", "BSE|1"]). Safe to call before, during, or after connecting, from any thread (sync) or task (async), at any point in your code — calls made before authentication are queued and flushed automatically once each broker's session is ready, so you don't need to wait for on_open/ wait_connected before subscribing.

  • feed_type — FeedType.Touchline (default) or FeedType.SnapQuote for depth feed.

  • target — defaults to "", meaning "every configured broker". Pass a broker's name (matching Credentials.name) to restrict the call to that one session instead — useful when you only want a given instrument carried by a single broker.

unsubscribe(instruments, feed_type=FeedType.Touchline, target="")

Same signature and thread/task-safety guarantees as subscribe(), in reverse — stops delivering ticks for the given instruments.

wait_connected(timeout=None)

Blocks (sync) or awaits (async) until every configured broker has finished authenticating, or timeout seconds have elapsed — None means wait indefinitely. Returns True if all brokers connected in time, False on timeout. Entirely optional: you can subscribe and start receiving ticks without ever calling this, since start()/subscribe() already handle the "not connected yet" case by queuing.

stop() (async: await stop())

Requests a graceful shutdown from outside the feed — e.g. from another thread (sync) or task (async), or from a signal handler of your own. This is what unblocks run() (sync) or completes wait_closed() (async) on demand, as opposed to shutdown happening because every broker closed on its own (e.g. all sessions hit invalid credentials).

run(handle_signals=True, grace_seconds=2.0) — sync only

Blocks the calling thread, running the feed until stop() is called or the process receives Ctrl+C/SIGTERM. This is the sync feed's main entry point — call it last, after start() and your initial subscribe() calls.

  • handle_signals — when True (default), run() installs its own SIGINT/SIGTERM handling for the duration of the call.
  • grace_seconds — how long run() waits for the websocket connections to close gracefully once a shutdown is triggered. If a broker hasn't finished closing within that window, it's force-closed rather than waited on indefinitely.

On Ctrl+C/SIGTERM, run() closes gracefully (within grace_seconds) and then delivers the interruption to your code as a plain KeyboardInterrupt .

wait_closed() — async only

Awaits until the feed closes — via stop(), Ctrl+C/SIGTERM, or every broker closing on its own. This is the async equivalent of run()'s blocking behavior, but as a plain awaitable rather than something that owns the event loop.

aclose() — async only

Performs a clean async shutdown of the feed (closing broker connections, stopping worker tasks). Always call this in a finally: block after wait_closed() — it runs on every exit path, including platforms without loop signal handlers (Windows).

Contributing

Issues, bug reports, and pull requests are welcome — whether that's a fix, a doc improvement, a new broker adapter, or just a question. If you're planning something larger, opening an issue first to discuss the approach is appreciated but not required.

License

Apache License 2.0 — see LICENSE.

The creator puts real effort into keeping this efficient and bug-free, but software has edges — especially around live market data and money. This project is provided "as is," without warranty (Apache 2.0, Sections 7–8 cover this formally): the creator and contributors aren't liable for losses, missed trades, bad data, or anything else that comes from using it. Use your own judgment, especially before relying on it for real trading decisions.

Release files for fsticker 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for fsticker 0.1.0
File Size Uploaded
fsticker-0.1.0.tar.gz 230.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for fsticker 0.1.0
File
fsticker-0.1.0-cp314-cp314-win_arm64.whl CPython 3.14 CPython 3.14 Windows ARM64 Details
fsticker-0.1.0-cp314-cp314-win_amd64.whl CPython 3.14 CPython 3.14 Windows x86-64 Details
fsticker-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ x86-64 Details
fsticker-0.1.0-cp314-cp314-manylinux_2_28_aarch64.whl CPython 3.14 CPython 3.14 Linux glibc 2.28+ ARM64 Details
fsticker-0.1.0-cp314-cp314-macosx_15_0_x86_64.whl CPython 3.14 CPython 3.14 macOS 15.0+ x86-64 Details
fsticker-0.1.0-cp314-cp314-macosx_15_0_arm64.whl CPython 3.14 CPython 3.14 macOS 15.0+ ARM64 Details
fsticker-0.1.0-cp313-cp313-win_arm64.whl CPython 3.13 CPython 3.13 Windows ARM64 Details
fsticker-0.1.0-cp313-cp313-win_amd64.whl CPython 3.13 CPython 3.13 Windows x86-64 Details
fsticker-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ x86-64 Details
fsticker-0.1.0-cp313-cp313-manylinux_2_28_aarch64.whl CPython 3.13 CPython 3.13 Linux glibc 2.28+ ARM64 Details
fsticker-0.1.0-cp313-cp313-macosx_15_0_x86_64.whl CPython 3.13 CPython 3.13 macOS 15.0+ x86-64 Details
fsticker-0.1.0-cp313-cp313-macosx_15_0_arm64.whl CPython 3.13 CPython 3.13 macOS 15.0+ ARM64 Details
fsticker-0.1.0-cp312-cp312-win_arm64.whl CPython 3.12 CPython 3.12 Windows ARM64 Details
fsticker-0.1.0-cp312-cp312-win_amd64.whl CPython 3.12 CPython 3.12 Windows x86-64 Details
fsticker-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ x86-64 Details
fsticker-0.1.0-cp312-cp312-manylinux_2_28_aarch64.whl CPython 3.12 CPython 3.12 Linux glibc 2.28+ ARM64 Details
fsticker-0.1.0-cp312-cp312-macosx_15_0_x86_64.whl CPython 3.12 CPython 3.12 macOS 15.0+ x86-64 Details
fsticker-0.1.0-cp312-cp312-macosx_15_0_arm64.whl CPython 3.12 CPython 3.12 macOS 15.0+ ARM64 Details
fsticker-0.1.0-cp311-cp311-win_arm64.whl CPython 3.11 CPython 3.11 Windows ARM64 Details
fsticker-0.1.0-cp311-cp311-win_amd64.whl CPython 3.11 CPython 3.11 Windows x86-64 Details
fsticker-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ x86-64 Details
fsticker-0.1.0-cp311-cp311-manylinux_2_28_aarch64.whl CPython 3.11 CPython 3.11 Linux glibc 2.28+ ARM64 Details
fsticker-0.1.0-cp311-cp311-macosx_15_0_x86_64.whl CPython 3.11 CPython 3.11 macOS 15.0+ x86-64 Details
fsticker-0.1.0-cp311-cp311-macosx_15_0_arm64.whl CPython 3.11 CPython 3.11 macOS 15.0+ ARM64 Details

Total release size: 82.5 MB

Release files / fsticker-0.1.0.tar.gz

Download URL fsticker-0.1.0.tar.gz
Size 230.1 kB
Tags Source
SHA-256 checksum
How to use checksums
c4b5fea6154eba69d2a6e0851d2cd43976c3ab93530d17afad727382ee0e03c5
BLAKE2b-256 checksum
How to use checksums
11fcc0de3b5bee0f498b201deff243be328cf861492fddc9bb54b1b7d519dd59
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp314-cp314-win_arm64.whl

Download URL fsticker-0.1.0-cp314-cp314-win_arm64.whl
Size 3.0 MB
Tags CPython 3.14 Windows ARM64
SHA-256 checksum
How to use checksums
e99a56442081f880459e04292fcd95942f03595e2113f3d3e07d634a6ecf76bf
BLAKE2b-256 checksum
How to use checksums
f6ee11e4839d3c73109caa71b39cac644718cb2ee78ab8b7124ff1da75fe0540
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp314-cp314-win_amd64.whl

Download URL fsticker-0.1.0-cp314-cp314-win_amd64.whl
Size 3.2 MB
Tags CPython 3.14 Windows x86-64
SHA-256 checksum
How to use checksums
6ff2102ab65648930ccea66ac55146705906e3716db6b6a8a90554f2480eec4d
BLAKE2b-256 checksum
How to use checksums
2a922763e741be67711957cd9e40010efacf24dd3465160654da2560c054b7c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl

Download URL fsticker-0.1.0-cp314-cp314-manylinux_2_28_x86_64.whl
Size 3.2 MB
Tags CPython 3.14 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
445d02cf20460497caa26fbbc1385447604906eb837bcc6a5b334ada3acfe124
BLAKE2b-256 checksum
How to use checksums
63c17fcf44581dcdde8aa464eb849da0bf9e7936f00ac29217b9cab3b0830a4f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp314-cp314-manylinux_2_28_aarch64.whl

Download URL fsticker-0.1.0-cp314-cp314-manylinux_2_28_aarch64.whl
Size 3.0 MB
Tags CPython 3.14 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
fd79cad6f7cdca35afc1eab61457ee53b14b314449a94e7fec9ab8a2236e0789
BLAKE2b-256 checksum
How to use checksums
b6dc614a81e939c03250b229a92b8fcd8e51f64c54448fa9f003ec715e5ab4c1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp314-cp314-macosx_15_0_x86_64.whl

Download URL fsticker-0.1.0-cp314-cp314-macosx_15_0_x86_64.whl
Size 4.0 MB
Tags CPython 3.14 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
5ffab2073e1b6353e86041650a7e6b79e9a489b3fce496331979929eecbdcaf3
BLAKE2b-256 checksum
How to use checksums
52dc45840cfda0def4ac3deeb9db2137a95f8c05e6732729135f7a34693e16b9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp314-cp314-macosx_15_0_arm64.whl

Download URL fsticker-0.1.0-cp314-cp314-macosx_15_0_arm64.whl
Size 4.2 MB
Tags CPython 3.14 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
c87105fab0739c98d7338cfed51b69a89e0faed34b733d39ea3f64febb80d0a7
BLAKE2b-256 checksum
How to use checksums
199d4044b035a6296b06514cd78cf8f1572710902435afe2b43e789f43f2d70f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp313-cp313-win_arm64.whl

Download URL fsticker-0.1.0-cp313-cp313-win_arm64.whl
Size 2.9 MB
Tags CPython 3.13 Windows ARM64
SHA-256 checksum
How to use checksums
be1bd4a0d9c008d833fa7acacd75e9af4013685658c03a93b91d2c42698b8a9d
BLAKE2b-256 checksum
How to use checksums
a3f3767eef0dd90eef348c76b66afca6a75bf7f49d2be896716f594a613e568b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp313-cp313-win_amd64.whl

Download URL fsticker-0.1.0-cp313-cp313-win_amd64.whl
Size 3.2 MB
Tags CPython 3.13 Windows x86-64
SHA-256 checksum
How to use checksums
ee94acc183b8ac6688b4436f480d904bb3889e4e9dc825ac7873d6b3c252b8ce
BLAKE2b-256 checksum
How to use checksums
40e1f89e01387c119d22a0008c15d640921f93c2f0b789fa37d43c633d32d470
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl

Download URL fsticker-0.1.0-cp313-cp313-manylinux_2_28_x86_64.whl
Size 3.2 MB
Tags CPython 3.13 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
0ef72d148ebb5d253db72209ee2a1961526edbcb14a7febd63769c6eb559a054
BLAKE2b-256 checksum
How to use checksums
9608a841505b3d12a1bf1fde6a0896fa94a524dcbb5caefb55050b74219131f7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp313-cp313-manylinux_2_28_aarch64.whl

Download URL fsticker-0.1.0-cp313-cp313-manylinux_2_28_aarch64.whl
Size 3.0 MB
Tags CPython 3.13 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
21c4a4ffb53c9028f179062e2bf3625b2fd08955120e043824b8a12f0d01e4cf
BLAKE2b-256 checksum
How to use checksums
4034b665ce7329754c9c71cdec77077d9dbef7a51637557c893c98563480a73b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp313-cp313-macosx_15_0_x86_64.whl

Download URL fsticker-0.1.0-cp313-cp313-macosx_15_0_x86_64.whl
Size 4.0 MB
Tags CPython 3.13 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
0a95055e0d52c5abaa73d05e23434be8beb74def1c67c084cb4ee5016f29f82f
BLAKE2b-256 checksum
How to use checksums
4f1866d287e7ca6ca646a17fa2695bdf16be0c866ff5e378a747818c058c7819
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp313-cp313-macosx_15_0_arm64.whl

Download URL fsticker-0.1.0-cp313-cp313-macosx_15_0_arm64.whl
Size 4.2 MB
Tags CPython 3.13 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
1176f761b1c4ba85f367c61b737cc2c376d8bc6ec4d62ade203f16e7d121de6d
BLAKE2b-256 checksum
How to use checksums
a65787910e854ad92c5d8563c891b977c2a621506063dcc1af844bec9efb48e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp312-cp312-win_arm64.whl

Download URL fsticker-0.1.0-cp312-cp312-win_arm64.whl
Size 2.9 MB
Tags CPython 3.12 Windows ARM64
SHA-256 checksum
How to use checksums
cfb5fac09e2590fd182ac8a82f71ee8228c533e8cc4a04d99a29479525348542
BLAKE2b-256 checksum
How to use checksums
3048a0ebfa590fcb558a85a28d730a61fd3b2c126e405106309b191e121208a3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp312-cp312-win_amd64.whl

Download URL fsticker-0.1.0-cp312-cp312-win_amd64.whl
Size 3.2 MB
Tags CPython 3.12 Windows x86-64
SHA-256 checksum
How to use checksums
a23131b428d6aeaf685cf4255f5ecc188b66175e2f7374ca5b3c75b5fab0c001
BLAKE2b-256 checksum
How to use checksums
4728b518ed6ab46dc286437db4d090d963054bae2c1a27ea25df51fa11202d0e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl

Download URL fsticker-0.1.0-cp312-cp312-manylinux_2_28_x86_64.whl
Size 3.2 MB
Tags CPython 3.12 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
1f534cabc74ae2ab3b7d40ee3f9c6c28059cf799ed2598f39ac8e66acab279a1
BLAKE2b-256 checksum
How to use checksums
4fc8b7c1fbe5d67c195f929ab3d6aae46d19ac4f48295a4e3efdaab2c3901d25
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp312-cp312-manylinux_2_28_aarch64.whl

Download URL fsticker-0.1.0-cp312-cp312-manylinux_2_28_aarch64.whl
Size 3.0 MB
Tags CPython 3.12 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
e435a3c0e44f3190a04a3e189fce36e0f24b4eaac8ccf4316b0365db195f07a4
BLAKE2b-256 checksum
How to use checksums
d5de13afdeda9be783bb08cbab49d5b314a8f5d186bf2547fcf7bec3daba8e18
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp312-cp312-macosx_15_0_x86_64.whl

Download URL fsticker-0.1.0-cp312-cp312-macosx_15_0_x86_64.whl
Size 4.0 MB
Tags CPython 3.12 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
79e9a4a0cc6abf9325f5b639ed86621c73206862615b231ad92f78e629193c8d
BLAKE2b-256 checksum
How to use checksums
44f5322b23c8cea05d26a2b851f57e5c4c4f0bb27bece888b73823d21c23c9fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp312-cp312-macosx_15_0_arm64.whl

Download URL fsticker-0.1.0-cp312-cp312-macosx_15_0_arm64.whl
Size 4.2 MB
Tags CPython 3.12 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
af13c607a2f773d1f892c8ab3d94601aa6b2393f47921f9404a79baff02d1436
BLAKE2b-256 checksum
How to use checksums
63fe15b8ebe47fd44dfb361f7bed598662cde80c53e7c8ab1d8032350a9da2c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp311-cp311-win_arm64.whl

Download URL fsticker-0.1.0-cp311-cp311-win_arm64.whl
Size 2.9 MB
Tags CPython 3.11 Windows ARM64
SHA-256 checksum
How to use checksums
f0e39e5658d970c3905d239a5a19e4a531a139398afd1c4b4f502ac50250ced0
BLAKE2b-256 checksum
How to use checksums
4748bac3769374247755507bb825b042cfd4de0267dfc24698e7c3cc4a397831
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp311-cp311-win_amd64.whl

Download URL fsticker-0.1.0-cp311-cp311-win_amd64.whl
Size 3.2 MB
Tags CPython 3.11 Windows x86-64
SHA-256 checksum
How to use checksums
c60911e7c08293f3b8099362962e7989d38da3bf57badc4d3c467260a86e6217
BLAKE2b-256 checksum
How to use checksums
50f9cec32e375476c41556f27036cb3e90785a61a0b7b439eef3986f27492423
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl

Download URL fsticker-0.1.0-cp311-cp311-manylinux_2_28_x86_64.whl
Size 3.2 MB
Tags CPython 3.11 Linux glibc 2.28+ x86-64
SHA-256 checksum
How to use checksums
290188e746200b997cc42e29561f23997fe5c6dda9f958a104233f1e36d59513
BLAKE2b-256 checksum
How to use checksums
6bd027af7b614ecbe05d0c60681369b3e227c2470018eda613a515edb46419f2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp311-cp311-manylinux_2_28_aarch64.whl

Download URL fsticker-0.1.0-cp311-cp311-manylinux_2_28_aarch64.whl
Size 3.0 MB
Tags CPython 3.11 Linux glibc 2.28+ ARM64
SHA-256 checksum
How to use checksums
580eba35af176d4fa2482fafe09e1d34ff798ff71814902c5bfacfc6890e945d
BLAKE2b-256 checksum
How to use checksums
da6afd42c96ac5656972efdf4bd5c6d2b23374c0f34627f09f99bea9e4ad6f65
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp311-cp311-macosx_15_0_x86_64.whl

Download URL fsticker-0.1.0-cp311-cp311-macosx_15_0_x86_64.whl
Size 4.0 MB
Tags CPython 3.11 macOS 15.0+ x86-64
SHA-256 checksum
How to use checksums
c3f78612588b923716f530e2ae845f85bb46233b81397895a7df3d662df674fa
BLAKE2b-256 checksum
How to use checksums
adf5060757d1c3a01aa27df32ce52d6a6e33b4de54f3b92d72c186911f424de0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / fsticker-0.1.0-cp311-cp311-macosx_15_0_arm64.whl

Download URL fsticker-0.1.0-cp311-cp311-macosx_15_0_arm64.whl
Size 4.2 MB
Tags CPython 3.11 macOS 15.0+ ARM64
SHA-256 checksum
How to use checksums
968304a530a3c0c1350edb5988287c46f588ae04aa964605c8a51d4135156983
BLAKE2b-256 checksum
How to use checksums
6ef1194ea7998754d83eb8b252e42dc1fb7e9126cae78179f1e18d958e2f5b10
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

25 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page