fsticker
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:
fstickeris 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(blockingrun()) andfsticker.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—Trueemits both a partial (current) and completed (previous) candle per tick, in thedict[dict]shape described below.Falseemits 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. SetTrueto 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, default4.0) — how long after the timeframe boundaryauto_finalize=Truewaits before force-emitting the candle. Only relevant whenauto_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) orFeedType.SnapQuotefor depth feed. -
target— defaults to"", meaning "every configured broker". Pass a broker'sname(matchingCredentials.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— whenTrue(default),run()installs its ownSIGINT/SIGTERMhandling for the duration of the call.grace_seconds— how longrun()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)
| File | Size | Uploaded | |
|---|---|---|---|
| fsticker-0.1.0.tar.gz | 230.1 kB | Details |
Built distributions (wheels)
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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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 logRelease 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