
Automatic performance capture and analytics for production applications in Python using a custom columnar database written in Rust.
[](https://github.com/JakeRoggenbuck?tab=repositories&q=&type=&language=rust&sort=stargazers)
[](https://github.com/JakeRoggenbuck?tab=repositories&q=&type=&language=python&sort=stargazers)
[](https://github.com/JakeRoggenbuck/kronicler/actions)
[](https://pypi.org/project/kronicler)
[](https://crates.io/crates/kronicler)
[](https://crates.io/crates/kronicler)
View Kronicler on [UseKronicler.com](https://usekronicler.com), [PyPi.org](https://pypi.org/project/kronicler), [Crates.io](https://crates.io/crates/kronicler) and [GitHub](https://github.com/JakeRoggenbuck/kronicler).
> [!IMPORTANT]
> Kronicler is still early in development. I'd appreciate any feedback to help make kronicler more useful for you!
## Benefits of using Kronicler
- Automatic performance capturing
- Lightweight and concurrent\*
- One Python dependency
- Works out-of-the-box without configuration
\* concurrency is in development but not fully implemented as of version 0.1.2. Track concurrency in [issue #123](https://github.com/JakeRoggenbuck/kronicler/issues/123).
## Why use Kronicler?
If you want to monitor the performance of a production application, kronicler offers efficient and lightweight logging with a single library. Kronicler lets you view runtime statistics for functions like mean and median as well as statistics for different percentiles.
A use-case for these statistics is to find functions that occasionally operate much slower than they do on average. By looking at the "slowest" speed, the standard error, and the mean, you can find functions that occasionally run much slower than expected. Sometimes it's hard to find and replicate these issues in a test environment, so keeping logs in your production application can improve your ability to find these issues.
## What really is Kronicler?
| Name | Description | Link |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| **Kronicler (Python)** | A [Python library](https://pypi.org/project/kronicler/) that provides the `@kronicler.capture` decorator to save performance logs to a database. | [More about Python](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#install-python) |
| **Kronicler (Database)** | Custom columnar database designed for log capturing and performance analytics. | [More about Database](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#architecture) |
| **Kronicler (Rust)** | A [Rust library](https://crates.io/crates/kronicler) for accessing the columnar database and capture functions for Rust-based log capturing tasks. | [More about Rust](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#using-kroniclers-database-directly) |
| **Kronicler (CLI)** | Rust-based CLI tool for analyzing performance logs captured with the capture methods. | [More about CLI](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#analytics-cli) |
| **Kronicler (Web)** | Prototype web portal for remotely viewing performance logs. | [More about Web](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#analytics-web-dashboard) |
## Install (Python)
#### Install with Pip for Python
```sh
pip install kronicler
```
You may need to use a [virtual environment](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#python-virtual-environment).
## Usage (Python)
Kronicler provides a Python decorator called `capture` that will calculate the time it takes to run the function.
```python
import kronicler
@kronicler.capture
def my_function():
pass
```
## Architecture
Simplified version of the package and database architecture. The data is passed from the Python decorator called [`capture`](https://github.com/JakeRoggenbuck/kronicler/blob/main/python/kronicler/__init__.py) to the [`database`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/database.rs)'s [`queue`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/queue.rs). It then consumes that [`queue`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/queue.rs) to insert each field into its respective [`column`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/column.rs). The [`column`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/column.rs) uses the [`bufferpool`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/bufferpool.rs) to operate on pages.


This does not include details on:
- How the [`bufferpool`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/bufferpool.rs) manages [`pages`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/page.rs).
- How [`pages`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/page.rs) operate.
- [`capture`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/capture.rs), [`index`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/index.rs), [`row`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/row.rs), or saving and loading with [`metadata`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/metadata.rs).
#### The Database
The columnar database is somewhat inspired by my previous database called [RedoxQL](https://github.com/JakeRoggenbuck/RedoxQL). A lot of the structure and architecture is different as well as how data is stored.
#### The Bufferpool
The bufferpool is based on my [bufferpool](https://github.com/JakeRoggenbuck/bufferpool) project. I had to modify it to work with the rest of this database.
## Future Languages
Install and Usage for Rust is coming soon...
I plan to implement the Rust version as an `attribute` to be used like the following:
```rust
#[capture]
fn foo() { todo!() }
```
## Examples
#### Using Kronicler (Basic Example)
Here is the most basic usage of Kronicler. Use it to capture the runtime of functions by adding the `@kronicler.capture` decorator.
```python
import kronicler
@kronicler.capture
def foo():
print("Foo")
```
#### Using Kronicler with FastAPI
With just two lines of code, you can add Kronicler to your [FastAPI](https://fastapi.tiangolo.com) server.
For FastAPI, to capture each route, you can use the `KroniclerMiddleware` that will be included in `v0.1.2`. This allows you to capture every route that gets called.
```python
from fastapi import FastAPI
import uvicorn
import kronicler
app = FastAPI()
app.add_middleware(kronicler.KroniclerMiddleware)
# Used only for the /logs route
DB = kronicler.Database(sync_consume=True)
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/logs")
def read_logs():
return DB.logs()
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
```
If you want to capture functions manually, you can still do that with `@kronicler.capture` as normal. This is helpful if you want to benchmark functions that are not routes.
```python
from fastapi import FastAPI
import uvicorn
import kronicler
app = FastAPI()
app.add_middleware(kronicler.KroniclerMiddleware)
# Used only for the /logs route
DB = kronicler.Database(sync_consume=True)
# You need to wrap helper functions
@kronicler.capture
def foo():
return {"Hello": "World"}
# You cannot wrap routes right now
@app.get("/")
def read_root():
return foo()
# Return the logs to the user (optional)
@app.get("/logs")
def read_logs():
return DB.logs()
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)
```
Code from [tests/fastapi-test/main.py](https://github.com/JakeRoggenbuck/kronicler/blob/main/tests/fastapi-test/main.py).
## Using Kronicler manually
It's recommended to first use Kronicler's built-in `capture` decorator. However, if you want to write your own capture statements and fetch data yourself, you can use the functions in that come with the Python library.
```python
import kronicler
DB = kronicler.Database(sync_consume=True)
def foo():
DB.capture("String Value", [], 100, 200)
# Call the function
foo()
fetched = DB.fetch(0)
print(fetched)
```
More functionality will be added to the Python library in future releases.
## Using Kronicler's database directly
If you're interested in using Kronicler's database directly in Rust to add custom logging functions (or just to use a columnar database), the library is published to [crates.io](https://crates.io/crates/kronicler).
#### Install with Cargo for Rust
```
cargo install kronicler
```
Add as a dependency in your `Cargo.toml`.
```toml
[dependencies]
kronicler = "0.1.2"
```
To get a good idea of how to use Kronicler's internal Rust database, I'd recommend looking at some of the tests in the Rust files. You can also look at the source code for the `kr` binary in [main.rs](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/bin/main.rs).
Here is an example of a function that fetches data based on index. It creates a `Database` from the `new_reader` trait.
```rs
use kronicler::database::Database;
fn fetch_one(index: usize) {
let mut db = Database::new_reader();
let row = db.fetch(index);
if let Some(r) = row {
println!("{}", r.to_string());
}
}
fn main() {
fetch_one(0);
fetch_one(1);
}
```
You can also make a database that writes new capture data with the `new` trait.
```rs
use kronicler::database::Database;
fn main() {
let mut db = Database::new();
db.capture("Name".to_string(), vec![], 100, 200);
}
```
## Performance
Kronicler is designed to be as lightweight as possible. By adding logs to a queue concurrently\*, Kronicler doesn't affect performance by much \[[PR #73](https://github.com/JakeRoggenbuck/kronicler/pull/73), [PR #76](https://github.com/JakeRoggenbuck/kronicler/pull/76)\].
For accessing logs and running calculations, Kronicler uses a columnar database design to optimize file operations when looking at lots of data from only a few columns typical of analytics tasks.
\* concurrency is in development but not fully implemented as of version 0.1.2. Track concurrency in [issue #123](https://github.com/JakeRoggenbuck/kronicler/issues/123).
### Kronicler DB vs. SQLite
I implemented a [test version of Kronicler](https://github.com/JakeRoggenbuck/kronicler/tree/main/tests/kronicler-sqlite-comparison) logging that uses SQLite under the hood to benchmark against.
#### Experiment 1. Insert 1000 captures
Here is the function that we capture with `kronicler_sqlite.capture` defined by our test package that uses SQLite.
```python
@kronicler_sqlite.capture
def foo_1():
val = 9
for x in range(4):
val += val + x
return val
```
Here is where we call the function `CAPTURE_COUNT` times. Which in this case is 1000.
```python
def test_sqlite():
## Test for kronicler_sqlite
# Warmup
for _ in range(WARMUP_COUNT):
foo_1()
# Test
for _ in range(CAPTURE_COUNT):
foo_1()
```
We do the same for the Kronicler DB version with `kronicler.capture`.
We then run each of those functions 50 times and log the results:
```python
if __name__ == "__main__":
insert_times_data = []
avg_times_data = []
for x in tqdm.tqdm(range(REPEATS)):
# TEST sqlite inserts
start = time.time_ns()
test_sqlite()
end = time.time_ns()
print(f"{test_sqlite.__name__} took {end - start}ns")
insert_times_data.append((test_sqlite.__name__, end - start))
# TEST sqlite avg
start = time.time_ns()
avg_val = avg_sqlite()
end = time.time_ns()
print(f"{avg_sqlite.__name__} = {avg_val} and took {end - start}ns")
avg_times_data.append((avg_sqlite.__name__, end - start))
# Wait for any cleanup to happen between SQLite and Columnar
time.sleep(2)
# TEST columnar inserts
start = time.time_ns()
test_columnar()
end = time.time_ns()
print(f"{test_columnar.__name__} took {end - start}ns")
insert_times_data.append((test_columnar.__name__, end - start))
# TEST columnar avg
start = time.time_ns()
avg_val = avg_columnar()
end = time.time_ns()
print(f"{avg_columnar.__name__} = {avg_val} and took {end - start}ns")
avg_times_data.append((avg_columnar.__name__, end - start))
# Wait for any cleanup to happen between Columnar and No log
time.sleep(2)
# TEST no log inserts
start = time.time_ns()
test_no_logging()
end = time.time_ns()
print(f"{test_no_logging.__name__} took {end - start}ns")
insert_times_data.append((test_no_logging.__name__, end - start))
# TEST no logging avg
start = time.time_ns()
avg_val = avg_no_logging()
end = time.time_ns()
print(f"{avg_no_logging.__name__} = {avg_val} and took {end - start}ns")
avg_times_data.append((avg_no_logging.__name__, end - start))
with open("sync_insert_data.json", "w") as file:
json.dump(insert_times_data, file)
with open("sync_avg_data.json", "w") as file:
json.dump(avg_times_data, file)
```
This test is called [simple_sync.py](tests/kronicler-sqlite-comparison/tests/simple_sync.py). Note: concurrent mode is turned off as of v0.1.1, so those tests will not run. The concurrent version of the test is [simple_concurrent.py](tests/kronicler-sqlite-comparison/tests/simple_concurrent.py) and will exit with an error message explaining the lack of support in v0.1.1.
##### Insert (writing data to disk):
<img width="800" height="500" alt="sync_insert_50" src="https://github.com/user-attachments/assets/712ee44d-e879-4d2c-85fe-219f4d36b373" />
The data can be found at [sync_insert_data.json](tests/kronicler-sqlite-comparison/tests/sync_insert_data.json).
Inserting is **7.71x** faster than SQLite.
It's still unknown why SQLite has large latency spikes, but information about that will be mentioned in [issue #101](https://github.com/JakeRoggenbuck/kronicler/issues/101) if found.
##### Average (calculating the mean):
<img width="800" height="500" alt="sync_avg_50" src="https://github.com/user-attachments/assets/33e5fb2a-92e8-4807-a1eb-bb89291572b8" />
The data can be found at [sync_avg_data.json](tests/kronicler-sqlite-comparison/tests/sync_avg_data.json).
Kronicler uses amortized constant calculations to keep an average runtime for functions. This causes the mean calculation to be **837.24x** faster than the average function in SQLite.
Here is how it's done in SQLite:
```sql
SELECT AVG(delta) FROM function_calls WHERE function_name = ?
```
Kronicler keeps an updated mean on insert. This same approach can be done with SQLite by having your own index on function names and a table to keep track of the mean function time the same way Kronicler does it, however that's not the default and you'd have to build that into your implementation.
### Kronicler Mean with Large Data Test
#### Correctness for average (mean) calculation for large data
##### The test script
```sh
rm -rf .kronicler_data
sleep 2
python3 ./large_average.py
echo -e "Finished running large_average.\n\n"
rm -rf .kronicler_data
sleep 2
python3 ./large_average_no_in_mem_comp.py
echo -e "Finished running large_average_no_in_mem_comp.\n\n"
echo "Note: large_average has a higher insert time because it needs to store ground truth values in memory. The ground truth average will also be quicker because it uses only in-memory values."
```
This script is called [run_large_avg.sh](tests/python-integration-tests/run_large_avg.sh).
Importantly, we test that the average is correct using a "ground truth" calculation.
```py
start = time.time()
kr_avg = DB.average("jake")
kr_avg_time = time.time() - start
print("Kronicler average: ", kr_avg, f"ran in {kr_avg_time}.")
start = time.time()
py_avg = mean(ground_truth_data)
py_avg_time = time.time() - start
print("Ground truth average: ", py_avg, f"ran in {py_avg_time}.")
assert kr_avg - py_avg < 0.0001
```
This is from [large_average.py](tests/python-integration-tests/large_average.py).
##### Results
```
Running insert took 76.3846685886383
First row: Row(id=0, fields=["jake", Epoch(169), Epoch(367), Epoch(198)])
Fetched all 100000 rows.
Kronicler average: 200.19449000000037 ran in 2.1696090698242188e-05.
Ground truth average: 200.19449 ran in 0.0007288455963134766.
Finished running large_average.
Running insert took 77.20267271995544
First row: Row(id=0, fields=["jake", Epoch(191), Epoch(372), Epoch(181)])
Fetched all 100000 rows.
Kronicler average: 199.92816000000082 ran in 2.3126602172851562e-05.
Finished running large_average_no_in_mem_comp.
```
As you can see, in the first test the kronicler_data amortized const average
took `2.1696090698242188e-05` seconds but the ground truth written in Python
`0.0007288455963134766` seconds. The Rust amortized constant is faster.
## Analytics Web Dashboard
The Analytics Web Dashboard is still under construction. This feature will let you remotely view the logs collected from Kronicler.
<img width="1904" height="944" alt="image" src="https://github.com/user-attachments/assets/cc2b7b32-cbde-4a05-a630-a4cc4ab83444" />
## Analytics CLI
#### Install the Analytics CLI
```
cargo install kronicler
```
You can view all of your data by running `kr` in the directory of your data:
```
kr --fetch all
```
```
kr --fetch <index>
```
You should see the data collected:
<img width="1177" height="531" alt="image" src="https://github.com/user-attachments/assets/bd1d3867-b201-4d6d-9c00-9734536be7e4" />
In the future, there will be many options for sorting, filtering, and viewing specific statistics.
## Logging
By adding the `capture` decorator to your code (as seen below), Kronicler will automatically test the runtime of your function when it gets called. The results of the test get added to the database. This data can later be viewed in the [Analytics Web Dashboard](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#analytics-web-dashboard) or the [Analytics CLI](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#analytics-cli).
```python
import kronicler
@kronicler.capture()
def my_function():
pass
```
### Disable kronicler with env var
To temporarily turn off logging, you can set `KRONICLER_ENABLED=false`. The default for `KRONICLER_ENABLED` is `true`, so it does not need to be set to make logging work.
## Development
#### Building the Python package
##### 1. Build the package
```sh
maturin build
```
You will need maturin installed, see [Install Maturin](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#install-maturin).
##### 2. Install the package
```sh
pip install --force-reinstall target/wheels/kronicler-*
```
#### Testing Python scripts
You can run the scripts in [tests/](https://github.com/JakeRoggenbuck/kronicler/tree/main/tests) to test out the functionality of Kronicler.
```sh
python3 tests/many_test.py
```
#### Testing Rust
You can run the testing suite with the following command:
```
cargo t
```
We use `cargo t` as an alias to run the tests in one thread.
The tests should all succeed
<img width="1309" height="1006" alt="image" src="https://github.com/user-attachments/assets/474f58d5-0195-439d-9218-99735de8862d" />
## Publishing
#### Publishing to Crates.io
##### 1. Increment the version everywhere
##### 2. Run the publish dry-run
```
cargo publish --dry-run
```
##### 3. Check package list
```
cargo package --list
```
Check that only the needed Rust files are included.
##### 4. Publish!
```
cargo publish
```
#### Publishing to PyPi.org
Use maturin to publish the package
```
maturin publish --username __token__ --password <API Token>
```
You may need to get a new API token from [PyPi.org](https://pypi.org/manage/account/token/).
## Misc Docs
#### Python Virtual Environment
Create the virtual environment
```py
python3 -m venv .venv
```
Enter the virtual environment
```
source .venv/bin/activate
```
I usually call my virtual environment either `.venv` or more frequently just `venv`
#### Install Maturin
```sh
pip install maturin
```
For more info, see the [maturin docs](https://github.com/PyO3/maturin).
#### Rust Logging
Kronicler uses [env_logger](https://docs.rs/env_logger/latest/env_logger/) to log internals. To view these logs, you add the `RUST_LOG` env var.
For instance, you can include the logger for `cargo run` with the `fetch` argument.
```
RUST_LOG=info cargo run -- --fetch 0
```
This will print the logs:
<img width="1171" height="653" alt="image" src="https://github.com/user-attachments/assets/60b7cab1-95f5-4f03-a73d-43660db6e5af" />
##### Adding a log
You can add logs with the `info!` macro. There are also `debug!`, `warn!`, `trace!`, and `error!` variants.
```rs
use log::info;
fn main() {
let _ = env_logger::try_init();
info!("Some info here");
}
```
You only need to call `try_init` once, and that's already done in [lib.rs](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/lib.rs) and [main.rs](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/bin/main.rs).
#### Formatting for Python
Kronicler uses [Ruff](https://github.com/astral-sh/ruff) for formatting.
You can format all Python files with:
```
ruff format *.py
```
You can also check that they have the right format with:
```
ruff check *.py
```
#### Formatting for Rust
Kronicler uses `cargo fmt`
<!-- :frog: -->
Raw data
{
"_id": null,
"home_page": "https://github.com/JakeRoggenbuck/kronicler",
"name": "kronicler",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "Jake Roggenbuck <jakeroggenbuck2@gmail.com>",
"keywords": "analytics, metrics, database, columnar",
"author": null,
"author_email": "Jake Roggenbuck <jakeroggenbuck2@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/69/9a/737c8a9b30162376893ec58eb159937bbfde2a932bf6d34acfa8dcaf992b/kronicler-0.1.2.tar.gz",
"platform": null,
"description": "\n\nAutomatic performance capture and analytics for production applications in Python using a custom columnar database written in Rust.\n\n[](https://github.com/JakeRoggenbuck?tab=repositories&q=&type=&language=rust&sort=stargazers)\n[](https://github.com/JakeRoggenbuck?tab=repositories&q=&type=&language=python&sort=stargazers)\n[](https://github.com/JakeRoggenbuck/kronicler/actions)\n[](https://pypi.org/project/kronicler)\n[](https://crates.io/crates/kronicler)\n[](https://crates.io/crates/kronicler)\n\nView Kronicler on [UseKronicler.com](https://usekronicler.com), [PyPi.org](https://pypi.org/project/kronicler), [Crates.io](https://crates.io/crates/kronicler) and [GitHub](https://github.com/JakeRoggenbuck/kronicler).\n\n> [!IMPORTANT]\n> Kronicler is still early in development. I'd appreciate any feedback to help make kronicler more useful for you!\n\n## Benefits of using Kronicler\n\n- Automatic performance capturing\n- Lightweight and concurrent\\*\n- One Python dependency\n- Works out-of-the-box without configuration \n\n\\* concurrency is in development but not fully implemented as of version 0.1.2. Track concurrency in [issue #123](https://github.com/JakeRoggenbuck/kronicler/issues/123).\n\n## Why use Kronicler?\n\nIf you want to monitor the performance of a production application, kronicler offers efficient and lightweight logging with a single library. Kronicler lets you view runtime statistics for functions like mean and median as well as statistics for different percentiles.\n\nA use-case for these statistics is to find functions that occasionally operate much slower than they do on average. By looking at the \"slowest\" speed, the standard error, and the mean, you can find functions that occasionally run much slower than expected. Sometimes it's hard to find and replicate these issues in a test environment, so keeping logs in your production application can improve your ability to find these issues.\n\n## What really is Kronicler?\n\n\n| Name | Description | Link |\n| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |\n| **Kronicler (Python)** | A [Python library](https://pypi.org/project/kronicler/) that provides the `@kronicler.capture` decorator to save performance logs to a database. | [More about Python](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#install-python) |\n| **Kronicler (Database)** | Custom columnar database designed for log capturing and performance analytics. | [More about Database](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#architecture) |\n| **Kronicler (Rust)** | A [Rust library](https://crates.io/crates/kronicler) for accessing the columnar database and capture functions for Rust-based log capturing tasks. | [More about Rust](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#using-kroniclers-database-directly) |\n| **Kronicler (CLI)** | Rust-based CLI tool for analyzing performance logs captured with the capture methods. | [More about CLI](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#analytics-cli) |\n| **Kronicler (Web)** | Prototype web portal for remotely viewing performance logs. | [More about Web](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#analytics-web-dashboard) |\n\n## Install (Python)\n\n#### Install with Pip for Python\n\n```sh\npip install kronicler\n```\n\nYou may need to use a [virtual environment](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#python-virtual-environment).\n\n## Usage (Python)\n\nKronicler provides a Python decorator called `capture` that will calculate the time it takes to run the function.\n\n```python\nimport kronicler\n\n@kronicler.capture\ndef my_function():\n\tpass\n```\n\n## Architecture\n\nSimplified version of the package and database architecture. The data is passed from the Python decorator called [`capture`](https://github.com/JakeRoggenbuck/kronicler/blob/main/python/kronicler/__init__.py) to the [`database`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/database.rs)'s [`queue`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/queue.rs). It then consumes that [`queue`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/queue.rs) to insert each field into its respective [`column`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/column.rs). The [`column`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/column.rs) uses the [`bufferpool`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/bufferpool.rs) to operate on pages.\n\n\n\n\nThis does not include details on:\n- How the [`bufferpool`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/bufferpool.rs) manages [`pages`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/page.rs).\n- How [`pages`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/page.rs) operate.\n- [`capture`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/capture.rs), [`index`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/index.rs), [`row`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/row.rs), or saving and loading with [`metadata`](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/metadata.rs).\n\n#### The Database\n\nThe columnar database is somewhat inspired by my previous database called [RedoxQL](https://github.com/JakeRoggenbuck/RedoxQL). A lot of the structure and architecture is different as well as how data is stored.\n\n#### The Bufferpool\n\nThe bufferpool is based on my [bufferpool](https://github.com/JakeRoggenbuck/bufferpool) project. I had to modify it to work with the rest of this database.\n\n## Future Languages\n\nInstall and Usage for Rust is coming soon...\n\nI plan to implement the Rust version as an `attribute` to be used like the following:\n\n```rust\n#[capture]\nfn foo() { todo!() }\n```\n\n## Examples\n\n#### Using Kronicler (Basic Example)\n\nHere is the most basic usage of Kronicler. Use it to capture the runtime of functions by adding the `@kronicler.capture` decorator.\n\n```python\nimport kronicler\n\n@kronicler.capture\ndef foo():\n print(\"Foo\")\n```\n\n#### Using Kronicler with FastAPI\n\nWith just two lines of code, you can add Kronicler to your [FastAPI](https://fastapi.tiangolo.com) server.\n\nFor FastAPI, to capture each route, you can use the `KroniclerMiddleware` that will be included in `v0.1.2`. This allows you to capture every route that gets called.\n\n```python\nfrom fastapi import FastAPI\nimport uvicorn\nimport kronicler\n\napp = FastAPI()\napp.add_middleware(kronicler.KroniclerMiddleware)\n\n# Used only for the /logs route\nDB = kronicler.Database(sync_consume=True)\n\n\n@app.get(\"/\")\ndef read_root():\n return {\"Hello\": \"World\"}\n\n\n@app.get(\"/logs\")\ndef read_logs():\n return DB.logs()\n\n\nif __name__ == \"__main__\":\n uvicorn.run(app, host=\"0.0.0.0\", port=8000)\n```\n\nIf you want to capture functions manually, you can still do that with `@kronicler.capture` as normal. This is helpful if you want to benchmark functions that are not routes.\n\n```python\nfrom fastapi import FastAPI\nimport uvicorn\nimport kronicler\n\napp = FastAPI()\napp.add_middleware(kronicler.KroniclerMiddleware)\n\n# Used only for the /logs route\nDB = kronicler.Database(sync_consume=True)\n\n\n# You need to wrap helper functions\n@kronicler.capture\ndef foo():\n return {\"Hello\": \"World\"}\n\n\n# You cannot wrap routes right now\n@app.get(\"/\")\ndef read_root():\n return foo()\n\n# Return the logs to the user (optional)\n@app.get(\"/logs\")\ndef read_logs():\n return DB.logs()\n\n\nif __name__ == \"__main__\":\n uvicorn.run(app, host=\"0.0.0.0\", port=8000)\n```\n\nCode from [tests/fastapi-test/main.py](https://github.com/JakeRoggenbuck/kronicler/blob/main/tests/fastapi-test/main.py).\n\n## Using Kronicler manually\n\nIt's recommended to first use Kronicler's built-in `capture` decorator. However, if you want to write your own capture statements and fetch data yourself, you can use the functions in that come with the Python library.\n\n```python\nimport kronicler\n\nDB = kronicler.Database(sync_consume=True)\n\ndef foo():\n DB.capture(\"String Value\", [], 100, 200)\n\n# Call the function\nfoo()\n\nfetched = DB.fetch(0)\nprint(fetched)\n```\n\nMore functionality will be added to the Python library in future releases.\n\n## Using Kronicler's database directly\n\nIf you're interested in using Kronicler's database directly in Rust to add custom logging functions (or just to use a columnar database), the library is published to [crates.io](https://crates.io/crates/kronicler).\n\n#### Install with Cargo for Rust\n\n```\ncargo install kronicler\n```\n\nAdd as a dependency in your `Cargo.toml`.\n\n```toml\n[dependencies]\nkronicler = \"0.1.2\"\n```\n\nTo get a good idea of how to use Kronicler's internal Rust database, I'd recommend looking at some of the tests in the Rust files. You can also look at the source code for the `kr` binary in [main.rs](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/bin/main.rs).\n\nHere is an example of a function that fetches data based on index. It creates a `Database` from the `new_reader` trait.\n\n```rs\nuse kronicler::database::Database;\n\nfn fetch_one(index: usize) {\n let mut db = Database::new_reader();\n\n let row = db.fetch(index);\n\n if let Some(r) = row {\n println!(\"{}\", r.to_string());\n }\n}\n\nfn main() {\n fetch_one(0);\n fetch_one(1);\n}\n```\n\nYou can also make a database that writes new capture data with the `new` trait.\n\n```rs\nuse kronicler::database::Database;\n\nfn main() {\n let mut db = Database::new();\n\n db.capture(\"Name\".to_string(), vec![], 100, 200);\n}\n```\n\n## Performance\n\nKronicler is designed to be as lightweight as possible. By adding logs to a queue concurrently\\*, Kronicler doesn't affect performance by much \\[[PR #73](https://github.com/JakeRoggenbuck/kronicler/pull/73), [PR #76](https://github.com/JakeRoggenbuck/kronicler/pull/76)\\].\n\nFor accessing logs and running calculations, Kronicler uses a columnar database design to optimize file operations when looking at lots of data from only a few columns typical of analytics tasks.\n\n\\* concurrency is in development but not fully implemented as of version 0.1.2. Track concurrency in [issue #123](https://github.com/JakeRoggenbuck/kronicler/issues/123).\n\n### Kronicler DB vs. SQLite\n\nI implemented a [test version of Kronicler](https://github.com/JakeRoggenbuck/kronicler/tree/main/tests/kronicler-sqlite-comparison) logging that uses SQLite under the hood to benchmark against.\n\n#### Experiment 1. Insert 1000 captures\n\nHere is the function that we capture with `kronicler_sqlite.capture` defined by our test package that uses SQLite.\n\n```python\n@kronicler_sqlite.capture\ndef foo_1():\n val = 9\n\n for x in range(4):\n val += val + x\n\n return val\n```\n\nHere is where we call the function `CAPTURE_COUNT` times. Which in this case is 1000.\n\n```python\ndef test_sqlite():\n ## Test for kronicler_sqlite\n\n # Warmup\n for _ in range(WARMUP_COUNT):\n foo_1()\n\n # Test\n for _ in range(CAPTURE_COUNT):\n foo_1()\n```\n\nWe do the same for the Kronicler DB version with `kronicler.capture`.\n\nWe then run each of those functions 50 times and log the results:\n\n```python\nif __name__ == \"__main__\":\n insert_times_data = []\n avg_times_data = []\n\n for x in tqdm.tqdm(range(REPEATS)):\n # TEST sqlite inserts\n start = time.time_ns()\n test_sqlite()\n end = time.time_ns()\n print(f\"{test_sqlite.__name__} took {end - start}ns\")\n insert_times_data.append((test_sqlite.__name__, end - start))\n\n # TEST sqlite avg\n start = time.time_ns()\n avg_val = avg_sqlite()\n end = time.time_ns()\n print(f\"{avg_sqlite.__name__} = {avg_val} and took {end - start}ns\")\n avg_times_data.append((avg_sqlite.__name__, end - start))\n\n # Wait for any cleanup to happen between SQLite and Columnar\n time.sleep(2)\n\n # TEST columnar inserts\n start = time.time_ns()\n test_columnar()\n end = time.time_ns()\n print(f\"{test_columnar.__name__} took {end - start}ns\")\n insert_times_data.append((test_columnar.__name__, end - start))\n\n # TEST columnar avg\n start = time.time_ns()\n avg_val = avg_columnar()\n end = time.time_ns()\n print(f\"{avg_columnar.__name__} = {avg_val} and took {end - start}ns\")\n avg_times_data.append((avg_columnar.__name__, end - start))\n\n # Wait for any cleanup to happen between Columnar and No log\n time.sleep(2)\n\n # TEST no log inserts\n start = time.time_ns()\n test_no_logging()\n end = time.time_ns()\n print(f\"{test_no_logging.__name__} took {end - start}ns\")\n insert_times_data.append((test_no_logging.__name__, end - start))\n\n # TEST no logging avg\n start = time.time_ns()\n avg_val = avg_no_logging()\n end = time.time_ns()\n print(f\"{avg_no_logging.__name__} = {avg_val} and took {end - start}ns\")\n avg_times_data.append((avg_no_logging.__name__, end - start))\n\n with open(\"sync_insert_data.json\", \"w\") as file:\n json.dump(insert_times_data, file)\n\n with open(\"sync_avg_data.json\", \"w\") as file:\n json.dump(avg_times_data, file)\n```\n\nThis test is called [simple_sync.py](tests/kronicler-sqlite-comparison/tests/simple_sync.py). Note: concurrent mode is turned off as of v0.1.1, so those tests will not run. The concurrent version of the test is [simple_concurrent.py](tests/kronicler-sqlite-comparison/tests/simple_concurrent.py) and will exit with an error message explaining the lack of support in v0.1.1.\n\n##### Insert (writing data to disk):\n\n<img width=\"800\" height=\"500\" alt=\"sync_insert_50\" src=\"https://github.com/user-attachments/assets/712ee44d-e879-4d2c-85fe-219f4d36b373\" />\n\nThe data can be found at [sync_insert_data.json](tests/kronicler-sqlite-comparison/tests/sync_insert_data.json).\n\nInserting is **7.71x** faster than SQLite.\n\nIt's still unknown why SQLite has large latency spikes, but information about that will be mentioned in [issue #101](https://github.com/JakeRoggenbuck/kronicler/issues/101) if found.\n\n##### Average (calculating the mean):\n\n<img width=\"800\" height=\"500\" alt=\"sync_avg_50\" src=\"https://github.com/user-attachments/assets/33e5fb2a-92e8-4807-a1eb-bb89291572b8\" />\n\nThe data can be found at [sync_avg_data.json](tests/kronicler-sqlite-comparison/tests/sync_avg_data.json).\n\nKronicler uses amortized constant calculations to keep an average runtime for functions. This causes the mean calculation to be **837.24x** faster than the average function in SQLite.\n\nHere is how it's done in SQLite:\n\n```sql\nSELECT AVG(delta) FROM function_calls WHERE function_name = ?\n```\n\nKronicler keeps an updated mean on insert. This same approach can be done with SQLite by having your own index on function names and a table to keep track of the mean function time the same way Kronicler does it, however that's not the default and you'd have to build that into your implementation.\n\n### Kronicler Mean with Large Data Test\n\n#### Correctness for average (mean) calculation for large data\n\n##### The test script\n\n```sh\nrm -rf .kronicler_data\n\nsleep 2\n\npython3 ./large_average.py\n\necho -e \"Finished running large_average.\\n\\n\"\n\nrm -rf .kronicler_data\n\nsleep 2\n\npython3 ./large_average_no_in_mem_comp.py\n\necho -e \"Finished running large_average_no_in_mem_comp.\\n\\n\"\n\necho \"Note: large_average has a higher insert time because it needs to store ground truth values in memory. The ground truth average will also be quicker because it uses only in-memory values.\"\n```\n\nThis script is called [run_large_avg.sh](tests/python-integration-tests/run_large_avg.sh).\n\nImportantly, we test that the average is correct using a \"ground truth\" calculation.\n\n```py\nstart = time.time()\nkr_avg = DB.average(\"jake\")\nkr_avg_time = time.time() - start\nprint(\"Kronicler average: \", kr_avg, f\"ran in {kr_avg_time}.\")\n\nstart = time.time()\npy_avg = mean(ground_truth_data)\npy_avg_time = time.time() - start\nprint(\"Ground truth average: \", py_avg, f\"ran in {py_avg_time}.\")\n\nassert kr_avg - py_avg < 0.0001\n```\n\nThis is from [large_average.py](tests/python-integration-tests/large_average.py).\n\n##### Results\n\n```\nRunning insert took 76.3846685886383\nFirst row: Row(id=0, fields=[\"jake\", Epoch(169), Epoch(367), Epoch(198)])\nFetched all 100000 rows.\nKronicler average: 200.19449000000037 ran in 2.1696090698242188e-05.\nGround truth average: 200.19449 ran in 0.0007288455963134766.\nFinished running large_average.\n\n\nRunning insert took 77.20267271995544\nFirst row: Row(id=0, fields=[\"jake\", Epoch(191), Epoch(372), Epoch(181)])\nFetched all 100000 rows.\nKronicler average: 199.92816000000082 ran in 2.3126602172851562e-05.\nFinished running large_average_no_in_mem_comp.\n```\n\nAs you can see, in the first test the kronicler_data amortized const average \ntook `2.1696090698242188e-05` seconds but the ground truth written in Python \n`0.0007288455963134766` seconds. The Rust amortized constant is faster.\n\n## Analytics Web Dashboard\n\nThe Analytics Web Dashboard is still under construction. This feature will let you remotely view the logs collected from Kronicler.\n\n<img width=\"1904\" height=\"944\" alt=\"image\" src=\"https://github.com/user-attachments/assets/cc2b7b32-cbde-4a05-a630-a4cc4ab83444\" />\n\n## Analytics CLI\n\n#### Install the Analytics CLI\n\n```\ncargo install kronicler\n```\n\nYou can view all of your data by running `kr` in the directory of your data:\n\n```\nkr --fetch all\n```\n\n```\nkr --fetch <index>\n```\n\nYou should see the data collected:\n\n<img width=\"1177\" height=\"531\" alt=\"image\" src=\"https://github.com/user-attachments/assets/bd1d3867-b201-4d6d-9c00-9734536be7e4\" />\n\nIn the future, there will be many options for sorting, filtering, and viewing specific statistics.\n\n## Logging\n\nBy adding the `capture` decorator to your code (as seen below), Kronicler will automatically test the runtime of your function when it gets called. The results of the test get added to the database. This data can later be viewed in the [Analytics Web Dashboard](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#analytics-web-dashboard) or the [Analytics CLI](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#analytics-cli).\n\n```python\nimport kronicler\n\n@kronicler.capture()\ndef my_function():\n\tpass\n```\n\n### Disable kronicler with env var\n\nTo temporarily turn off logging, you can set `KRONICLER_ENABLED=false`. The default for `KRONICLER_ENABLED` is `true`, so it does not need to be set to make logging work.\n\n## Development\n\n#### Building the Python package\n\n##### 1. Build the package\n\n```sh\nmaturin build\n```\n\nYou will need maturin installed, see [Install Maturin](https://github.com/JakeRoggenbuck/kronicler?tab=readme-ov-file#install-maturin).\n\n##### 2. Install the package\n\n```sh\npip install --force-reinstall target/wheels/kronicler-*\n```\n\n#### Testing Python scripts\n\nYou can run the scripts in [tests/](https://github.com/JakeRoggenbuck/kronicler/tree/main/tests) to test out the functionality of Kronicler.\n\n```sh\npython3 tests/many_test.py\n```\n\n#### Testing Rust\n\nYou can run the testing suite with the following command:\n\n```\ncargo t\n```\n\nWe use `cargo t` as an alias to run the tests in one thread.\n\nThe tests should all succeed\n\n<img width=\"1309\" height=\"1006\" alt=\"image\" src=\"https://github.com/user-attachments/assets/474f58d5-0195-439d-9218-99735de8862d\" />\n\n## Publishing\n\n#### Publishing to Crates.io\n\n##### 1. Increment the version everywhere\n\n##### 2. Run the publish dry-run\n\n```\ncargo publish --dry-run\n```\n\n##### 3. Check package list\n\n```\ncargo package --list\n```\n\nCheck that only the needed Rust files are included.\n\n##### 4. Publish!\n\n```\ncargo publish\n```\n\n#### Publishing to PyPi.org\n\nUse maturin to publish the package\n\n```\nmaturin publish --username __token__ --password <API Token>\n```\n\nYou may need to get a new API token from [PyPi.org](https://pypi.org/manage/account/token/).\n\n## Misc Docs\n\n#### Python Virtual Environment\n\nCreate the virtual environment\n\n```py\npython3 -m venv .venv\n```\n\nEnter the virtual environment\n\n```\nsource .venv/bin/activate\n```\n\nI usually call my virtual environment either `.venv` or more frequently just `venv`\n\n#### Install Maturin\n\n```sh\npip install maturin\n```\n\nFor more info, see the [maturin docs](https://github.com/PyO3/maturin).\n\n#### Rust Logging\n\nKronicler uses [env_logger](https://docs.rs/env_logger/latest/env_logger/) to log internals. To view these logs, you add the `RUST_LOG` env var.\n\nFor instance, you can include the logger for `cargo run` with the `fetch` argument.\n\n```\nRUST_LOG=info cargo run -- --fetch 0\n```\n\nThis will print the logs:\n\n<img width=\"1171\" height=\"653\" alt=\"image\" src=\"https://github.com/user-attachments/assets/60b7cab1-95f5-4f03-a73d-43660db6e5af\" />\n\n##### Adding a log\n\nYou can add logs with the `info!` macro. There are also `debug!`, `warn!`, `trace!`, and `error!` variants.\n\n```rs\nuse log::info;\n\nfn main() {\n let _ = env_logger::try_init();\n\n info!(\"Some info here\");\n}\n```\n\nYou only need to call `try_init` once, and that's already done in [lib.rs](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/lib.rs) and [main.rs](https://github.com/JakeRoggenbuck/kronicler/blob/main/src/bin/main.rs).\n\n#### Formatting for Python\n\nKronicler uses [Ruff](https://github.com/astral-sh/ruff) for formatting.\n\nYou can format all Python files with:\n\n```\nruff format *.py\n```\n\nYou can also check that they have the right format with:\n\n```\nruff check *.py\n```\n\n#### Formatting for Rust\n\nKronicler uses `cargo fmt`\n\n<!-- :frog: -->\n\n",
"bugtrack_url": null,
"license": null,
"summary": "Automatic performance capture and analysis for production applications in Python using a custom columnar database written in Rust.",
"version": "0.1.2",
"project_urls": {
"Homepage": "https://github.com/JakeRoggenbuck/kronicler",
"Repository": "https://github.com/JakeRoggenbuck/kronicler"
},
"split_keywords": [
"analytics",
" metrics",
" database",
" columnar"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "c01ec8286954951017cab180d7c3f6052a09afabf0ab7a1971fa4c5bd848af25",
"md5": "e7624621bb51a258cda9c878a6c4e5f1",
"sha256": "f686a2ef8a8c5888f479d3ee04e341a4d415a13077241f8f5e89bfb4a6595939"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "e7624621bb51a258cda9c878a6c4e5f1",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 906099,
"upload_time": "2025-10-22T18:25:39",
"upload_time_iso_8601": "2025-10-22T18:25:39.998280Z",
"url": "https://files.pythonhosted.org/packages/c0/1e/c8286954951017cab180d7c3f6052a09afabf0ab7a1971fa4c5bd848af25/kronicler-0.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5d1a54178c102b84bbfafa3beb2564c125ebffeefe095aa905da748148be850f",
"md5": "116704a8813df4bfc9b2bd55b36dc832",
"sha256": "a50a516ae96eadeb76544e3459f23debc7d39a9a0e8858c10837d2d1c6fdefb0"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "116704a8813df4bfc9b2bd55b36dc832",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 886162,
"upload_time": "2025-10-22T18:25:56",
"upload_time_iso_8601": "2025-10-22T18:25:56.946485Z",
"url": "https://files.pythonhosted.org/packages/5d/1a/54178c102b84bbfafa3beb2564c125ebffeefe095aa905da748148be850f/kronicler-0.1.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4a639095b518a196b428147d9106375fc53d9d7b91694492b428fb45ac765c71",
"md5": "1d40316fea74fc3f6953f96bee232938",
"sha256": "e1e4262146e7177b8d60871b83e1025f18f7e2d76ce9167a8faf56d0497c3034"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "1d40316fea74fc3f6953f96bee232938",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 985923,
"upload_time": "2025-10-22T18:26:35",
"upload_time_iso_8601": "2025-10-22T18:26:35.645695Z",
"url": "https://files.pythonhosted.org/packages/4a/63/9095b518a196b428147d9106375fc53d9d7b91694492b428fb45ac765c71/kronicler-0.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3357bc845f5baef53090dc883d4d8c3e0da89ace8550d801197ec8814502ca35",
"md5": "62ebdca0f3d460bd89bdd02d66237463",
"sha256": "afc63cf37a4ff4ab519b9883868400f132782577202f04bf4da3f02e9750509c"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "62ebdca0f3d460bd89bdd02d66237463",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 1136683,
"upload_time": "2025-10-22T18:26:09",
"upload_time_iso_8601": "2025-10-22T18:26:09.554913Z",
"url": "https://files.pythonhosted.org/packages/33/57/bc845f5baef53090dc883d4d8c3e0da89ace8550d801197ec8814502ca35/kronicler-0.1.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "537654f1f20b98b9708f87a88cb56df7f7ce0f208c41f0c8b4aab91e7958f146",
"md5": "62737f062be31c77abb85d93aae2d151",
"sha256": "7945d7838701058d5b7a00cdfab383e6c2212aeb07eea5c6acecfdd8d6f79988"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "62737f062be31c77abb85d93aae2d151",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 956360,
"upload_time": "2025-10-22T18:26:22",
"upload_time_iso_8601": "2025-10-22T18:26:22.098701Z",
"url": "https://files.pythonhosted.org/packages/53/76/54f1f20b98b9708f87a88cb56df7f7ce0f208c41f0c8b4aab91e7958f146/kronicler-0.1.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6e4b81a3c087942fc67c2f805e7d549c827203bef6d1206b966e8f2e8fe297f1",
"md5": "b6c2279f72d21d829efa01313bd0bb49",
"sha256": "500cfe399ad98f19742078ad022d5c75df3a4772ee86bbfcd73871948ab07fe3"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "b6c2279f72d21d829efa01313bd0bb49",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 954788,
"upload_time": "2025-10-22T18:26:44",
"upload_time_iso_8601": "2025-10-22T18:26:44.787872Z",
"url": "https://files.pythonhosted.org/packages/6e/4b/81a3c087942fc67c2f805e7d549c827203bef6d1206b966e8f2e8fe297f1/kronicler-0.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8dd45e452307becb7c9ca448d4da0aa2af4ef6d2739b6235b045d013e7d49894",
"md5": "85183e413e99369e54d4b8bc801694de",
"sha256": "b32d67b4b62d0e7928654c23a5f508834800b7f1d961c9be0ddde8d0a9acfd7b"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "85183e413e99369e54d4b8bc801694de",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 1087719,
"upload_time": "2025-10-22T18:27:01",
"upload_time_iso_8601": "2025-10-22T18:27:01.942658Z",
"url": "https://files.pythonhosted.org/packages/8d/d4/5e452307becb7c9ca448d4da0aa2af4ef6d2739b6235b045d013e7d49894/kronicler-0.1.2-cp310-cp310-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1eb7511c76e49bcbeb35e50ba300dd629bf81506fe9b9636548b09256d5a20b5",
"md5": "f18a5520a6d89769d8ff38db9a9af376",
"sha256": "5338c970ecff1c6c627f6265865554feeed279442813a22bd4c3fb3f73496d52"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "f18a5520a6d89769d8ff38db9a9af376",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 1150724,
"upload_time": "2025-10-22T18:27:14",
"upload_time_iso_8601": "2025-10-22T18:27:14.178618Z",
"url": "https://files.pythonhosted.org/packages/1e/b7/511c76e49bcbeb35e50ba300dd629bf81506fe9b9636548b09256d5a20b5/kronicler-0.1.2-cp310-cp310-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "57c4aeab10333dfc1b0656b6e0411231338a9e99378484159f70fb4217f89600",
"md5": "6e4f3232c4d4afea97beae671e540350",
"sha256": "ba3fc3081c019ea83e072198bf292a8fc43775dffc7e1c92d47fe16b6f72a902"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "6e4f3232c4d4afea97beae671e540350",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 1121704,
"upload_time": "2025-10-22T18:27:26",
"upload_time_iso_8601": "2025-10-22T18:27:26.906869Z",
"url": "https://files.pythonhosted.org/packages/57/c4/aeab10333dfc1b0656b6e0411231338a9e99378484159f70fb4217f89600/kronicler-0.1.2-cp310-cp310-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "62ea16a13b557563e07714c80231ccf7388611fb32edb2307567e67028025e49",
"md5": "50eb065df742b3186e46de8457d24f1f",
"sha256": "30cf183c8869e6d6e8f522aa41d68c40c315dacd15b0ba4086097f845bea4831"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "50eb065df742b3186e46de8457d24f1f",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 1127018,
"upload_time": "2025-10-22T18:27:39",
"upload_time_iso_8601": "2025-10-22T18:27:39.150752Z",
"url": "https://files.pythonhosted.org/packages/62/ea/16a13b557563e07714c80231ccf7388611fb32edb2307567e67028025e49/kronicler-0.1.2-cp310-cp310-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2fd8a7ce646795983da0b2db2d5075487e6045636693ef88b72294a0099d3dec",
"md5": "cfbdfe52cb46fd0ea5f211f850327d1c",
"sha256": "928cf389d9fb8ed10d08c6cc4dd7e377dd269be78dbb280935fd656da4570546"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "cfbdfe52cb46fd0ea5f211f850327d1c",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.8",
"size": 719793,
"upload_time": "2025-10-22T18:27:52",
"upload_time_iso_8601": "2025-10-22T18:27:52.881232Z",
"url": "https://files.pythonhosted.org/packages/2f/d8/a7ce646795983da0b2db2d5075487e6045636693ef88b72294a0099d3dec/kronicler-0.1.2-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d5c65b4d5c4c6a0bdb0a2a7061b320b59bc7626341f21bc4ae1ace3965e76e64",
"md5": "ab4fc4cd02faa279fd6e9e7181c54285",
"sha256": "d394e3be4129d8e29100268f7d1f5d2a93a9cf1e95db2450cc6ad4d1b6fd5f94"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "ab4fc4cd02faa279fd6e9e7181c54285",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 888778,
"upload_time": "2025-10-22T18:26:58",
"upload_time_iso_8601": "2025-10-22T18:26:58.809300Z",
"url": "https://files.pythonhosted.org/packages/d5/c6/5b4d5c4c6a0bdb0a2a7061b320b59bc7626341f21bc4ae1ace3965e76e64/kronicler-0.1.2-cp311-cp311-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ee169bf984828ac11b1004c616f5ab847cf6d15cb059db7d8f88549a1d1a227c",
"md5": "5fc6b6144ea4881884aa90f1633f29e8",
"sha256": "c96d144ad572520385d4fd56415da887bf3242bb1de1d7a02c03ff52bd8bd142"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "5fc6b6144ea4881884aa90f1633f29e8",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 823833,
"upload_time": "2025-10-22T18:26:54",
"upload_time_iso_8601": "2025-10-22T18:26:54.293656Z",
"url": "https://files.pythonhosted.org/packages/ee/16/9bf984828ac11b1004c616f5ab847cf6d15cb059db7d8f88549a1d1a227c/kronicler-0.1.2-cp311-cp311-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "854ad2474246de0a245d312037bc01c4980cf2363f2ab53fac97e442b426ac31",
"md5": "d89cd8425275a4f2fa3ab373bc43a460",
"sha256": "99114568b786d82c955ffc8f54856c8a806bb8f12e35ed2ba59341a77729d3d1"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "d89cd8425275a4f2fa3ab373bc43a460",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 906204,
"upload_time": "2025-10-22T18:25:41",
"upload_time_iso_8601": "2025-10-22T18:25:41.384123Z",
"url": "https://files.pythonhosted.org/packages/85/4a/d2474246de0a245d312037bc01c4980cf2363f2ab53fac97e442b426ac31/kronicler-0.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "46612aad5e55afc4fda0aa401e442bcdcc8cdd4076ef7c6375ca14c4150af769",
"md5": "a5af3f3cd1f629177441b3534d74b87d",
"sha256": "b0cc59866bae7506eec42da47c384046771bee122e5b5992fa91af9073a3a8b1"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "a5af3f3cd1f629177441b3534d74b87d",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 886200,
"upload_time": "2025-10-22T18:25:58",
"upload_time_iso_8601": "2025-10-22T18:25:58.084509Z",
"url": "https://files.pythonhosted.org/packages/46/61/2aad5e55afc4fda0aa401e442bcdcc8cdd4076ef7c6375ca14c4150af769/kronicler-0.1.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f1f6ae655e8d9e4ff4ffe0005e28854007735bc808da2a1a61c73dfcb5b1d389",
"md5": "f0184b4a64416137737176beb9355b02",
"sha256": "5f988d159e3a2a944a6ec2e45d47715df64a868ad1bb32ebd8b55028a382b03e"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "f0184b4a64416137737176beb9355b02",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 985901,
"upload_time": "2025-10-22T18:26:36",
"upload_time_iso_8601": "2025-10-22T18:26:36.733024Z",
"url": "https://files.pythonhosted.org/packages/f1/f6/ae655e8d9e4ff4ffe0005e28854007735bc808da2a1a61c73dfcb5b1d389/kronicler-0.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "59fc41a5010298d3e459d286ace4b50c0ee87f515fe475ef993b59250f0564fa",
"md5": "623c7c1beeadc6ae21a9476c2c3e7c8a",
"sha256": "dae68a1b083df91aaf0c2ba8dc75416bcb766a1d925bf8990b8525da757be335"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "623c7c1beeadc6ae21a9476c2c3e7c8a",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 1136828,
"upload_time": "2025-10-22T18:26:10",
"upload_time_iso_8601": "2025-10-22T18:26:10.558163Z",
"url": "https://files.pythonhosted.org/packages/59/fc/41a5010298d3e459d286ace4b50c0ee87f515fe475ef993b59250f0564fa/kronicler-0.1.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8590299f553cdd67b621e88f1ec9f559dc66dd5fbd48e9b364c7cacb327bfcb2",
"md5": "15a7c3371b76a268f88decfd1e29d4cd",
"sha256": "5893ec76f847a1c0b9e9657741745b77b373902c79cdc297aadaecfbc934dc6f"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "15a7c3371b76a268f88decfd1e29d4cd",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 956278,
"upload_time": "2025-10-22T18:26:23",
"upload_time_iso_8601": "2025-10-22T18:26:23.114063Z",
"url": "https://files.pythonhosted.org/packages/85/90/299f553cdd67b621e88f1ec9f559dc66dd5fbd48e9b364c7cacb327bfcb2/kronicler-0.1.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9a9651e055bd772b6d4b2f1c3f835fc28f5fa6a91a5606bf767fff31bea70cc3",
"md5": "8e02c7569a1281aa72de4de2bd73053e",
"sha256": "4fa7452a7f8251e603bd3b17db5030ea4f9ebaf277504ebfbab702a3550b7e12"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "8e02c7569a1281aa72de4de2bd73053e",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 954676,
"upload_time": "2025-10-22T18:26:45",
"upload_time_iso_8601": "2025-10-22T18:26:45.871279Z",
"url": "https://files.pythonhosted.org/packages/9a/96/51e055bd772b6d4b2f1c3f835fc28f5fa6a91a5606bf767fff31bea70cc3/kronicler-0.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3ab1726274de25e0bcddc04e3154d47ed6d7c456c5b0bc1bd9111ccc8a3c9c46",
"md5": "e2284f60f52e3e5e8f9291d638841620",
"sha256": "df76799fda9bb9c3bb2d302eb8fe95c67bc7b29e7d35182421a18bdbd1e812a0"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "e2284f60f52e3e5e8f9291d638841620",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 1087601,
"upload_time": "2025-10-22T18:27:03",
"upload_time_iso_8601": "2025-10-22T18:27:03.237255Z",
"url": "https://files.pythonhosted.org/packages/3a/b1/726274de25e0bcddc04e3154d47ed6d7c456c5b0bc1bd9111ccc8a3c9c46/kronicler-0.1.2-cp311-cp311-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6b5d67f059f2a04679b1d7fad0956ab3fa5f9a3ebcb77598257c441e7d4012d6",
"md5": "14ddd1facd1a4973e44989a6a1ad6d43",
"sha256": "ec612339d599f52ce5355ff614678005698cc86b038085477175b10ff543c83a"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "14ddd1facd1a4973e44989a6a1ad6d43",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 1150855,
"upload_time": "2025-10-22T18:27:15",
"upload_time_iso_8601": "2025-10-22T18:27:15.525094Z",
"url": "https://files.pythonhosted.org/packages/6b/5d/67f059f2a04679b1d7fad0956ab3fa5f9a3ebcb77598257c441e7d4012d6/kronicler-0.1.2-cp311-cp311-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ad11693ea48028362eaa57c815aa3d5d0f94d9413ba9b32d318e49767b0b56d1",
"md5": "c707cd24f4bb3a85e7cb55fcd9ece637",
"sha256": "fb03bd4f0884d2f9a90b8ede8b9d187b4c5968626e2358a66f6fe13c936b5f56"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "c707cd24f4bb3a85e7cb55fcd9ece637",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 1121818,
"upload_time": "2025-10-22T18:27:28",
"upload_time_iso_8601": "2025-10-22T18:27:28.625233Z",
"url": "https://files.pythonhosted.org/packages/ad/11/693ea48028362eaa57c815aa3d5d0f94d9413ba9b32d318e49767b0b56d1/kronicler-0.1.2-cp311-cp311-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "67f703d88d9068d1d21ab95593c6faa8fc9f8d091a2f4b8d526e9eae2e997a0e",
"md5": "160078b6892f8c290ac904c6c335d42f",
"sha256": "f4a97a85bc9faccaa721b0889ff7237fd6f1db0ef1e68e46fb83564ab334608d"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "160078b6892f8c290ac904c6c335d42f",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 1126927,
"upload_time": "2025-10-22T18:27:40",
"upload_time_iso_8601": "2025-10-22T18:27:40.259718Z",
"url": "https://files.pythonhosted.org/packages/67/f7/03d88d9068d1d21ab95593c6faa8fc9f8d091a2f4b8d526e9eae2e997a0e/kronicler-0.1.2-cp311-cp311-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8d2f1330941e0ca1e93d2fa2b3d8decd9835b72b4573cb6311ca5a685bcea957",
"md5": "3a4a580dcad1ac6666cd9ecea135eca7",
"sha256": "1bb62c6c7fdbc2d322e8c948fc7c148ac4acac589bd9547f2aa07b7ec7f96040"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "3a4a580dcad1ac6666cd9ecea135eca7",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.8",
"size": 719648,
"upload_time": "2025-10-22T18:27:54",
"upload_time_iso_8601": "2025-10-22T18:27:54.007997Z",
"url": "https://files.pythonhosted.org/packages/8d/2f/1330941e0ca1e93d2fa2b3d8decd9835b72b4573cb6311ca5a685bcea957/kronicler-0.1.2-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fd3ee5035ee76ffc32e87013d3fd9e34e696fd31065a1711b76db6e4980d9679",
"md5": "cdc73d3ba0bab0546827953eaa619913",
"sha256": "837377830c6bcc4d1a664864670b537cb871b0db7ca83c6b1ad2a6f40ae15cdb"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "cdc73d3ba0bab0546827953eaa619913",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 885535,
"upload_time": "2025-10-22T18:26:59",
"upload_time_iso_8601": "2025-10-22T18:26:59.834008Z",
"url": "https://files.pythonhosted.org/packages/fd/3e/e5035ee76ffc32e87013d3fd9e34e696fd31065a1711b76db6e4980d9679/kronicler-0.1.2-cp312-cp312-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b4b25f033fdc9f3f9e762c16aaf0ae215930c055428d0d3a04c7733db6191826",
"md5": "e693c9a2cf624bd8e7640ee61e3bad60",
"sha256": "6b9823fdb701fd088f20946263ed14f827c7d886fa3b9b67efc4d615ef71fcbd"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "e693c9a2cf624bd8e7640ee61e3bad60",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 820795,
"upload_time": "2025-10-22T18:26:55",
"upload_time_iso_8601": "2025-10-22T18:26:55.426939Z",
"url": "https://files.pythonhosted.org/packages/b4/b2/5f033fdc9f3f9e762c16aaf0ae215930c055428d0d3a04c7733db6191826/kronicler-0.1.2-cp312-cp312-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3129c862714036a4735dc7cb8f0ee94f400b7e7a91a052033c8c8dfc2ef66641",
"md5": "9ed9c48056e14e283ec9994f7fc60cb2",
"sha256": "d375ee7b80a5977cf9fab8fa4587a0ce406376a3aa4d4cf54770b3698b2c015f"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "9ed9c48056e14e283ec9994f7fc60cb2",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 906042,
"upload_time": "2025-10-22T18:25:42",
"upload_time_iso_8601": "2025-10-22T18:25:42.909901Z",
"url": "https://files.pythonhosted.org/packages/31/29/c862714036a4735dc7cb8f0ee94f400b7e7a91a052033c8c8dfc2ef66641/kronicler-0.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8e3efd67ca0a54ee74fb1943f0d1255959d1cd36243ca794487fc41520e37c1a",
"md5": "311b94c065ca38b7270fa2d5c362df4e",
"sha256": "e66fd73149a9e7dac9261297724c62f8b19d92874bcaa3c09659a88c1f3a84fc"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "311b94c065ca38b7270fa2d5c362df4e",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 886066,
"upload_time": "2025-10-22T18:25:59",
"upload_time_iso_8601": "2025-10-22T18:25:59.107582Z",
"url": "https://files.pythonhosted.org/packages/8e/3e/fd67ca0a54ee74fb1943f0d1255959d1cd36243ca794487fc41520e37c1a/kronicler-0.1.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "98fc1e2b847c0eeacfd106b169e868790fa26cfc6f39f19efe260e2bbaa2c0de",
"md5": "ac2ea3bf6f8d788cf731e7c224bc0777",
"sha256": "94bb1fa4b781fa756873a25f56ea5d1029f427a6bd76f2eb6228435ecf353dd1"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "ac2ea3bf6f8d788cf731e7c224bc0777",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 984920,
"upload_time": "2025-10-22T18:26:37",
"upload_time_iso_8601": "2025-10-22T18:26:37.850783Z",
"url": "https://files.pythonhosted.org/packages/98/fc/1e2b847c0eeacfd106b169e868790fa26cfc6f39f19efe260e2bbaa2c0de/kronicler-0.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "79b1edea9f2da8c3a02ebac91c9e93eb0f58e35144424fb23ab5fe3ce154abad",
"md5": "660639c56217b4b3ea63c80670742a45",
"sha256": "d8535083787efcc17de8d8f9957c36227e81e66a32ab9e7705f32b12844c9cf2"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "660639c56217b4b3ea63c80670742a45",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 1136702,
"upload_time": "2025-10-22T18:26:11",
"upload_time_iso_8601": "2025-10-22T18:26:11.896759Z",
"url": "https://files.pythonhosted.org/packages/79/b1/edea9f2da8c3a02ebac91c9e93eb0f58e35144424fb23ab5fe3ce154abad/kronicler-0.1.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1ac9da5dd7b70954506413e781e1a9b5236f511717157176ac827cac73358103",
"md5": "94d781fcee6d4f5822c6bb0488cbbf96",
"sha256": "f752a001c0b3738a9a217ab6fb7c6d6e7783d5ae0cc1336e68d82419f867ed0c"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "94d781fcee6d4f5822c6bb0488cbbf96",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 956741,
"upload_time": "2025-10-22T18:26:24",
"upload_time_iso_8601": "2025-10-22T18:26:24.197136Z",
"url": "https://files.pythonhosted.org/packages/1a/c9/da5dd7b70954506413e781e1a9b5236f511717157176ac827cac73358103/kronicler-0.1.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "a1cfda55719742948a9be1e7e1f67cb55d4e3764f77353fb5d6930d88fe9088f",
"md5": "15e359e4d42f242e58ed21893912ab3d",
"sha256": "ffef0665f451a8091c363142d357c1d1c9a09ddde93314e2c0d1f35a20f47fe6"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "15e359e4d42f242e58ed21893912ab3d",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 955296,
"upload_time": "2025-10-22T18:26:46",
"upload_time_iso_8601": "2025-10-22T18:26:46.959043Z",
"url": "https://files.pythonhosted.org/packages/a1/cf/da55719742948a9be1e7e1f67cb55d4e3764f77353fb5d6930d88fe9088f/kronicler-0.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ea6179e5fdec0f21b0bd4d62d9af9c024baef4d8b9ad97d83979d1aecff403c8",
"md5": "528c88705e558b52def962665b86c32e",
"sha256": "9850e915919b857b90df7e8c44d5e6d0361ce452bdcc46ea05c1dcbff73d5a9c"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "528c88705e558b52def962665b86c32e",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 1087454,
"upload_time": "2025-10-22T18:27:04",
"upload_time_iso_8601": "2025-10-22T18:27:04.341006Z",
"url": "https://files.pythonhosted.org/packages/ea/61/79e5fdec0f21b0bd4d62d9af9c024baef4d8b9ad97d83979d1aecff403c8/kronicler-0.1.2-cp312-cp312-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "44ffcc08d8e3b2f34abf225b4f47fc5d3b2fae7d7238bc49a555c61a0a73d362",
"md5": "099578651680e4db8b14d47a3d5ed7c7",
"sha256": "080177fef8eca541f312e4035a2531dd515af42610b539c9dd1c83ea8eeb54a2"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "099578651680e4db8b14d47a3d5ed7c7",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 1150144,
"upload_time": "2025-10-22T18:27:16",
"upload_time_iso_8601": "2025-10-22T18:27:16.869514Z",
"url": "https://files.pythonhosted.org/packages/44/ff/cc08d8e3b2f34abf225b4f47fc5d3b2fae7d7238bc49a555c61a0a73d362/kronicler-0.1.2-cp312-cp312-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "852355706491008c51e9e82a7fe7236cf9ad8c4e31fb69bb709d22a78784ce23",
"md5": "192ec4bc53a2dc81f070ea6c1789aebb",
"sha256": "03c2432b95e873b026c3b3fb0a62626f22c2b6cb6168e7495e172151805fecb5"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "192ec4bc53a2dc81f070ea6c1789aebb",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 1120038,
"upload_time": "2025-10-22T18:27:29",
"upload_time_iso_8601": "2025-10-22T18:27:29.797829Z",
"url": "https://files.pythonhosted.org/packages/85/23/55706491008c51e9e82a7fe7236cf9ad8c4e31fb69bb709d22a78784ce23/kronicler-0.1.2-cp312-cp312-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4f5850cd5e0acbf91ccff686cea70a34d6db23b3f98b5c01ee575bc271c7ebe7",
"md5": "15ec8474e099811aee68796cf813f833",
"sha256": "cf638a1a2835533fbc275a143786e1e489d546476b4a53bd9f0128b04a7f06a4"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "15ec8474e099811aee68796cf813f833",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 1127257,
"upload_time": "2025-10-22T18:27:41",
"upload_time_iso_8601": "2025-10-22T18:27:41.478853Z",
"url": "https://files.pythonhosted.org/packages/4f/58/50cd5e0acbf91ccff686cea70a34d6db23b3f98b5c01ee575bc271c7ebe7/kronicler-0.1.2-cp312-cp312-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b558414b8508d2cab4039a04485248ddc97341f2adc888fead9b63742b243418",
"md5": "85c3849ff400be5f292c08db76d3dd35",
"sha256": "0a64a44b0bf22a3aa3f8d97cc63eb758e3d42fb50484e87f6376d2a6f813439e"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "85c3849ff400be5f292c08db76d3dd35",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.8",
"size": 719859,
"upload_time": "2025-10-22T18:27:55",
"upload_time_iso_8601": "2025-10-22T18:27:55.560250Z",
"url": "https://files.pythonhosted.org/packages/b5/58/414b8508d2cab4039a04485248ddc97341f2adc888fead9b63742b243418/kronicler-0.1.2-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "dfa50a97fc3850c1c0a631952d2677b20f21e39161c33b468828ee9c04678f33",
"md5": "9e32b921369034b4735fd36d9866ae04",
"sha256": "49e0dbe5ca04dbb2c70a63c6f5a32b445cb64bef3b95fff8c80cb53bf39108e0"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "9e32b921369034b4735fd36d9866ae04",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 885368,
"upload_time": "2025-10-22T18:27:00",
"upload_time_iso_8601": "2025-10-22T18:27:00.832621Z",
"url": "https://files.pythonhosted.org/packages/df/a5/0a97fc3850c1c0a631952d2677b20f21e39161c33b468828ee9c04678f33/kronicler-0.1.2-cp313-cp313-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "364fce8c2e119825517d3d696bbe48a4ce3e07e13d0a846610ea3a289cfca2e0",
"md5": "ba3eb305a3e6ad490b216c2628d8d6f7",
"sha256": "b9ce7854ccbcec8ec936e65abdb83fcb2c8c7418169485d8f53c9873cf5e3af0"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "ba3eb305a3e6ad490b216c2628d8d6f7",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 820462,
"upload_time": "2025-10-22T18:26:56",
"upload_time_iso_8601": "2025-10-22T18:26:56.443915Z",
"url": "https://files.pythonhosted.org/packages/36/4f/ce8c2e119825517d3d696bbe48a4ce3e07e13d0a846610ea3a289cfca2e0/kronicler-0.1.2-cp313-cp313-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "10466302d850af6fc6a2f629118d5dce608d2e37e9628ff1e53e09e6f04e1d4e",
"md5": "822e81ef1b684296d50ead0ab623f408",
"sha256": "e131ff4af214890f533f8cc4d97b28751f4c187543c0744e3f82e13f80c1bfec"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "822e81ef1b684296d50ead0ab623f408",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 905801,
"upload_time": "2025-10-22T18:25:44",
"upload_time_iso_8601": "2025-10-22T18:25:44.467707Z",
"url": "https://files.pythonhosted.org/packages/10/46/6302d850af6fc6a2f629118d5dce608d2e37e9628ff1e53e09e6f04e1d4e/kronicler-0.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1995d4b86b317cd7a19a78acc5f79f2fef31f8a7336412531df8214b9974ce62",
"md5": "1beb966bbafc5c8782bbcefe019e1930",
"sha256": "ea52379d27e178265c9cc6d9826e994eae2cd169e6752f45fb81319008beaddf"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "1beb966bbafc5c8782bbcefe019e1930",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 885982,
"upload_time": "2025-10-22T18:26:00",
"upload_time_iso_8601": "2025-10-22T18:26:00.437683Z",
"url": "https://files.pythonhosted.org/packages/19/95/d4b86b317cd7a19a78acc5f79f2fef31f8a7336412531df8214b9974ce62/kronicler-0.1.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "597a6be334b128f80c2c256fb56f2b058c3806c1471a45339b4d6400fcaf5ee2",
"md5": "97641e0cabc703c92a0549695bba2728",
"sha256": "bb18ef312b82c18174b5a0bda1dfc6a5a553209a7a2a602d728542b2dda2a057"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "97641e0cabc703c92a0549695bba2728",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 984523,
"upload_time": "2025-10-22T18:26:39",
"upload_time_iso_8601": "2025-10-22T18:26:39.168918Z",
"url": "https://files.pythonhosted.org/packages/59/7a/6be334b128f80c2c256fb56f2b058c3806c1471a45339b4d6400fcaf5ee2/kronicler-0.1.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cfff37437b27c7c59ec27cfce72ab16420f7e0df375da48606b915fedec24541",
"md5": "68c10c5107bee879f0c0720cafc75a6e",
"sha256": "9a7b83d023e0608a9453dd6b0e7f37c3ebc4a13bea210f97fea388ffa8f0e5d9"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "68c10c5107bee879f0c0720cafc75a6e",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1135920,
"upload_time": "2025-10-22T18:26:13",
"upload_time_iso_8601": "2025-10-22T18:26:13.300087Z",
"url": "https://files.pythonhosted.org/packages/cf/ff/37437b27c7c59ec27cfce72ab16420f7e0df375da48606b915fedec24541/kronicler-0.1.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "72c32ef17195df95d0f0f283c67fb35c5f672c699c96e5eed08bd863b0ee8a72",
"md5": "d55b1bea2b02d66f8e1d16f55d516dbc",
"sha256": "4d7b879974928d33caeddcf82b8400b266ee32b869fad32549f04ad3ed772b35"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "d55b1bea2b02d66f8e1d16f55d516dbc",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 956844,
"upload_time": "2025-10-22T18:26:26",
"upload_time_iso_8601": "2025-10-22T18:26:26.571608Z",
"url": "https://files.pythonhosted.org/packages/72/c3/2ef17195df95d0f0f283c67fb35c5f672c699c96e5eed08bd863b0ee8a72/kronicler-0.1.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e22a064188a4721d6dd3d005c1cced7d4832168d27581da39b8a0f5294a89473",
"md5": "79683c0ca5c77708cacbde236cb2174e",
"sha256": "1d97ec8ad56be3939343d5475e80899ca38adcafb421163170feb7e26adda612"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "79683c0ca5c77708cacbde236cb2174e",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 954963,
"upload_time": "2025-10-22T18:26:48",
"upload_time_iso_8601": "2025-10-22T18:26:48.029484Z",
"url": "https://files.pythonhosted.org/packages/e2/2a/064188a4721d6dd3d005c1cced7d4832168d27581da39b8a0f5294a89473/kronicler-0.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e8606d5a75fc2c13143e9a7881ff81d32bc31f162075ba2592d46d2936b5e3ee",
"md5": "4ac6cabe25175d9a46f8bf0d0813beda",
"sha256": "2281962c1e406f676d0a313a4008f59e46413bc612ea4b4124ed8584c21bb9b8"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "4ac6cabe25175d9a46f8bf0d0813beda",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1087571,
"upload_time": "2025-10-22T18:27:05",
"upload_time_iso_8601": "2025-10-22T18:27:05.590045Z",
"url": "https://files.pythonhosted.org/packages/e8/60/6d5a75fc2c13143e9a7881ff81d32bc31f162075ba2592d46d2936b5e3ee/kronicler-0.1.2-cp313-cp313-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "d8a26e8787977baab384e28ec617f95b1563338e28b0fa06698f57bf1ef92f4e",
"md5": "66aa23fb3b6f99cbc919c64986ece35f",
"sha256": "6e01173830171971144e9e90ed7b4f07fc4d5df5d1aac37a6b80bffa287dbd20"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "66aa23fb3b6f99cbc919c64986ece35f",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1150030,
"upload_time": "2025-10-22T18:27:17",
"upload_time_iso_8601": "2025-10-22T18:27:17.927675Z",
"url": "https://files.pythonhosted.org/packages/d8/a2/6e8787977baab384e28ec617f95b1563338e28b0fa06698f57bf1ef92f4e/kronicler-0.1.2-cp313-cp313-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6e38616af0ad1bf4e0cedf8754f256caee06c465274a7b0a61417b9d6eb95d81",
"md5": "9600af915c26aec2f662552183d5dac2",
"sha256": "5895e3d7bdc45086495f05636c2484a6ed83563b06b42f0094776a736009de6a"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "9600af915c26aec2f662552183d5dac2",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1119598,
"upload_time": "2025-10-22T18:27:30",
"upload_time_iso_8601": "2025-10-22T18:27:30.908731Z",
"url": "https://files.pythonhosted.org/packages/6e/38/616af0ad1bf4e0cedf8754f256caee06c465274a7b0a61417b9d6eb95d81/kronicler-0.1.2-cp313-cp313-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "53fc8b38c70ccd4ad60056d2af35446964802f2b02c6b217ba124508898a6fcf",
"md5": "f51a27dd96b27f1549dbb65a8f58c6be",
"sha256": "abed8e0b4d7ec43d7e973c078ad5c421c51b8056bb2e09a89deae87d6640bbbd"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "f51a27dd96b27f1549dbb65a8f58c6be",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1126976,
"upload_time": "2025-10-22T18:27:42",
"upload_time_iso_8601": "2025-10-22T18:27:42.580555Z",
"url": "https://files.pythonhosted.org/packages/53/fc/8b38c70ccd4ad60056d2af35446964802f2b02c6b217ba124508898a6fcf/kronicler-0.1.2-cp313-cp313-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3810af5cebe9f7a8a34a23c52f8ea3a358ac6950332b49b3d466fc9917b2eaaf",
"md5": "a64550c0a742296b4d038f8512767865",
"sha256": "8127852d837f3d9a95f57ba08d62cd00cc7babd331a7d4efb331f2dda17a3e5a"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "a64550c0a742296b4d038f8512767865",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 905234,
"upload_time": "2025-10-22T18:25:45",
"upload_time_iso_8601": "2025-10-22T18:25:45.744038Z",
"url": "https://files.pythonhosted.org/packages/38/10/af5cebe9f7a8a34a23c52f8ea3a358ac6950332b49b3d466fc9917b2eaaf/kronicler-0.1.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "12b494cc9378f961f39340637d4572a2b371488046048c6e7987ff45acad9cba",
"md5": "4bb60def1e8798b6fbb318e8f144071f",
"sha256": "cb15f140c9329a443bd028da6a9e146d2e89e04a0f0046b2378358e908e4dff4"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "4bb60def1e8798b6fbb318e8f144071f",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 885587,
"upload_time": "2025-10-22T18:26:01",
"upload_time_iso_8601": "2025-10-22T18:26:01.787779Z",
"url": "https://files.pythonhosted.org/packages/12/b4/94cc9378f961f39340637d4572a2b371488046048c6e7987ff45acad9cba/kronicler-0.1.2-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b71579273c1de08fcd6976e91633b6a5329a2a3e07a7c7e2cab5528c1c971eca",
"md5": "65e5dde7e0ac2f10d28f56b4855dbd7f",
"sha256": "8ece68e8b3b10464673c566999d7730608804d6d2e7e41374af4b19e5de19d59"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "65e5dde7e0ac2f10d28f56b4855dbd7f",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1134705,
"upload_time": "2025-10-22T18:26:14",
"upload_time_iso_8601": "2025-10-22T18:26:14.692140Z",
"url": "https://files.pythonhosted.org/packages/b7/15/79273c1de08fcd6976e91633b6a5329a2a3e07a7c7e2cab5528c1c971eca/kronicler-0.1.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9742b7a48f57cdaf37a7c55283579bda72a1e70e83412621426b1784c9405b0e",
"md5": "43e7da54ca3f8eb424075b1fc81379f6",
"sha256": "2fa363a8fb46c8aca4a9908aedd652b77b77eb6b68dcc8479226441de06e0050"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "43e7da54ca3f8eb424075b1fc81379f6",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 955783,
"upload_time": "2025-10-22T18:26:28",
"upload_time_iso_8601": "2025-10-22T18:26:28.300096Z",
"url": "https://files.pythonhosted.org/packages/97/42/b7a48f57cdaf37a7c55283579bda72a1e70e83412621426b1784c9405b0e/kronicler-0.1.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9c2215d2951b7f7c0df32adef011b23fb6c080c54100445466cf248c80020bc0",
"md5": "65c5b369309b9a80a9649e9db5281208",
"sha256": "721d0153c10a6df682047db903f89b119ccc8bab7cc4dcbc77583f088fa43b79"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "65c5b369309b9a80a9649e9db5281208",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1087132,
"upload_time": "2025-10-22T18:27:06",
"upload_time_iso_8601": "2025-10-22T18:27:06.691065Z",
"url": "https://files.pythonhosted.org/packages/9c/22/15d2951b7f7c0df32adef011b23fb6c080c54100445466cf248c80020bc0/kronicler-0.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "50870ae0461016d3c7fe7a2683a106d0c3c1b0df30306698dc0ecb67ba3e17b6",
"md5": "ff7f9b07e869e330c62eb79ff3cb5b69",
"sha256": "667948faa3cec5000e02632a781c14dc0e204513e6ee28d5847079ea67c4c7b1"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313t-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "ff7f9b07e869e330c62eb79ff3cb5b69",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1149923,
"upload_time": "2025-10-22T18:27:18",
"upload_time_iso_8601": "2025-10-22T18:27:18.968707Z",
"url": "https://files.pythonhosted.org/packages/50/87/0ae0461016d3c7fe7a2683a106d0c3c1b0df30306698dc0ecb67ba3e17b6/kronicler-0.1.2-cp313-cp313t-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6e4772738cae8ca5db4f7646b87b98659efd41f6d38a7000f7b55cefc8580565",
"md5": "4b0e0c1dc3891d41c768301230c19f8f",
"sha256": "968c5ffa54cb25ead7f8120311a8b7a5e63930da17d5bd4e6a3ceb7770bbec2f"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313t-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "4b0e0c1dc3891d41c768301230c19f8f",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1118978,
"upload_time": "2025-10-22T18:27:32",
"upload_time_iso_8601": "2025-10-22T18:27:32.069086Z",
"url": "https://files.pythonhosted.org/packages/6e/47/72738cae8ca5db4f7646b87b98659efd41f6d38a7000f7b55cefc8580565/kronicler-0.1.2-cp313-cp313t-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ef783d5c857f73a48e20d019c9470138d28800c2f349564486e01ecc47aa1e50",
"md5": "93d4ea9427b3e5ca959272a090b3c27d",
"sha256": "5c10e3baf441e3f16e4a009a0842f87ff66d53d20cccc780b0e3d9766d05c948"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "93d4ea9427b3e5ca959272a090b3c27d",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 1126204,
"upload_time": "2025-10-22T18:27:43",
"upload_time_iso_8601": "2025-10-22T18:27:43.864855Z",
"url": "https://files.pythonhosted.org/packages/ef/78/3d5c857f73a48e20d019c9470138d28800c2f349564486e01ecc47aa1e50/kronicler-0.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "57eff366450510970e714aaabf2bdf6d486988764907b2cfcf79903572205efc",
"md5": "224c8182a7aa5116146a00d06994a441",
"sha256": "78003ab57b9f0f47fce4719d623fb49c9419526e4324cae53b7756431f823476"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "224c8182a7aa5116146a00d06994a441",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.8",
"size": 719834,
"upload_time": "2025-10-22T18:27:56",
"upload_time_iso_8601": "2025-10-22T18:27:56.772121Z",
"url": "https://files.pythonhosted.org/packages/57/ef/f366450510970e714aaabf2bdf6d486988764907b2cfcf79903572205efc/kronicler-0.1.2-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6cb17464a812ebe10fd58a1f198714a7c27dff2674ee471f5e747015b9233a26",
"md5": "87ef1a6b4d27a15f0f12187b89ed84e2",
"sha256": "a53bedff0e6411c225efaa5cf51e9bb3dba7f49512be00cd0a0f421d3a24e8aa"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp314-cp314-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "87ef1a6b4d27a15f0f12187b89ed84e2",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.8",
"size": 821739,
"upload_time": "2025-10-22T18:26:57",
"upload_time_iso_8601": "2025-10-22T18:26:57.558943Z",
"url": "https://files.pythonhosted.org/packages/6c/b1/7464a812ebe10fd58a1f198714a7c27dff2674ee471f5e747015b9233a26/kronicler-0.1.2-cp314-cp314-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "653af39718576721f09ad84fe3e7854669ac2801b39ec92167ebbc61c41d4539",
"md5": "4680bf0c66c04e7a452a52c026e5152d",
"sha256": "8006567e8fcc3ba025f009404bacd0e1b97fe2acadd80258ff925ba2b67d49e2"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "4680bf0c66c04e7a452a52c026e5152d",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.8",
"size": 985710,
"upload_time": "2025-10-22T18:26:40",
"upload_time_iso_8601": "2025-10-22T18:26:40.200971Z",
"url": "https://files.pythonhosted.org/packages/65/3a/f39718576721f09ad84fe3e7854669ac2801b39ec92167ebbc61c41d4539/kronicler-0.1.2-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "09f1ff68b02714bde2490ac83142923e00d16e7890812386d4656599adf02d8b",
"md5": "7109379ff31de1a7006204bcb7553175",
"sha256": "f5cad04ce5d9e961663f4a88c6cfc75fdfd7553d125f4af5012a995047102372"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "7109379ff31de1a7006204bcb7553175",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.8",
"size": 954561,
"upload_time": "2025-10-22T18:26:49",
"upload_time_iso_8601": "2025-10-22T18:26:49.095122Z",
"url": "https://files.pythonhosted.org/packages/09/f1/ff68b02714bde2490ac83142923e00d16e7890812386d4656599adf02d8b/kronicler-0.1.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "76e341b52d325ccafd72d931407279ea4000f8ba172fac85a61b8d3e5d3e7f0c",
"md5": "b952fbb3e8c7ac3e87ab85d60a6ce450",
"sha256": "408a78641ae521e9ac232a8fbbe9498d8648c490b9b25354b0f95f738a5fa1ec"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp314-cp314-win32.whl",
"has_sig": false,
"md5_digest": "b952fbb3e8c7ac3e87ab85d60a6ce450",
"packagetype": "bdist_wheel",
"python_version": "cp314",
"requires_python": ">=3.8",
"size": 652393,
"upload_time": "2025-10-22T18:27:59",
"upload_time_iso_8601": "2025-10-22T18:27:59.412735Z",
"url": "https://files.pythonhosted.org/packages/76/e3/41b52d325ccafd72d931407279ea4000f8ba172fac85a61b8d3e5d3e7f0c/kronicler-0.1.2-cp314-cp314-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1c880eef720ecbccc3626b8d8aaef818132d9ff7e564d4771bde3ea1ba9d617a",
"md5": "fb778ee9d70ecb0448ff76862a427d91",
"sha256": "79d282cc5de468e2594d13be1b9ea26a598370764d592597e04aee0ee2d3331b"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "fb778ee9d70ecb0448ff76862a427d91",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 906264,
"upload_time": "2025-10-22T18:25:47",
"upload_time_iso_8601": "2025-10-22T18:25:47.359586Z",
"url": "https://files.pythonhosted.org/packages/1c/88/0eef720ecbccc3626b8d8aaef818132d9ff7e564d4771bde3ea1ba9d617a/kronicler-0.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "88ce408ec26d04782266292bfa349156a61abc8ff04f7a73345010c0be5db845",
"md5": "e5218e63fcaab7cc184a3c20cdd91b8e",
"sha256": "3786e355ed06ac536d253ddc2745f55e70f19f2ba11d7963bbad2271937f5fcc"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "e5218e63fcaab7cc184a3c20cdd91b8e",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 887842,
"upload_time": "2025-10-22T18:26:02",
"upload_time_iso_8601": "2025-10-22T18:26:02.835146Z",
"url": "https://files.pythonhosted.org/packages/88/ce/408ec26d04782266292bfa349156a61abc8ff04f7a73345010c0be5db845/kronicler-0.1.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0923a96aba6853844d304791d64c0ea9fbb20e5537893c433facfb0aa5727d22",
"md5": "1fcd2cc6ba1bfe75cf65fa5048aa2f34",
"sha256": "591e302184e8bc36e5d4ec6aa9d7f0e765739a9c8440615f02b39088e2aa83e7"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "1fcd2cc6ba1bfe75cf65fa5048aa2f34",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 986559,
"upload_time": "2025-10-22T18:26:41",
"upload_time_iso_8601": "2025-10-22T18:26:41.369784Z",
"url": "https://files.pythonhosted.org/packages/09/23/a96aba6853844d304791d64c0ea9fbb20e5537893c433facfb0aa5727d22/kronicler-0.1.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "396c50b78281b578a971fc2a6a084724670d17591c8387a99ac43779e78730b8",
"md5": "b4df3dbea7eb08de1061c4bffecc16a8",
"sha256": "b758eaefe88fbab2d289dd430f32c7389ebfcdbefbdcdabca4e30e8f5ef4069a"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "b4df3dbea7eb08de1061c4bffecc16a8",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 1136783,
"upload_time": "2025-10-22T18:26:16",
"upload_time_iso_8601": "2025-10-22T18:26:16.054192Z",
"url": "https://files.pythonhosted.org/packages/39/6c/50b78281b578a971fc2a6a084724670d17591c8387a99ac43779e78730b8/kronicler-0.1.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "be37fe73823e04ddd127e690f8f1361fdd41773a50c411f5df0fb318ec678ad8",
"md5": "38689f352d0373ba21b3cf1e5dc82614",
"sha256": "0436e6798704fc7cbca64f17775b198e7b49f53c4eb9767a543ba3d633d6f5b7"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "38689f352d0373ba21b3cf1e5dc82614",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 956561,
"upload_time": "2025-10-22T18:26:29",
"upload_time_iso_8601": "2025-10-22T18:26:29.921915Z",
"url": "https://files.pythonhosted.org/packages/be/37/fe73823e04ddd127e690f8f1361fdd41773a50c411f5df0fb318ec678ad8/kronicler-0.1.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "3bfab5877678b3307e8f91034077ff99b38191ed82dceb8e79eea55cc1ba9693",
"md5": "1b43f752be88d4f3626f9f1c43ac5726",
"sha256": "0e61b3fdba416b60dad708a1071a859eab404c5879078daaa7123c10fbcfbaf4"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "1b43f752be88d4f3626f9f1c43ac5726",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 955254,
"upload_time": "2025-10-22T18:26:50",
"upload_time_iso_8601": "2025-10-22T18:26:50.529626Z",
"url": "https://files.pythonhosted.org/packages/3b/fa/b5877678b3307e8f91034077ff99b38191ed82dceb8e79eea55cc1ba9693/kronicler-0.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c77eef209a3136b8641e1561dd1db4a4704001e552a80fd7e97f14ed3c38a860",
"md5": "535ee45d98f601efc552a30903aae268",
"sha256": "e5c136532c9afb6dc590796488533879472d3564ef688161cd69a19f2920eb6f"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp38-cp38-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "535ee45d98f601efc552a30903aae268",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 1087711,
"upload_time": "2025-10-22T18:27:08",
"upload_time_iso_8601": "2025-10-22T18:27:08.158891Z",
"url": "https://files.pythonhosted.org/packages/c7/7e/ef209a3136b8641e1561dd1db4a4704001e552a80fd7e97f14ed3c38a860/kronicler-0.1.2-cp38-cp38-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ed9c98a726042d102269efc511d50a882e7d4c32675e9574fe33191f5078aad8",
"md5": "00a7d0123e3a4b507ac7da402ef80d46",
"sha256": "f54789259081ca8dc33126729b82a0cd4284da29f461debc4ceac98bcaa037e1"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp38-cp38-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "00a7d0123e3a4b507ac7da402ef80d46",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 1151704,
"upload_time": "2025-10-22T18:27:20",
"upload_time_iso_8601": "2025-10-22T18:27:20.015704Z",
"url": "https://files.pythonhosted.org/packages/ed/9c/98a726042d102269efc511d50a882e7d4c32675e9574fe33191f5078aad8/kronicler-0.1.2-cp38-cp38-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "35a51a775735838653df9482fc22826e52f3dd0fa4c86d47daf8928a95ab23c0",
"md5": "2c680f631ef46884e034e6c5bf292c08",
"sha256": "5154d0e693b15c8b5a6e447a95c5692afffae03e3deb923cb602ad06b1e2496f"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp38-cp38-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "2c680f631ef46884e034e6c5bf292c08",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 1122784,
"upload_time": "2025-10-22T18:27:33",
"upload_time_iso_8601": "2025-10-22T18:27:33.660447Z",
"url": "https://files.pythonhosted.org/packages/35/a5/1a775735838653df9482fc22826e52f3dd0fa4c86d47daf8928a95ab23c0/kronicler-0.1.2-cp38-cp38-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f2b9ff31b734d136b161baad6309d0862893f24406bf770167c93699c3a0f0fd",
"md5": "9c55895252adec9f865005632ec06744",
"sha256": "a58329ffa49ba9c9422cc4223e59e4edf672de5bdcaeba767fd19bfafc4f7a31"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp38-cp38-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "9c55895252adec9f865005632ec06744",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.8",
"size": 1127744,
"upload_time": "2025-10-22T18:27:45",
"upload_time_iso_8601": "2025-10-22T18:27:45.262444Z",
"url": "https://files.pythonhosted.org/packages/f2/b9/ff31b734d136b161baad6309d0862893f24406bf770167c93699c3a0f0fd/kronicler-0.1.2-cp38-cp38-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b0e88dc662656e49ffedc184aea800b2e28127acb040b9c56d1ed2e2e1352c73",
"md5": "54d48a30163447953da7c84fe5b1393a",
"sha256": "817d96a566ef2c5203dc6dde945d7028f03906ac51ee0dd4f782e30f93c33fcf"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "54d48a30163447953da7c84fe5b1393a",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 906224,
"upload_time": "2025-10-22T18:25:48",
"upload_time_iso_8601": "2025-10-22T18:25:48.657308Z",
"url": "https://files.pythonhosted.org/packages/b0/e8/8dc662656e49ffedc184aea800b2e28127acb040b9c56d1ed2e2e1352c73/kronicler-0.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6cbf2a48ead6d5f10cee152554a20c2b10bbccd77bc75971852a73ea0f932719",
"md5": "ec5e77e44ab655857732f05a62bc8dbc",
"sha256": "2cf31c4da37cab71693824c26cb56dee4d984d928064b92d72a666db35f4d275"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "ec5e77e44ab655857732f05a62bc8dbc",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 887864,
"upload_time": "2025-10-22T18:26:03",
"upload_time_iso_8601": "2025-10-22T18:26:03.961210Z",
"url": "https://files.pythonhosted.org/packages/6c/bf/2a48ead6d5f10cee152554a20c2b10bbccd77bc75971852a73ea0f932719/kronicler-0.1.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2f2966fa7bd27b72068d3375ffea7d0c3ab2a16d54193a62a8f991efb9892702",
"md5": "48bc17e38f530d190cca08e8182f3555",
"sha256": "8081fd5a238673868e0fab9ac2eb5d308fdc48b9131ee3786976180c6b1a7135"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "48bc17e38f530d190cca08e8182f3555",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 986859,
"upload_time": "2025-10-22T18:26:42",
"upload_time_iso_8601": "2025-10-22T18:26:42.404845Z",
"url": "https://files.pythonhosted.org/packages/2f/29/66fa7bd27b72068d3375ffea7d0c3ab2a16d54193a62a8f991efb9892702/kronicler-0.1.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "97dccf14e249c1c74b174c9630529a66985b7ec535b10a484f962bc46a4e7b9a",
"md5": "878d9dcf02c67b92eb15d3dfb3e6dad8",
"sha256": "d677144c8a5c21efd4a202a634096a2407564edca5863b95312881ded38d0631"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "878d9dcf02c67b92eb15d3dfb3e6dad8",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 1136717,
"upload_time": "2025-10-22T18:26:17",
"upload_time_iso_8601": "2025-10-22T18:26:17.097859Z",
"url": "https://files.pythonhosted.org/packages/97/dc/cf14e249c1c74b174c9630529a66985b7ec535b10a484f962bc46a4e7b9a/kronicler-0.1.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f627a8cc90db2533d6e086466cf7ae0d3df4806630fb1c2ebdf9e61772eb7162",
"md5": "7081ae3e6599e850f6cbb37bf1ed88b1",
"sha256": "c7d6a9569ec203cc38e3edd553c225272c3aba2c19e45de722ced0a7a93c5693"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "7081ae3e6599e850f6cbb37bf1ed88b1",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 957249,
"upload_time": "2025-10-22T18:26:31",
"upload_time_iso_8601": "2025-10-22T18:26:31.416913Z",
"url": "https://files.pythonhosted.org/packages/f6/27/a8cc90db2533d6e086466cf7ae0d3df4806630fb1c2ebdf9e61772eb7162/kronicler-0.1.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "49015ad7ebab058fe5ba0e54c22cee8df6108f17b9eed64b52507e58656d0482",
"md5": "0c88658484c9b93cc508662338d52f0f",
"sha256": "e266ca9cb53ac9c62e6e5e0fc21e740d32cf1a271b3074398aef141a726accee"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "0c88658484c9b93cc508662338d52f0f",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 955018,
"upload_time": "2025-10-22T18:26:51",
"upload_time_iso_8601": "2025-10-22T18:26:51.769240Z",
"url": "https://files.pythonhosted.org/packages/49/01/5ad7ebab058fe5ba0e54c22cee8df6108f17b9eed64b52507e58656d0482/kronicler-0.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2fe2b6743e9ddfd7c91a80f7e6b3cdfd2a01c5bbfc8dae6a952d0d881a7cb338",
"md5": "1c66d47c0fb1d88d92be595de4d98444",
"sha256": "d4e07688f49d16bb1331b2cda758fba76209c104db065fa1d9a9a11dadfd2232"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "1c66d47c0fb1d88d92be595de4d98444",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 1087876,
"upload_time": "2025-10-22T18:27:09",
"upload_time_iso_8601": "2025-10-22T18:27:09.201597Z",
"url": "https://files.pythonhosted.org/packages/2f/e2/b6743e9ddfd7c91a80f7e6b3cdfd2a01c5bbfc8dae6a952d0d881a7cb338/kronicler-0.1.2-cp39-cp39-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "daa07cbc91a0fc31ef44d3157ae35e32ebae25297da17a39b1326a828138e186",
"md5": "7631106440d1aaef329cca7ee5fe2282",
"sha256": "dbd0ee04a6653cc404cee287348ffd3f1280fca0a3465a3fd0b6e74208dd384d"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "7631106440d1aaef329cca7ee5fe2282",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 1152016,
"upload_time": "2025-10-22T18:27:21",
"upload_time_iso_8601": "2025-10-22T18:27:21.332405Z",
"url": "https://files.pythonhosted.org/packages/da/a0/7cbc91a0fc31ef44d3157ae35e32ebae25297da17a39b1326a828138e186/kronicler-0.1.2-cp39-cp39-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0548d3a6b1d8bad09ab5640d0a53e7293297c689eb36ed64f695d3fd68bdca72",
"md5": "3da797efa98e4bdb210187474a2711cb",
"sha256": "3889e9a885e6e45bf24bf4668aa0b85ca632639d8b395ab1e54be8a43711052b"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "3da797efa98e4bdb210187474a2711cb",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 1123029,
"upload_time": "2025-10-22T18:27:34",
"upload_time_iso_8601": "2025-10-22T18:27:34.707451Z",
"url": "https://files.pythonhosted.org/packages/05/48/d3a6b1d8bad09ab5640d0a53e7293297c689eb36ed64f695d3fd68bdca72/kronicler-0.1.2-cp39-cp39-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "6cb023767be5658560b7a9d163a5c6226db18b7a6ce189e28266f8a710f9e514",
"md5": "8cdb780ed73ce808902e961ab7dbe268",
"sha256": "ff547ca66e9483804ad7f89ac22adaf3d935d2984009949580b922cd91a624f1"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "8cdb780ed73ce808902e961ab7dbe268",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 1127431,
"upload_time": "2025-10-22T18:27:46",
"upload_time_iso_8601": "2025-10-22T18:27:46.856210Z",
"url": "https://files.pythonhosted.org/packages/6c/b0/23767be5658560b7a9d163a5c6226db18b7a6ce189e28266f8a710f9e514/kronicler-0.1.2-cp39-cp39-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b39f7969d90fe5bbf4040a13ab9a5e6c89b1bb6fb5bb6c62c99d7ad6d17d030c",
"md5": "7c7d9b983774d7ffa43e762e66d0ea0d",
"sha256": "9a49b90cf2f5007f825fb16721fc9b1650b8ceb46d9a70346bb511bf5afd9ef3"
},
"downloads": -1,
"filename": "kronicler-0.1.2-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "7c7d9b983774d7ffa43e762e66d0ea0d",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.8",
"size": 719737,
"upload_time": "2025-10-22T18:27:58",
"upload_time_iso_8601": "2025-10-22T18:27:58.235910Z",
"url": "https://files.pythonhosted.org/packages/b3/9f/7969d90fe5bbf4040a13ab9a5e6c89b1bb6fb5bb6c62c99d7ad6d17d030c/kronicler-0.1.2-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "942eef8d7b0f248f1bb1679052fbafac49a2c2089b91c51328ca046292b9b906",
"md5": "b8d474369767fff32fe0ded9200cba54",
"sha256": "39497524eb0e87b90dacf5c4cc0fb9544ef5e6614988ba878a016592eca25a83"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "b8d474369767fff32fe0ded9200cba54",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 907254,
"upload_time": "2025-10-22T18:25:50",
"upload_time_iso_8601": "2025-10-22T18:25:50.428551Z",
"url": "https://files.pythonhosted.org/packages/94/2e/ef8d7b0f248f1bb1679052fbafac49a2c2089b91c51328ca046292b9b906/kronicler-0.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "7d377ca7fed666c428df13673cff3b0649ce29073ba8469150938196df59d8bc",
"md5": "70baa401dfa6248ac6a340c437375180",
"sha256": "bb6b46808a2afd520ec5ef70121c63600e2e1b93b7eb4e166c8c13f050cc7bb2"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "70baa401dfa6248ac6a340c437375180",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 889516,
"upload_time": "2025-10-22T18:26:05",
"upload_time_iso_8601": "2025-10-22T18:26:05.037694Z",
"url": "https://files.pythonhosted.org/packages/7d/37/7ca7fed666c428df13673cff3b0649ce29073ba8469150938196df59d8bc/kronicler-0.1.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "353a4656677c74606ecdebb38312c2d7b131372c9c451e47029368d9fedb4ece",
"md5": "17cc54f58b4d5d61ee1ed52307a5becd",
"sha256": "f53b5c272be2cb8f2faee9b8f853ae9232c826f4c6508d95e8b0771d213f1e9d"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "17cc54f58b4d5d61ee1ed52307a5becd",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 1136656,
"upload_time": "2025-10-22T18:26:18",
"upload_time_iso_8601": "2025-10-22T18:26:18.205737Z",
"url": "https://files.pythonhosted.org/packages/35/3a/4656677c74606ecdebb38312c2d7b131372c9c451e47029368d9fedb4ece/kronicler-0.1.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1422be4fc22cb97e4a2ef5dedc4278736f154adab333244b10c5017f76d31baa",
"md5": "ce492586a81fc190fa46a4021030f3a5",
"sha256": "4d36e351c1530803cf3d5ec95c52a3b09b6caafc0e4303fffb1b2f4c9867b170"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "ce492586a81fc190fa46a4021030f3a5",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 957625,
"upload_time": "2025-10-22T18:26:32",
"upload_time_iso_8601": "2025-10-22T18:26:32.528470Z",
"url": "https://files.pythonhosted.org/packages/14/22/be4fc22cb97e4a2ef5dedc4278736f154adab333244b10c5017f76d31baa/kronicler-0.1.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b9faa629d0b2e0b4b3068fc76a4f2ad2a3cc64e478a561871a77f2d015588778",
"md5": "b4580fe4c81e633a442db8529dabcd50",
"sha256": "fbc2ad5b15c9f557140f4d8bbdabc47cda3bd2f9efe29dce2950a62e8d2d0e28"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "b4580fe4c81e633a442db8529dabcd50",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 1089255,
"upload_time": "2025-10-22T18:27:10",
"upload_time_iso_8601": "2025-10-22T18:27:10.354676Z",
"url": "https://files.pythonhosted.org/packages/b9/fa/a629d0b2e0b4b3068fc76a4f2ad2a3cc64e478a561871a77f2d015588778/kronicler-0.1.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "01e7d4ec8d53bd962afd8a996ef6b9b430ba964de0e262fd4374508e9c43aafc",
"md5": "b4b374650b2d7ebf9ae6158b04686592",
"sha256": "b0655eec5ce847a79109599c2e38943c333ff5e59e4c488d38a1386ca0eaecd3"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "b4b374650b2d7ebf9ae6158b04686592",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 1152413,
"upload_time": "2025-10-22T18:27:22",
"upload_time_iso_8601": "2025-10-22T18:27:22.487247Z",
"url": "https://files.pythonhosted.org/packages/01/e7/d4ec8d53bd962afd8a996ef6b9b430ba964de0e262fd4374508e9c43aafc/kronicler-0.1.2-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "400516f4ebfde67bd0ab4d46dca739c66ca9171447fede0ab3e340d42a2fd5c9",
"md5": "f2e8a4a60da2c832fef94ac4eb5c83df",
"sha256": "83edeaf0674c6d4c7e58032256563d7db31d3815023a05bccd757ac8f4be816d"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "f2e8a4a60da2c832fef94ac4eb5c83df",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 1122915,
"upload_time": "2025-10-22T18:27:35",
"upload_time_iso_8601": "2025-10-22T18:27:35.906288Z",
"url": "https://files.pythonhosted.org/packages/40/05/16f4ebfde67bd0ab4d46dca739c66ca9171447fede0ab3e340d42a2fd5c9/kronicler-0.1.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ebc8615a7945dc3ea357a07b82bb3b3558b2a2a45ffcf8749aa0a51d4f5f8391",
"md5": "e36e7d2b1b2aba6b945b110b43fecafc",
"sha256": "98da7a3d5978187c3ff70fd56706f2b62037aebe8aaa95bee175fa2d49a9b3f5"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "e36e7d2b1b2aba6b945b110b43fecafc",
"packagetype": "bdist_wheel",
"python_version": "pp310",
"requires_python": ">=3.8",
"size": 1128857,
"upload_time": "2025-10-22T18:27:48",
"upload_time_iso_8601": "2025-10-22T18:27:48.029567Z",
"url": "https://files.pythonhosted.org/packages/eb/c8/615a7945dc3ea357a07b82bb3b3558b2a2a45ffcf8749aa0a51d4f5f8391/kronicler-0.1.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "317fd673f60b95f44d99c149c879305fef215d3f3ad8f2d4c6d9217ab9c78970",
"md5": "706ffc1d4cb53da6e015892db5345ba8",
"sha256": "fe46f8637c0273932a1efeeb4c85ad8c5528ab5e9cd1d69e3c407ce4609f6237"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "706ffc1d4cb53da6e015892db5345ba8",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.8",
"size": 907260,
"upload_time": "2025-10-22T18:25:54",
"upload_time_iso_8601": "2025-10-22T18:25:54.089106Z",
"url": "https://files.pythonhosted.org/packages/31/7f/d673f60b95f44d99c149c879305fef215d3f3ad8f2d4c6d9217ab9c78970/kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "befc4843d7af1243ea3e6bd4631c2c3b11df24a5b1ea4e0f91efdb7ad3d60f23",
"md5": "e2de7bb4c6c32955c5863169e899f3ed",
"sha256": "3abc5f77ac0ab53f331829366e7d395f548c5e4fa8521b3707423087c9c5bbca"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "e2de7bb4c6c32955c5863169e899f3ed",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.8",
"size": 889709,
"upload_time": "2025-10-22T18:26:06",
"upload_time_iso_8601": "2025-10-22T18:26:06.656993Z",
"url": "https://files.pythonhosted.org/packages/be/fc/4843d7af1243ea3e6bd4631c2c3b11df24a5b1ea4e0f91efdb7ad3d60f23/kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "0517592f1914446063c165efeb93f4d0fedbcb31271e0dd66ad932312133e606",
"md5": "4d6829cf38ed95a8c381aa6b2143c05a",
"sha256": "1cb69dcb34b596140a7765450357c6e4b533083891049827b6aa8eb9d4c6eaf7"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl",
"has_sig": false,
"md5_digest": "4d6829cf38ed95a8c381aa6b2143c05a",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.8",
"size": 988374,
"upload_time": "2025-10-22T18:26:43",
"upload_time_iso_8601": "2025-10-22T18:26:43.599970Z",
"url": "https://files.pythonhosted.org/packages/05/17/592f1914446063c165efeb93f4d0fedbcb31271e0dd66ad932312133e606/kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "831dc496fe7d846429c1ccebd2c455bad98f8f4e0bdaa88a08759c7daabf9794",
"md5": "0653c1778ba8a79075f740343b680d80",
"sha256": "f434070b4ff3de8ec1c7fa3e8aa7417d6ba56a902da98d3f2bca7b28b099ea48"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "0653c1778ba8a79075f740343b680d80",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.8",
"size": 1136384,
"upload_time": "2025-10-22T18:26:19",
"upload_time_iso_8601": "2025-10-22T18:26:19.513491Z",
"url": "https://files.pythonhosted.org/packages/83/1d/c496fe7d846429c1ccebd2c455bad98f8f4e0bdaa88a08759c7daabf9794/kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "24a7ae8900bf09a7f6a140b50f21ada20a004e887d2a23428cb675224c97bd23",
"md5": "07437c58dcd5ca8240bc29599992c624",
"sha256": "1f305c06943d190fdba03379ce6c19e93592f695011bd97ae05a9487d4dc30b9"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "07437c58dcd5ca8240bc29599992c624",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.8",
"size": 957462,
"upload_time": "2025-10-22T18:26:33",
"upload_time_iso_8601": "2025-10-22T18:26:33.550353Z",
"url": "https://files.pythonhosted.org/packages/24/a7/ae8900bf09a7f6a140b50f21ada20a004e887d2a23428cb675224c97bd23/kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b8c2ed5523c5f4c50f1ed9c2cd9e3904e2d6ee536846233cecba812bca23a410",
"md5": "0092774efb0754228c8e70cc811070df",
"sha256": "7428c9fc006b88202f7125170157c16aa93659d9149227b29c008037707195db"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "0092774efb0754228c8e70cc811070df",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.8",
"size": 955880,
"upload_time": "2025-10-22T18:26:52",
"upload_time_iso_8601": "2025-10-22T18:26:52.796551Z",
"url": "https://files.pythonhosted.org/packages/b8/c2/ed5523c5f4c50f1ed9c2cd9e3904e2d6ee536846233cecba812bca23a410/kronicler-0.1.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "74da574776c527349d1891c603bd3215d7e5b7c846842be568caa28d698c941c",
"md5": "47a871d8d209f94ae0c147431d510fac",
"sha256": "9747a3844e9491389b6b5e0688c3cce4599ddbe9b3457ec63d39ea47b79ab60a"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "47a871d8d209f94ae0c147431d510fac",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.8",
"size": 1089306,
"upload_time": "2025-10-22T18:27:11",
"upload_time_iso_8601": "2025-10-22T18:27:11.619141Z",
"url": "https://files.pythonhosted.org/packages/74/da/574776c527349d1891c603bd3215d7e5b7c846842be568caa28d698c941c/kronicler-0.1.2-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "624c632f44e52b4a5c9bd19571a7e7b41b276acb79235e1e1fcf09f2ddf75dbf",
"md5": "403c0e6888d1900f17947de8604fbe92",
"sha256": "37628029306de7a52a72c11fa0d9cdebff0e57e18b785955ccaf1fefb639eb7e"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "403c0e6888d1900f17947de8604fbe92",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.8",
"size": 1152727,
"upload_time": "2025-10-22T18:27:23",
"upload_time_iso_8601": "2025-10-22T18:27:23.816002Z",
"url": "https://files.pythonhosted.org/packages/62/4c/632f44e52b4a5c9bd19571a7e7b41b276acb79235e1e1fcf09f2ddf75dbf/kronicler-0.1.2-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4ba8ef9ef6281e7c3bfc5713851593f9cb34004cfc79009891c855c33a3ffa2d",
"md5": "a8304e523108a87c3f521e02b07fb03d",
"sha256": "8cf08831e40d55447eff5997520aea89a419d57e6dd23d06abefbbeb156a2587"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp311-pypy311_pp73-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "a8304e523108a87c3f521e02b07fb03d",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.8",
"size": 1123294,
"upload_time": "2025-10-22T18:27:36",
"upload_time_iso_8601": "2025-10-22T18:27:36.968326Z",
"url": "https://files.pythonhosted.org/packages/4b/a8/ef9ef6281e7c3bfc5713851593f9cb34004cfc79009891c855c33a3ffa2d/kronicler-0.1.2-pp311-pypy311_pp73-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e9acbf7eab44f377a169e755233c9a3b86ed8242e417f7fbcd27e6722e8e4fed",
"md5": "22390179000d679b5a7d5de7296e2ef6",
"sha256": "fc47ba28b83f2ab3f400d307ee1d23059f94e93c179694a9a0e94d11cb658681"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "22390179000d679b5a7d5de7296e2ef6",
"packagetype": "bdist_wheel",
"python_version": "pp311",
"requires_python": ">=3.8",
"size": 1128713,
"upload_time": "2025-10-22T18:27:49",
"upload_time_iso_8601": "2025-10-22T18:27:49.400078Z",
"url": "https://files.pythonhosted.org/packages/e9/ac/bf7eab44f377a169e755233c9a3b86ed8242e417f7fbcd27e6722e8e4fed/kronicler-0.1.2-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c546146666054d76601d3bd5cfc10364201b28909c122d77da1b179f81ca122d",
"md5": "5d9572ca84d2d330c2448bdb4a79c8e6",
"sha256": "50d25978cbe12c977068177100302b2e1da4dd1718bf32cc2d6e9a0efd58adb7"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "5d9572ca84d2d330c2448bdb4a79c8e6",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 907172,
"upload_time": "2025-10-22T18:25:55",
"upload_time_iso_8601": "2025-10-22T18:25:55.621442Z",
"url": "https://files.pythonhosted.org/packages/c5/46/146666054d76601d3bd5cfc10364201b28909c122d77da1b179f81ca122d/kronicler-0.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cb1980e80fdcd430c619422fbf994fe97a9c7e6a0150a9eb700f0ded1be83ec5",
"md5": "e7ac8120b8bbe9ae2fba89f744375c99",
"sha256": "e70abce21213d26178e9e7c5556729a904b34dd86f8f5981a4185eb6c4cb77b9"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "e7ac8120b8bbe9ae2fba89f744375c99",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 889317,
"upload_time": "2025-10-22T18:26:08",
"upload_time_iso_8601": "2025-10-22T18:26:08.270976Z",
"url": "https://files.pythonhosted.org/packages/cb/19/80e80fdcd430c619422fbf994fe97a9c7e6a0150a9eb700f0ded1be83ec5/kronicler-0.1.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b65f0b6df9fba36c3026f0ae51dd2b207b6c272a8cd0867ae4cfdb0850c77329",
"md5": "7ac72aeaed11e8f928de6cb84546be70",
"sha256": "a6309b4c8efcdfa1161f40c2540743a6c5251e04cb63f9f88603cb289256e2c6"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "7ac72aeaed11e8f928de6cb84546be70",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 1136846,
"upload_time": "2025-10-22T18:26:20",
"upload_time_iso_8601": "2025-10-22T18:26:20.601261Z",
"url": "https://files.pythonhosted.org/packages/b6/5f/0b6df9fba36c3026f0ae51dd2b207b6c272a8cd0867ae4cfdb0850c77329/kronicler-0.1.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2cacf2c4c9019aad57a7c7babfea9a3a1290ba53c8349ba5f47c196e7769e466",
"md5": "de221ec3b1b1f5d83960ca0164edf556",
"sha256": "6a11cc27a22d98335bb9ffed2755800e984ea89801dfb2117876f6ca39e76583"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "de221ec3b1b1f5d83960ca0164edf556",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 957280,
"upload_time": "2025-10-22T18:26:34",
"upload_time_iso_8601": "2025-10-22T18:26:34.545546Z",
"url": "https://files.pythonhosted.org/packages/2c/ac/f2c4c9019aad57a7c7babfea9a3a1290ba53c8349ba5f47c196e7769e466/kronicler-0.1.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "1423231aaddec4c7274b9e6cea10219a416cf46d4de6b1828a40c7e8f88a1cc5",
"md5": "695cd20f2c3105768dce3aee709b277c",
"sha256": "f6b02c451e98172c4017881784777ecc26f855aed26ab5dc52df0dd2c193b6f8"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl",
"has_sig": false,
"md5_digest": "695cd20f2c3105768dce3aee709b277c",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 1089146,
"upload_time": "2025-10-22T18:27:12",
"upload_time_iso_8601": "2025-10-22T18:27:12.666539Z",
"url": "https://files.pythonhosted.org/packages/14/23/231aaddec4c7274b9e6cea10219a416cf46d4de6b1828a40c7e8f88a1cc5/kronicler-0.1.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b01b70762617eeeb3959f306fa01f3173a5101223dd52f9784feed95161d97c0",
"md5": "a9028e11a8cfe57f1efdbb24d0466185",
"sha256": "e132e3c1548d7a1079b61012891e20f0b5b3f9670898cde0bcbca92bcaaff85a"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl",
"has_sig": false,
"md5_digest": "a9028e11a8cfe57f1efdbb24d0466185",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 1152424,
"upload_time": "2025-10-22T18:27:25",
"upload_time_iso_8601": "2025-10-22T18:27:25.636548Z",
"url": "https://files.pythonhosted.org/packages/b0/1b/70762617eeeb3959f306fa01f3173a5101223dd52f9784feed95161d97c0/kronicler-0.1.2-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cfc272c788c17aac8fdc651aa31a2a7f196f102d7e9440881a95e2e285cd9593",
"md5": "11c34a1eadb1a0544ee6ba7d7c73e4f7",
"sha256": "fa6a2a13456bfbe96923029a4c72aa6b8057437edcb1355a3ae759f35642fa9f"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl",
"has_sig": false,
"md5_digest": "11c34a1eadb1a0544ee6ba7d7c73e4f7",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 1123248,
"upload_time": "2025-10-22T18:27:38",
"upload_time_iso_8601": "2025-10-22T18:27:38.031789Z",
"url": "https://files.pythonhosted.org/packages/cf/c2/72c788c17aac8fdc651aa31a2a7f196f102d7e9440881a95e2e285cd9593/kronicler-0.1.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "551844617138555960944d36af871cfcf9e4b7699e9e7b03083d232589d90fac",
"md5": "6165995b626f13b9b7a181f0dfa16586",
"sha256": "8a4c0f9b05026b012136ec50093850edc75a5a3d74ee4695870ac95a43d7cc3a"
},
"downloads": -1,
"filename": "kronicler-0.1.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl",
"has_sig": false,
"md5_digest": "6165995b626f13b9b7a181f0dfa16586",
"packagetype": "bdist_wheel",
"python_version": "pp39",
"requires_python": ">=3.8",
"size": 1128463,
"upload_time": "2025-10-22T18:27:50",
"upload_time_iso_8601": "2025-10-22T18:27:50.602747Z",
"url": "https://files.pythonhosted.org/packages/55/18/44617138555960944d36af871cfcf9e4b7699e9e7b03083d232589d90fac/kronicler-0.1.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "699a737c8a9b30162376893ec58eb159937bbfde2a932bf6d34acfa8dcaf992b",
"md5": "7a4d5b8594449940c012f55ab4fd3604",
"sha256": "294e0e4b16b2f4b798219bdd457fdbc854a06a78c6473255539ee1d88ee7d2c4"
},
"downloads": -1,
"filename": "kronicler-0.1.2.tar.gz",
"has_sig": false,
"md5_digest": "7a4d5b8594449940c012f55ab4fd3604",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 41617,
"upload_time": "2025-10-22T18:27:51",
"upload_time_iso_8601": "2025-10-22T18:27:51.824430Z",
"url": "https://files.pythonhosted.org/packages/69/9a/737c8a9b30162376893ec58eb159937bbfde2a932bf6d34acfa8dcaf992b/kronicler-0.1.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-22 18:27:51",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "JakeRoggenbuck",
"github_project": "kronicler",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "kronicler"
}