Fractal manipulation with LLMs
Project description
tranZoom
Fractal manipulation with LLMs
- Primary use case: Render ultra-deep Mandelbrot fractal images with arbitrary precision, and (planned) use AI/LLMs to guide fractal zoom sequences
- Works with: Local filesystem (PNG output), complex-plane coordinates, AI models (future)
- Status: Early / experimental — core fractal engine is functional; AI guidance is planned
- License: Apache-2.0
tranZoom is a Python CLI tool for rendering the Mandelbrot set at virtually unlimited zoom depth using arbitrary-precision arithmetic (gmpy2). The goal is to be able to zoom so deep that standard double-precision floating point becomes meaningless — tranZoom automatically computes the required precision and renders faithfully at any scale. The long-term vision is to integrate with LLMs (via the transai library) to intelligently select and navigate interesting regions of the fractal automatically.
Since version 1.0.0 it is a PyPI package: https://pypi.org/project/tranzoom/
Built with:
- Python 3.12+ with Poetry for dependency management
- gmpy2 for arbitrary-precision (
mpq/mpfr) complex-plane arithmetic - Pillow for PNG image output
- tqdm for progress bars during rendering
- transai as the foundation for future AI/LLM integration
- Typer + Rich for the CLI and terminal output
- Transcrypto for CLI boilerplate, logging, hashing, and config management
- Ruff, MyPy, Pyright, typeguard, pre-commit, GitHub Actions for quality and CI
Table of contents
- tranZoom
- Table of contents
- License
- Installation
- Context / Problem Space
- CLI Interface
- Project Design
- Development Instructions
- Security
- Troubleshooting
License
Copyright 2026 Daniel Balparda balparda@github.com & Bella Keri BellaKeri@github.com
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License here.
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
Third-party notices
This project includes or depends on third-party software (see requirements.txt and pyproject.toml). Key dependencies include:
- gmpy2 — Apache-2.0 compatible
- Pillow — HPND license
- tqdm — MPL-2.0 / MIT
- transai — Apache-2.0
- transcrypto — Apache-2.0
Contributions and inbound licensing
Contributions are accepted under the Apache-2.0 license (same as project).
Installation
To install from PyPI:
pip3 install tranzoom
Or install from the repository for development (see Development Setup).
Supported platforms
- OS: Linux, macOS
- Architectures: x86_64, arm64
- Python: 3.12, 3.13, 3.14
Known dependencies (Prerequisites)
- python 3.12+ — documentation
- gmpy2 2.3+ — Arbitrary-precision arithmetic using GMP/MPFR/MPC — documentation
- Pillow 12+ — PNG image generation — documentation
- tqdm 4.67+ — Progress bars — documentation
- rich 14.2+ — Terminal formatting — documentation
- typer 0.21+ — CLI parser — documentation
- transai 1.2+ — AI integration foundation — documentation
- transcrypto 2.1+ — CLI utilities, logging, hashing, config — documentation
Context / Problem Space
What this tool is
tranZoom is a command-line fractal renderer focused on extreme zoom depth. Standard double-precision (float64) floating point has only about 15–16 significant decimal digits, so any zoom below roughly 1e-14 of the full Mandelbrot set will produce incorrect images due to precision loss. tranZoom uses gmpy2.mpq (exact rational arithmetic) to represent frame coordinates and gmpy2.mpfr (arbitrary-precision floating point) for the escape-time computations, automatically determining how many bits of precision are needed for any given zoom level.
The long-term vision is to use LLMs to autonomously guide the zoom — identifying interesting regions, proposing successive frames, and building navigated zoom sequences without manual coordinate discovery.
What this tool is not
- Not a real-time / interactive fractal explorer (rendering is intentionally CPU-intensive for correctness at depth)
- Not limited to a fixed precision (unlike most other fractal tools, which cap at
float64) - Not yet AI-guided (that is the planned future direction)
Key concepts and terminology
- Frame: A rectangular region of the complex plane, defined by two corners or a center + width. Stored as
gmpy2.mpq(exact rationals) to avoid any accumulation of rounding error in coordinates. - Precision: The number of bits of
mpfrfloating-point precision used for escape-time iteration. Computed automatically from the frame size; never needs to be set manually. - Magnification: Ratio of the default full-set frame area to the current frame area. 1× = full set; 1G× = zoomed in one billion times.
- Escape-time iteration: The core Mandelbrot test; larger
max_iterproduces more detail at high zoom. - Interior tests: Fast algebraic checks (main cardioid, period-2 bulb) that skip the iterative test for points known to be inside the set, speeding up rendering significantly.
- Color palette: Four built-in palettes color the exterior (escaped) pixels. The active palette is chosen with
--palette. Positions in the palette are determined by histogram equalization of escape-iteration counts, cycling through the stops3times across the range, so the full color range is used regardless of zoom depth or iteration scale. Interior points (never escaped) are always rendered as pure black. Available palettes:blue-to-yellow-to-brown(classic 16-stop gradient, default),lava(16-stop volcanic gradient),electric-ocean(32-stop abyss-to-magenta-to-lavender gradient),sunset(32-stop indigo-to-amber-to-wine gradient).
Inputs and outputs
Inputs
- stdin: not used
- CLI arguments: center coordinates (real + imaginary parts as strings, for exact
mpqconversion), frame width/height, output image dimensions - Config file: stored in the OS-native location via
transcrypto.utils.config
Outputs
- stdout: progress info and saved filename
- stderr: warnings/errors/logs (controlled by
--verbose) - Output images are saved as
<prefix>[-<YYYYMMDDhhmmss>][-<SHA256-20>].png; the prefix defaults tomandeland is set via--prefix; date inclusion is controlled by--date/--no-date; hash (first 20 chars of SHA256, 80 bits) inclusion is controlled by--hash/--no-hash; output directory is set via-o/--out(defaults to the current working directory)
CLI Interface
Quick start
Render the full Mandelbrot set (default, 1024×1024):
$ poetry run mandel gen
1024x1024 Mandelbrot in frame [(-3/4, 0) @ 5/2], precision 80 bits, 1 magnification, AUTO iterations...
Pre: 100%|█████████████████████████████████████████████| 256/256 [00:00<00:00, 1011.19px/s]
Img: 100%|█████████████████████████████████████████████| 1048576/1048576 [00:13<00:00, 78912.96px/s]
Generated image 'bd77ee8874aa425422a9ea92867c53937f28534898d49a56b9e4d1dca7b5dd54' in 14.120 s, escape range (1, 1000)
Saved to "mandel-bd77ee8874aa425422a9.png"
As can be seen, the Frame is stored as rational numbers with arbitrary precision, [(-3/4, 0) @ 5/2], so it is guaranteed to be exact (centered in $-0.75+0j$ and with width of $2.5$). It will pick a precision, in bits, which is the internal float representation (mantissa), and will pick the (max) number of iterations for the generation. The magnification here is 1 because it is the full Mandelbrot set. There will be a progress bar, counting the horizontal lines being produced. The generated image data will be hashed and then saved to a PNG on disk.
Render a well-known zoom ("Seahorse", ~155× magnification):
poetry run mandel gen " -0.74303" "0.126433" "0.01611"
See many more examples in Comprehensive example images and zooms.
Palettes
With the --palette flag you can pick your color scheme. We provide the following out of the box:
| Flag Value | Example |
|---|---|
blue-to-yellow-to-brown" (DEFAULT) |
|
"lava" |
|
"electric-ocean" |
|
"sunset" |
Command structure
mandel [global flags] <command> [args]
Global flags
| Flag | Description | Default |
|---|---|---|
--help |
Show help | off |
--version |
Show version and exit | off |
-v, -vv, -vvv, --verbose |
Verbosity (nothing=ERROR, -v=WARNING, -vv=INFO, -vvv=DEBUG) |
ERROR |
--color/--no-color |
Force enable/disable colored output (respects NO_COLOR env var if not provided) |
--color |
-w/--width |
Output image width in pixels (16–8192) | 1024 |
-h/--height |
Output image height in pixels (16–8192) | 1024 |
--threads |
Number of worker processes for rendering (1–N, default: all available cores) | all cores |
-o/--out |
Output directory path | current directory |
--prefix |
Filename prefix | mandel |
--date/--no-date |
Include date-time (YYYYMMDDhhmmss) in filename |
--date |
--hash/--no-hash |
Include 20-char SHA256 hash in filename | --hash |
CLI Commands Documentation
Auto-generated CLI reference:
mandel gen — Render a Mandelbrot image
poetry run mandel [-w WIDTH] [-h HEIGHT] gen [CENTER_RE] [CENTER_IM] [F_WIDTH] [F_HEIGHT] [--iter N] [--palette NAME]
Positional arguments (all optional; defaults show the full Mandelbrot set):
| Argument | Description | Default |
|---|---|---|
CENTER_RE |
Real part of the center point (string, for exact precision) | '-0.75' |
CENTER_IM |
Imaginary part of the center point (string, for exact precision) | '0' |
F_WIDTH |
Width of the frame in the real plane | '2.5' |
F_HEIGHT |
Height of the frame in the imaginary plane | same as F_WIDTH |
Command-level options:
| Option | Description | Default |
|---|---|---|
-i/--iter |
Override max iterations (depth); 1000–4294967295 |
automatic adaptive search |
--palette |
Color palette name | blue-to-yellow-to-brown |
The command:
- Constructs a
Framefrom the given coordinates usinggmpy2.mpqexact arithmetic - Calculates the required
mpfrprecision automatically based on zoom depth - When
--iteris not given, runs an adaptive pre-pass on a tiny 16×16 render to estimate the optimalmax_iterfor the frame (with a 1.5× safety margin); otherwise uses the value supplied - Renders all pixels in parallel using
ProcessPoolExecutor(one process per available CPU core, up to 16), each writing an interleaved subset of rows; results are merged into the final image - Each process uses the escape-time algorithm with cardioid/period-2 bulb interior shortcuts and histogram-equalized color palette
- Saves the PNG to
<prefix>[-<YYYYMMDDhhmmss>][-<SHA256-20>].pngin the working directory (or the path given by-o/--out)
See below for many example outputs.
Comprehensive example images and zooms
You can run all these at once by executing scripts/make_examples.sh.
Full / Default (×1, 80 bits)
Render the full Mandelbrot set with all the default values (image size 1024×1024, centered in $-0.75+0j$ and with width of $2.5$, a good frame that contains the whole set):
$ poetry run mandel gen
1024x1024 Mandelbrot in frame [(-3/4, 0) @ 5/2], precision 80 bits, 1 magnification, AUTO iterations...
Pre: 100%|█████████████████████████████████████████████| 256/256 [00:00<00:00, 962134.25px/s]
Img: 100%|█████████████████████████████████████████████| 1048576/1048576 [00:01<00:00, 593762.44px/s]
Generated image 'bd77ee8874aa425422a9ea92867c53937f28534898d49a56b9e4d1dca7b5dd54' in 3.135 s, escape range (1, 1000)
Saved to "mandel-bd77ee8874aa425422a9.png"
This is what tranZoom considers "1 magnification", and will measure other magnifications against this size.
Seahorse (×155, 83 bits)
Render a well-known zoom ("Seahorse") to a 1024×1024 image (default size):
$ poetry run mandel gen " -0.74303" "0.126433" "0.01611"
1024x1024 Mandelbrot in frame [(-74303/100000, 126433/1000000) @ 1611/100000], precision 83 bits, 155.183 magnification, AUTO iterations...
Pre: 100%|█████████████████████████████████████████████| 256/256 [00:00<00:00, 2575.92px/s]
Img: 100%|█████████████████████████████████████████████| 1048576/1048576 [00:36<00:00, 28721.25px/s]
Generated image '0cf52a6f78b4a883727c553da286b9f0f446a3671b01a6e364e3ae8f9b2391b3' in 38.291 s, escape range (24, 9276)
Saved to "mandel-0cf52a6f78b4a883727c.png"
Seahorse Tail (×3k, 88 bits)
Render a "Seahorse Tail" to a 512×512 image:
$ poetry run mandel gen " -0.7436499" "0.13188204" "0.00073801"
1024x1024 Mandelbrot in frame [(-7436499/10000000, 3297051/25000000) @ 73801/100000000], precision 88 bits, 3.387 k magnification, AUTO iterations...
Pre: 100%|█████████████████████████████████████████████| 256/256 [00:00<00:00, 101834.39px/s]
Img: 100%|█████████████████████████████████████████████| 1048576/1048576 [00:05<00:00, 199725.00px/s]
Generated image '38824cdaa58b64496ebfd86facf4d4ba4596ab18db95ac97afd643a7a892ff83' in 6.797 s, escape range (36, 1000)
Saved to "mandel-38824cdaa58b64496ebf.png"
This image is relatively fast to generate (despite the zoom level, it has very little interior regions), so we use it in the unit and integration tests to make sure we are operating consistently. If the hash of this image changes, remember to change it in src/tranzoom/cli/base.py.
Powers of 1000
Centering on exactly:
$-0.7436438870371587047521915061147740000000008 + 0.13182590420531197049313205638514950000008j$
or, if you want to use as parameters:
" -0.7436438870371587047521915061147740000000008" "0.13182590420531197049313205638514950000008"
We have, for fun, generated a sequence of powers of 1000, demonstrating the amazing power of the infinite. The view size of each image is always $2.5$ times some power of 1000.
| Image | Bits | Depth | Size $2.5\times$ | Equivalent real-world size / Landmark examples |
|---|---|---|---|---|
| $80$ | $1$ - $1000$ | $1$ | $\sim 10^{11}$ light-years = Observable-universe scale, about $93$ billion light-years across. | |
| $86$ | $32$ - $1000$ | $10^{-3}$ | $\sim 10^{8}$ light-years = Cosmic-web / supercluster scale: galaxy walls, voids. | |
| $96$ | $219$ - $7348$ | $10^{-6}$ | $\sim 10^{5}$ light-years = Galaxy scale: the Milky Way is about $100{,}000$ light-years across. | |
| $106$ | $1006$ - $2664$ | $10^{-9}$ | $\sim 100$ light-years = Local stellar-neighborhood scale: nearby star groups, nebulae, and star-forming regions. | |
| $116$ | $1974$ - $3901$ | $10^{-12}$ | $\sim 0.1$ light-year = Outer-solar-system scale: comparable to the distant Oort-cloud region. | |
| $126$ | $4132$ - $93051$ | $10^{-15}$ | $\sim 10^{9},\mathrm{km}$ = Inner-to-middle solar-system scale: comparable to giant-planet orbital distances. | |
| $136$ | $8035$ - $11740$ | $10^{-18}$ | $\sim 10^{6},\mathrm{km}$ = Star / giant-planet scale: the Sun’s diameter is about $1.39 \times 10^{6},\mathrm{km}$. | |
| $146$ | $9033$ - $15673$ | $10^{-21}$ | $\sim 10^{3},\mathrm{km}$ = Planetary-geography scale: large countries, small moons, continent-scale weather systems. | |
| $156$ | $13074$ - $33133$ | $10^{-24}$ | $\sim 1,\mathrm{km}$ = Human landscape scale: mountains, city districts, bridges, runways. | |
| $166$ | $17130$ - $32103$ | $10^{-27}$ | $\sim 1,\mathrm{m}$ = Human/body scale: a person, table, doorway, musical instrument. | |
| $176$ | $26939$ - $61788$ | $10^{-30}$ | $\sim 1,\mathrm{mm}$ = Small visible-object scale: sand grains, seeds, insect parts, raindrops. | |
| $186$ | $58119$ - $205876$ | $10^{-33}$ | $\sim 1,\mu\mathrm{m}$ = Cell/microbe scale: bacteria, organelles, and wavelengths near visible/infrared light. | |
| $196$ | $65240$ - $67722$ | $10^{-36}$ | $\sim 1,\mathrm{nm}$ = Molecule scale: DNA width, proteins, small molecular machines. | |
| $206$ | $65327$ - $67968$ | $10^{-39}$ | $\sim 1,\mathrm{pm}$ = Deep atomic/electron-cloud scale: smaller than typical atomic diameters, which are around $10^{-10},\mathrm{m}$. | |
| $216$ | $65524$ - $70198$ | $10^{-42}$ | $\sim 1,\mathrm{fm}$ = Atomic nucleus / proton scale: the proton rms charge radius is about $8.4075 \times 10^{-16},\mathrm{m}$. | |
| $226$ | $65799$ - $69258$ | $10^{-45}$ | $\sim 1,\mathrm{am}$ = Quarks and leptons: elementary particles in the Standard Model |
Configuration
Config files are stored in OS-native locations via transcrypto.utils.config:
- macOS:
~/Library/Application Support/tranzoom/config.bin - Linux:
~/.config/tranzoom/config.bin - Windows:
%APPDATA%\tranzoom\config.bin
Color and formatting
The CLI respects the NO_COLOR environment variable and the --no-color / --color flag. Rich markup is used for console output — see Rich markup conventions.
Exit codes
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Generic failure |
| 2 | CLI usage error (bad arguments) |
Project Design
Modules / packages
| Component | Responsibility |
|---|---|
mandel.py |
Mandelbrot CLI, generation, reading, etc |
zoom.py |
Mandelbrot Zoom methods CLI |
cli/base.py |
Shared CLI options, defaults, DEFAULT_FRAME |
cli/gencommand.py |
mandel gen command implementation |
core/fractal.py |
Mandelbrot() renderer — most fractal math |
core/frame.py |
Frame class and base math |
core/image.py |
Image class |
utils/template.py |
Template for new utility modules |
Performance characteristics
Rendering is CPU-bound. Time scales roughly with width × height × max_iter × precision_overhead. For deep zooms, higher precision means slower mpfr arithmetic (roughly linear in the number of bits). For very deep zooms (>100 bits precision), rendering a 256×256 image at 50k iterations can take minutes to hours. The tqdm progress bar shows per-row speed.
The Mandelbrot() function pre-computes all X-axis mpfr values once per image and reuses them across rows, which is an important optimization since mpfr construction is expensive at high precision.
Development Instructions
File structure
.
├── CHANGELOG.md ⟸ latest changes/releases
├── LICENSE
├── Makefile
├── mandel.md ⟸ auto-generated CLI doc (by `make docs` or `make ci`)
├── zoom.md ⟸ auto-generated CLI doc (by `make docs` or `make ci`)
├── poetry.lock ⟸ maintained by Poetry; do not manually edit
├── pyproject.toml ⟸ most important configurations live here
├── README.md ⟸ this documentation
├── SECURITY.md ⟸ security policy
├── requirements.txt
├── .editorconfig
├── .gitignore
├── .pre-commit-config.yaml ⟸ pre-submit configs
├── .github/
│ ├── copilot-instructions.md
│ ├── dependabot.yaml
│ └── workflows/
│ ├── ci.yaml
│ └── codeql.yaml
├── .vscode/
│ ├── extensions.json
│ └── settings.json
├── scripts/
│ ├── make_examples.sh ⟸ renders example images at all zoom levels to test/data/images
│ └── template.py ⟸ template for standalone executable scripts
├── src/
│ └── tranzoom/
│ ├── __init__.py ⟸ version lives here
| ├── mandel.py ⟸ TranZoom mandel CLI
│ ├── zoom.py ⟸ TranZoom zoom CLI
│ ├── py.typed
│ ├── cli/
│ │ ├── __init__.py
│ │ ├── base.py ⟸ shared CLI options and frame defaults
│ │ └── gencommand.py ⟸ `mandel gen` command implementation
│ ├── core/
│ │ ├── __init__.py
│ │ ├── fractal.py ⟸ Mandelbrot() renderer
│ │ ├── frame.py ⟸ Frame class; base for computation
│ │ ├── image.py ⟸ Image class
│ │ └── palette.py ⟸ Palette definitions
│ └── utils/
│ ├── __init__.py
│ └── template.py ⟸ template for new utility modules
├── tests/
│ ├── mandel_test.py
│ ├── zoom_test.py
│ ├── cli/
│ │ ├── base_test.py ⟸ seahorse tail hash regression test
│ │ └── gencommand_test.py
│ └── data/
│ └── images/ ⟸ example renders at 7 zoom levels and powers of 1000
└── tests_integration/
└── test_installed_cli.py
Development Setup
Install Python
On Linux:
sudo apt-get update && sudo apt-get upgrade
sudo apt-get install git python3 python3-dev python3-venv build-essential software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa && sudo apt-get update
sudo apt-get install python3.12 # or python3.13 or python3.14
On macOS:
brew update && brew upgrade && brew cleanup -s
brew install git python@3.12 # or python3.13 or python3.14
Note: gmpy2 requires the GMP, MPFR, and MPC C libraries. On macOS: brew install gmp mpfr mpc. On Linux: sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev.
Install Poetry (recommended: pipx)
python3 -m pip install --user pipx
python3 -m pipx ensurepath
pipx install poetry
poetry --version
If you will use PyPI to publish:
poetry config pypi-token.pypi <TOKEN>
Make sure .venv is local
poetry config virtualenvs.in-project true
Get the repository
git clone https://github.com/balparda/tranzoom.git
cd tranzoom
Create environment and install dependencies
poetry env use python3.12 # creates the .venv with the correct Python version
poetry sync # install all dependencies from poetry.lock
poetry env info # verify environment
poetry run mandel --help # smoke test
poetry run zoom --help # smoke test
make ci # should pass on clean repo
To activate the environment:
source .venv/bin/activate
# ... work ...
deactivate
Optional: VSCode setup
This repo ships a .vscode/settings.json configured to use ./.venv/bin/python, run pytest, format with Ruff, and use Google-style docstrings. Recommended extensions:
- Python (
ms-python.python) - Python Environments (
ms-python.vscode-python-envs) - Python Debugger (
ms-python.debugpy) - Pylance (
ms-python.vscode-pylance) - Mypy Type Checker (
ms-python.mypy-type-checker) - Ruff (
charliermarsh.ruff) - autoDocstring (
njpwerner.autodocstring) - Code Spell Checker (
streetsidesoftware.code-spell-checker) - markdownlint (
davidanson.vscode-markdownlint) - Markdown All in One (
yzhang.markdown-all-in-one) - GitHub Copilot (
github.copilot)
Build
poetry build # builds wheel + sdist in dist/
Run locally
poetry run mandel --help
poetry run mandel gen # full set, 1024×1024
Testing
Unit tests / Coverage
make test # plain test run (no integration tests)
make integration # run the integration tests
poetry run pytest -vvv # verbose
make cov # coverage: poetry run pytest --cov=src --cov-report=term-missing
Test tags defined in pyproject.toml:
| Tag | Meaning |
|---|---|
slow |
test takes > 1s |
flaky |
known flaky test — avoid |
stochastic |
may fail with very low probability |
Filter by tag:
poetry run pytest -vvv -m slow
Find slow tests:
poetry run pytest -vvv -q --durations=20
Find flaky tests:
make flakes # runs all tests 100 times
Instrumenting your code
source .venv/bin/activate
pyinstrument -r html -o profile.html -- $(which mandel) gen " -0.74303" "0.126433" "0.01611"
deactivate
Integration / e2e tests
Integration tests build a wheel, install it into a fresh temporary virtualenv, and run the console scripts. Run with:
make integration
# or:
poetry run pytest -m integration -q
Linting / formatting / static analysis
make lint # poetry run ruff check .
make fmt # poetry run ruff format .
poetry run ruff format --check . # check formatting without rewriting
Type checking
make type # poetry run mypy src tests tests_integration
Documentation updates
CLI reference is auto-generated from the CLI source code:
make docs # regenerates mandel.md & zoom.md
# or:
poetry run mandel markdown > mandel.md
poetry run zoom markdown > zoom.md
Always run make ci before committing — it runs linting, type checking, tests, and regenerates docs and requirements.txt.
Versioning and releases
Versioning scheme
- Patch: bug fixes / docs / small improvements.
- Minor: new features or non-breaking changes.
- Major: breaking changes (command renames, incompatible output formats).
See: CHANGELOG.md
Updating versions
Bump project version (patch/minor/major)
poetry version minor # 1.0.0 → 1.1.0
poetry version patch # 1.0.0 → 1.0.1
poetry version 1.2.3 # explicit version
Also update src/tranzoom/__init__.py to match!
Update dependency versions
poetry update # update poetry.lock to latest compatible versions
poetry cache clear PyPI --all # if cache issues
poetry add "pkg>=1.2.3" # add prod dependency
poetry add -G dev "pkg>=1.2.3" # add dev dependency
Exporting the requirements.txt file
make req # poetry export --format requirements.txt --without-hashes --output requirements.txt
CI and docs
make ci # runs lint, type check, tests, docs, requirements — do this before every commit
Git tag and commit
git commit -a -m "release version 1.0.0"
git tag 1.0.0
git push && git push --tags
Publish to PyPI
poetry config pypi-token.pypi <TOKEN> # once, if not already configured
poetry build
poetry publish
Security
Please refer to the security policy in SECURITY.md for supported versions and how to report vulnerabilities.
The project uses CodeQL (weekly + on every push) and dependabot (weekly dependency updates) to keep the codebase secure and up-to-date.
Troubleshooting
Enable debug output
poetry run mandel -vvv gen ... # DEBUG level logging
gmpy2 installation issues
On macOS, gmpy2 requires the GMP, MPFR, and MPC C libraries. Install them first:
brew install gmp mpfr mpc
poetry sync
On Linux:
sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev
poetry sync
Rendering is very slow
- Reduce image size:
mandel -w 256 -h 256 gen ... max_iteris auto-scaled with zoom depth; very deep zooms are inherently slow- Very high precision (> 1000 bits, i.e., zoom > ~10^300) will always be slow — this is expected
Thanks! Daniel Balparda & Bella Keri
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file tranzoom-1.0.0.tar.gz.
File metadata
- Download URL: tranzoom-1.0.0.tar.gz
- Upload date:
- Size: 48.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.5 Darwin/25.4.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
288ed2b1f62cc6a65901802810a591a247d68426bf714d0ab260ca6c5c8ced13
|
|
| MD5 |
fa19d54d1b0a8b90d437078e97d29d6b
|
|
| BLAKE2b-256 |
eff1e90e6bd3f280098f648637ad174c928f9f305c8958eb264aa9a404d39f3b
|
File details
Details for the file tranzoom-1.0.0-py3-none-any.whl.
File metadata
- Download URL: tranzoom-1.0.0-py3-none-any.whl
- Upload date:
- Size: 42.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.3 CPython/3.13.5 Darwin/25.4.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
70f224c5765196d7581c27f700a7c1c4edb260a8e85b51399d9374d1d82451ed
|
|
| MD5 |
811dbf808bac8f5f6801ae869b0c38db
|
|
| BLAKE2b-256 |
91a5f6544d699aa92cf4a2938c37511547b18354825d5233edff847fc42f03b7
|