Theme Forge: Solar Sail (theme-forge-solar-sail)
- PyPI distribution version:
0.2.1.post1 - Upstream release version:
0.2.1 - Upstream npm package:
@knowledge-forge-ai/theme-forge-solar-sail - Upstream source commit:
68e3f95a27cf1681aabb1fccb55e8b78d23b5fa0 - Upstream release tag: v0.2.1
- Console script entrypoint:
tfss - SPDX license expression:
AGPL-3.0-or-later - Python requirement:
>=3.9 - External runtime requirement:
Node.js >=22(Requires-External: nodejs (>=22))
Overview
Theme Forge Solar Sail is a deterministic theme compiler, library, and tfss CLI for Tailwind CSS v4 and shadcn/ui application theming (tfss.theme-v1), packaged as the theme-forge-solar-sail Python distribution (0.2.1.post1). It serves as the application-theming sibling engine to Theme Forge Stellar Loom.
The .post1 PEP 440 post-release suffix identifies the first Python packaging revision of the immutable upstream 0.2.1 release (@knowledge-forge-ai/theme-forge-solar-sail 0.2.1, a patch successor of 0.2.0).
Theme Forge Solar Sail translates declarative theme specifications (tfss.theme-v1) into:
- Tailwind CSS v4
@theme inlineconfiguration: Emits clean CSS theme variables directly compatible with Tailwind v4's stylesheet-first engine. - shadcn/ui semantic roles: Maps tokens to standard component roles (
background,foreground,card,popover,primary,secondary,muted,accent,destructive,border,input,ring, plus optionalchart1–chart5and canonicalsidebar*tokens). - Light and dark theme support: Emits scoped
:rootand.dark/@custom-variant dark (&:is(.dark *))styles. - Radius progression: Defines full radius scales from
--radius-smthrough--radius-4xl. - Actionable diagnostics: Verifies color contrast ratios against background tokens and reports contrast diagnostics.
- Standalone distribution packages: Generates self-contained packages in TypeScript (
--language typescript) or zero-build JavaScript (--language javascript) that require zero runtime dependencies on Solar Sail or any external service. - Dependency-free upstream payload: Solar Sail has zero third-party npm dependencies and zero native binary addons.
Wheel Targets and Requirements
Platform wheels and host-targeted source-distribution (sdist) builds support three POSIX environments:
| Target Key | Operating System & Architecture | PEP 425 Wheel Tag | Minimum C Library / OS Floor |
|---|---|---|---|
darwin-arm64 |
macOS Apple Silicon (arm64) |
py3-none-macosx_11_0_arm64 |
macOS 11.0+ |
linux-arm64-gnu |
Linux ARM64 (aarch64, GNU libc) |
py3-none-manylinux_2_28_aarch64 |
glibc >= 2.28 |
linux-x64-gnu |
Linux AMD64 (x86_64, GNU libc) |
py3-none-manylinux_2_28_x86_64 |
glibc >= 2.28 |
Distribution Filenames
theme_forge_solar_sail-0.2.1.post1-py3-none-macosx_11_0_arm64.whltheme_forge_solar_sail-0.2.1.post1-py3-none-manylinux_2_28_aarch64.whltheme_forge_solar_sail-0.2.1.post1-py3-none-manylinux_2_28_x86_64.whltheme_forge_solar_sail-0.2.1.post1.tar.gz
Prerequisites
- Python
>=3.9withpip. - Node.js
>=22(v22.0.0or newer) matching the wheel's target operating system, CPU architecture, and (on Linux) GNUlibc(glibc >= 2.28).
Verify both runtimes before installation:
python3 --version
node --version
Installation and Upgrade
Standard installation from PyPI downloads the distribution over the network:
python3 -m pip install "theme-forge-solar-sail==0.2.1.post1"
Upgrade an existing installation to 0.2.1.post1:
python3 -m pip install --upgrade "theme-forge-solar-sail==0.2.1.post1"
Offline Installation from Local Artifacts
The entire upstream release payload is bundled inside the wheel and sdist. The Python packaging adapter and launcher never invoke npm, npx, or corepack.
To install offline from a local directory (./dist) containing the prebuilt wheel or .tar.gz sdist without network access:
python3 -m pip install --no-index --no-deps --find-links ./dist "theme-forge-solar-sail==0.2.1.post1"
--no-deps is safe because theme-forge-solar-sail declares zero Python package dependencies and build-system.requires = []. When building a wheel from theme_forge_solar_sail-0.2.1.post1.tar.gz, the bundled offline PEP 517 backend (rs9.tf_pypi_backend under _rs9_build/) selects the current host target (darwin-arm64, linux-arm64-gnu, or linux-x64-gnu) via host_key(), refuses unsupported build hosts (such as darwin-x64 or non-glibc Linux), and rejects any PEP 517 config_settings.
Node.js Resolution and Launcher Diagnostics
At runtime, the console-script wrapper (theme_forge_solar_sail.launcher) locates the Node.js executable in the following order:
THEME_FORGE_NODE_BINenvironment variable: If set and non-empty, the launcher uses that path directly without falling back toPATH.PATHlookup: Otherwise, the launcher resolvesnodeonPATH.
To bind execution to a specific Node.js >=22 binary:
export THEME_FORGE_NODE_BIN="/opt/node-v22/bin/node"
tfss --version
Runtime Verification and Failure Codes
Before handing off execution with os.execv, the launcher verifies:
- The host
os.nameis"posix"and the packaged JavaScript entrypoint exists on disk. <node> --versionreports a major version>=22.- A subprocess check of Node's
process.platform,process.arch, andprocess.report.getReport().header.glibcVersionRuntimematches the wheel'sPLATFORM_KEY(darwin-arm64,linux-arm64-gnu, orlinux-x64-gnu) and, on Linux, confirms GNUlibcmeetsMIN_GLIBC(2.28). Note that the macOS11.0deployment floor is enforced by the wheel tag (macosx_11_0_arm64) rather than a runtime macOS version probe.
If any check fails, the launcher exits with status 1 and writes a single line to stderr in the fixed format:
<TOKEN>: Node.js >=22 and an intact supported POSIX installation are required.
| Diagnostic Token | Triggering Conditions |
|---|---|
TF_PYPI_NODE_REQUIRED |
Non-POSIX host, missing packaged entrypoint file, node not found on PATH, THEME_FORGE_NODE_BIN missing or non-executable, --version query failure, or detected Node.js major version older than 22. |
TF_PYPI_NODE_PLATFORM |
Node's reported process.platform/process.arch does not match the wheel's PLATFORM_KEY (for example, running an x64 Node.js binary under Rosetta 2 on darwin-arm64), Linux runtime is non-glibc (such as musl), or Linux runtime glibc is older than 2.28. |
The installed Python package (theme_forge_solar_sail) ships an empty __init__.py and exposes no Python library API; installing via pip provides the tfss console script on PATH.
Command-Line Interface (tfss)
The tfss CLI (bin/tfss.js -> dist/cli.js) provides three subcommands plus --help and --version:
tfss validate <theme.json> [--fail-on-diagnostics] [--json]
tfss compile <theme.json> --out <file|dir> [--overwrite] [--fail-on-diagnostics] [--json]
tfss generate <theme.json> --package <package.json> --out <dir> [--language typescript|javascript] [--fail-on-diagnostics] [--json]
tfss --help | -h
tfss --version | -v
1. Validate a Theme Specification (tfss validate)
Validates theme specification schema conformance, required color roles, and color contrast diagnostics (--out and --overwrite are not supported on validate):
tfss validate path/to/theme.json
tfss validate path/to/theme.json --fail-on-diagnostics
tfss validate path/to/theme.json --json
In --json mode, validate emits {"status": "success", "command": "validate", "valid": true, "errors": [], "diagnostics": [...]} on stdout.
2. Compile to a Standalone Stylesheet (tfss compile)
Compiles a theme specification into a standalone Tailwind CSS v4 and shadcn/ui stylesheet (--out <destination> is required):
# Write directly to a .css file path
tfss compile path/to/theme.json --out ./dist/theme-compiled.css
# Or pass a directory path to write <dir>/theme.css
tfss compile path/to/theme.json --out ./dist/styles
# Replace an existing CSS file and return the compilation descriptor in JSON on stdout
tfss compile path/to/theme.json --out ./dist/styles --overwrite --json
Output and descriptor contract:
- Destination path resolution: If
--out <destination>ends with.css,tfss compilewrites the stylesheet directly to that CSS file path. Otherwise, it resolves<destination>/theme.cssinside the target directory. - Descriptor output:
tfss compilewrites only the compiled CSS file to disk; it does not write a separatetheme.descriptor.jsonfile. When invoked with--json,tfss compilereturns the compilation descriptor and SHA-256 output digest in the structuredstdoutresult ({"status": "success", "command": "compile", "outputFile": "...", "outputDigest": "...", "descriptor": {...}}).
3. Generate an Installable Theme Package (tfss generate)
Generates a self-contained npm theme package with manifest, stylesheet, types, and provenance (--package <file> and a directory --out <dir> are both required):
tfss generate path/to/theme.json \
--package path/to/package-metadata.json \
--out ./packages/my-app-theme \
--language typescript \
--json
Options for generate:
--package <file>: Path to package metadata JSON (name,version,description,license).--out <dir>: Destination directory (must be absent or empty;--overwriteis forbidden forgenerate).--language <typescript|javascript>: Target integration language (default:javascript).--fail-on-diagnostics: Fail when contrast diagnostics are present.--json: Emit structured JSON status ({"status": "success", "command": "generate", "outDir": "...", "filesWritten": [...], "descriptor": {...}, "provenance": {...}}).
Locating Bundled Example Files on Disk
The installed wheel unpacks upstream example files under <site-packages>/theme_forge_solar_sail/payload/package/examples/, including examples/forge-console.theme.json, examples/forge-console.profile.json, examples/flexoki.profile.json, and examples/package-metadata.json. Because theme_forge_solar_sail has no Python library API, locating theme_forge_solar_sail.__file__ in a helper snippet only resolves the installed payload directory on disk to pass to the tfss CLI:
SPEC_PATH="$(python3 -c 'import pathlib, theme_forge_solar_sail as m; print(pathlib.Path(m.__file__).parent / "payload/package/examples/forge-console.theme.json")')"
tfss validate "$SPEC_PATH" --json
tfss compile "$SPEC_PATH" --json --out ./theme.css
Example invocation from Python using subprocess:
import json
from pathlib import Path
import subprocess
import tempfile
import theme_forge_solar_sail
spec_path = (
Path(theme_forge_solar_sail.__file__).parent
/ "payload/package/examples/forge-console.theme.json"
)
validate_res = subprocess.run(
["tfss", "validate", str(spec_path), "--json"],
capture_output=True,
text=True,
check=True,
)
assert json.loads(validate_res.stdout)["status"] == "success"
with tempfile.TemporaryDirectory() as tmp:
css_file = Path(tmp) / "theme.css"
compile_res = subprocess.run(
["tfss", "compile", str(spec_path), "--json", "--out", str(css_file)],
capture_output=True,
text=True,
check=True,
)
payload = json.loads(compile_res.stdout)
assert payload["status"] == "success"
assert "descriptor" in payload
assert "--" in css_file.read_text(encoding="utf-8")
Package Architecture, Language Modes, and Backend Boundaries
Generated theme packages are self-contained:
- TypeScript mode (
--language typescript): Emitssrc/index.ts,tsconfig.json, and abuildscript (tsc) configured to compile intodist/when run. Generation does not run that build. - JavaScript mode (
--language javascript): Emits zero-buildindex.jsandindex.d.tsentry points. - Zero consumer runtime coupling: Neither mode requires Solar Sail, Nebular Fusion, or repository-internal packages at consumer runtime.
Boundaries and Limitations
- Theme backend only: Solar Sail is a deterministic theme backend and compiler. It generates CSS tokens, radius scales, and package envelopes; it does not generate arbitrary React/TSX application code or UI component implementations.
- Tailwind v4 first: Output stylesheets target Tailwind CSS v4
@theme inlineand standard CSS custom properties. - Filesystem safety: Package generation requires the target directory to be absent or completely empty to prevent accidental overwrites.
tfss.theme-v1 Validation and Compatibility Contract
tfss.theme-v1 is a closed semantic schema. Unknown top-level, palette-mode, surface, typography, and color-role fields fail validation. The supported optional roles are chart1–chart5 and the canonical sidebar* roles in ColorTokens; these must occur in both light and dark modes. Arbitrary custom roles, aliases such as sidebar-background, spacing, tracking, and shadow fields require an explicit adapter and are not silently dropped. Chart tokens map chart1–chart5 to --chart-1–--chart-5 and --color-chart-1–--color-chart-5.
Color, Font, and Length Grammar
- Supported color subset: Hex (
3,4,6, or8digits), numericrgb(),hsl(), andoklch()functions, and bounded standalone CSS variable references (var(--x)) with supported color fallbacks. Declaration escapes, comments, invalid components, and nonfinite numbers fail. RGB channels, saturation/lightness, and alpha are range-checked; finite hue angles and nonnegative OKLCH chroma have no additional magnitude cap. Gamut conversion and hue normalization are not performed. - Unsupported indirection and contrast: Nested color indirection (such as
hsl(var(--x))orrgb(var(--x))) and font indirection (such asvar(--font-geist-sans), sans-serif) are unsupported and must be resolved in an explicit adapter before validation. Alpha and non-hex colors reportUNEVALUATED_CONTRAST, which is not an accessibility pass. - Fonts and lengths: Font stacks support quoted names and ordinary multiword names. Radius and border values use the validator's nonnegative CSS length subset; executable expressions are unsupported.
Input Parsing and Data Boundaries
- Byte parser (
parseThemeJson(bytesOrText)): Rejects duplicate decoded keys, malformed UTF-8, BOM, and unsafe JSON within a1 MiB/ depth-20bound. CLI input uses this boundary. - Object validation: Rejects accessors without evaluating getters, hidden/symbol properties, custom prototypes, cycles, and nonfinite numbers, returning owned, deeply frozen theme data.
- Identity-bearing spelling and control handling: Validated token spelling, including ordinary surrounding spaces, is identity-bearing; equal visual appearance does not imply an equal digest. CSS token strings and description/author fields reject C0, DEL, and C1 control characters before trimming. Human CLI output escapes terminal controls (
\uXXXX);--jsonmode preserves data meaning via standard JSON escaping. Generated README descriptions encode Markdown punctuation and leading whitespace as text.
Upstream Node.js API, Mapping Coverage, and Source Provenance
Upstream Node.js / npm interface notice: Installing
theme-forge-solar-sailviapipinstalls thetfssCLI and does not expose a Python import API or globally register the npm package for Node.js imports. The programmatic interfaces below apply when importing@knowledge-forge-ai/theme-forge-solar-sailin a Node.js / TypeScript project.
import {
bindSourceProfile,
compileTheme,
generateThemePackage,
validateThemeSpecification,
type ThemeSpecification,
} from "@knowledge-forge-ai/theme-forge-solar-sail";
// Direct validation and compilation
const validation = validateThemeSpecification(themeSpec);
const compiled = compileTheme(themeSpec);
// Byte-bound paired-profile mapping and package generation
const bound = bindSourceProfile(profileBytes, { expectedSha256 });
const { specification, report } = bound.mapToSolarSail();
// Inspect and disposition report.entries before adoption (unsupported != consumed)
const generated = generateThemePackage({
themeSpec: specification,
metadata: { name: "@example/application-theme", version: "1.0.0" },
language: "typescript",
});
Mapping Reports and Provenance Rules
- Report dispositions: Reports retain source paths, target paths where mapped, values, and reasons for
consumed,unsupported,target-specific,overridden,normalized, anddegradeddispositions. No color conversion is claimed. Solar surface overrides win over shared values explicitly; reading width and Loom/syntax intent remain visible as unsupported or another target's intent. Unknown Solar-specific override leaves require the report API; the bare mapper rejects them. - Leaf counting and legacy helpers:
summary.totalLeavescounts report entries (including synthetic defaults) rather than unique source leaves; disposition entries individually.mapToSyntaxPalette()is a legacy value projection without a coverage report. - Exported error constructors:
FilesystemSafetyErroris exported from the package root;StaleProvenanceErroridentifies itself byError.nameand carries expected/actual hashes.writeCssFileis CLI-internal. - Source profile hashing and transformations:
bindSourceProfileverifies SHA-256 against the exact input bytes and freezes the profile deeply.normalizedSha256hashes canonical paired JSON and is separate from the raw source byte digest.transformvalidates a new profile, binds its canonical serialized bytes, and retains the prior raw hash asparentSourceSha256. SerializingcanonicalizeJson(transformed.profile)reproduces those transformed source bytes. Embeddedsha256orsourceProfileSha256fields inside a profile are rejected as unknown authority; for Stellar Loom, passsourceProfileSha256frombound.mapToStellarLoom(baseCatalog)explicitly tocompileThemeCatalog(catalog, { sourceProfileSha256 }).
Identity and Determinism Domains
| Identity | Exact v1 Meaning |
|---|---|
| Profile source hash | SHA-256 of exact verified source bytes; whitespace matters. |
| Normalized profile hash | SHA-256 of recursively localeCompare("en") key-sorted, two-space JSON with one trailing LF. Arrays retain order. |
| Compiler input digest | SHA-256 of that canonical JSON encoding of the validated Solar theme, including any caller-supplied source hash. |
| Compiler output digest | SHA-256 of exact generated CSS bytes. |
| Descriptor inventory digest | SHA-256 of canonical { inputDigest, outputDigest, name, version }. |
| Package inventory digest | SHA-256 of tfss.package-inventory-v1\n followed by compact JSON.stringify of path/size/hash records sorted with localeCompare("en"). |
| Provenance hash | SHA-256 of the emitted provenance.json bytes (excluding provenance.json itself from its file inventory to avoid a cycle). |
| Generation invocation digest | Domain-prefixed canonical tfss.generation-invocation-v1: validated theme, effective metadata/defaults, language, and compiler name/version. |
describeGenerationInvocation(options) returns the complete direct-generator invocation plus every generated file's size and hash, including provenance, naming the descriptor and package inventory domains separately. Destination and overwrite policy are execution inputs rather than content inputs; package metadata and language are content inputs. Equal complete direct invocations under a qualified compiler and runtime produce equal emitted source-package bytes (without claiming cross-runtime locale equivalence or subsequent npm archive reproducibility).
Structured CLI Failures and Filesystem Contract
CLI Error Taxonomy
In --json mode, each invocation emits one JSON object on stdout. Failures emit status: "error", command, code, message, and validation details where relevant, and exit with code 1. Stable failure codes are:
ARGUMENT_ERRORPARSE_ERRORVALIDATION_ERRORUNSUPPORTED_INTENTDIAGNOSTIC_FAILUREFILESYSTEM_SAFETY_ERRORIO_ERRORINTERNAL_ERROR
Warnings and info diagnostics are nonfatal by default; --fail-on-diagnostics fails on contrast warnings or UNEVALUATED_CONTRAST before writing any output.
Filesystem Safety and Rollback Semantics
Package generation (tfss generate) accepts only absent or empty destination directories. It rejects path traversal, absolute or member separator ambiguity, case/Unicode collisions, file/directory prefix conflicts, symlink destinations or ancestors (including system alias symlinks; use physical paths), and nonempty destinations. Package names never determine filesystem destinations.
Cooperating writers reserve an empty directory exclusively, and every file uses exclusive creation. On I/O failure, rollback verifies identity and removes only unchanged entries created by that invocation, preserving prior empty directories and reporting any cleanup failure rather than hiding it. Package files become visible incrementally (not crash-atomic publication); if a crash leaves partial files and the reservation marker, inspect and remove only the abandoned invocation's owned state before retrying. Parent directories must remain trusted and stable during the operation. For tfss compile, --overwrite stages and checks a regular-file replacement; without --overwrite, existing files are preserved.
Paired Profile v2 Checkpoint
Paired Profile v2 (tf-paired-profile-v2) defines neutral semantic groups and separately named target adapters while maintaining existing paired v1 functions and historical identities. V2 requires explicit version migration, source-byte binding, and capability reports; it is not a silent replacement for v1, and unsupported intent remains visible.
- Cross-target mapping rules: Loom pixel geometry does not imply
rem/emconversion, and font families require explicit font-ID bindings. Code and syntax mapping is part of the report, while Solar component, sidebar, and chart vocabulary stays in target-only overrides. Complete invocations bind base inputs, final configuration, generation options, and compiler identity. - Additive v2 Node.js root exports:
validatePairedProfileV2,bindSourceProfileV2,canonicalizeProfileV2,migrateV1ToV2,migrateV2ToV1,applyRecipe,classifyProfileError,ERROR_CODES, and schema/adapter constants. Migrations and recipes take raw source bytes rather than parsed objects. Bound profiles exposemapToSolarSail()andmapToStellarLoom(explicitInputs)(returning catalog, syntax, and a single source-leaf capability report). V2 does not extend thetfssCLI or Studio file-open contract. - V2 provenance and validation: Distinguishes
source-bytes,transformed(canonical bytes created by a bound transformation), andserialized-profile. Group applicability states adapter capability independently of supplied leaves, and generated-default counts include only defaults surviving source projection and explicit overrides. Validation preserves authored color spelling and returns a detached frozen object without freezing caller data.
Package Layout
When installed into a Python environment, theme-forge-solar-sail unpacks under site-packages/theme_forge_solar_sail/ and site-packages/theme_forge_solar_sail-0.2.1.post1.dist-info/:
theme_forge_solar_sail/
__init__.py
launcher.py
payload/
package/
package.json
LICENSE
NOTICE
COMMERCIAL-LICENSE.md
bin/
tfss.js
dist/
cli.js
compiler.js
emitter.js
identity.js
index.js
input.js
legal.js
profile.js
types.js
validator.js
writer.js
paired-v2/
...
examples/
flexoki.profile.json
forge-console.profile.json
forge-console.theme.json
package-metadata.json
theme_forge_solar_sail-0.2.1.post1.dist-info/
METADATA
WHEEL
RECORD
entry_points.txt
rs9-tf-transform.json
licenses/
LICENSE
NOTICE
COMMERCIAL-LICENSE.md
RS9-LICENSE
RS9-NOTICE
Licensing and Legal Notices
The distribution is governed by the SPDX license expression:
AGPL-3.0-or-later
- Upstream payload (
@knowledge-forge-ai/theme-forge-solar-sail): Licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later), with attribution inNOTICEand separate commercial licensing details inCOMMERCIAL-LICENSE.md. - RS9 Python packaging adapter (
theme_forge_solar_sail/launcher.pyand_rs9_build/rs9/*): Licensed underAGPL-3.0-or-later(RS9-LICENSEandRS9-NOTICE).
Upstream Repository References
- Source:
https://github.com/Knowledge-Forge-AI/theme-forge-solar-sail/tree/68e3f95a27cf1681aabb1fccb55e8b78d23b5fa0 - Release:
https://github.com/Knowledge-Forge-AI/theme-forge-solar-sail/releases/tag/v0.2.1
Metadata
Release files for theme-forge-solar-sail 0.2.1.post1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| theme_forge_solar_sail-0.2.1.post1.tar.gz | 399.4 kB | With provenance | Details |
Built distributions (wheels)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| theme_forge_solar_sail-0.2.1.post1-py3-none-manylinux_2_28_x86_64.whl | Python 3 | none | Linux glibc 2.28+ x86-64 | Details |
| theme_forge_solar_sail-0.2.1.post1-py3-none-manylinux_2_28_aarch64.whl | Python 3 | none | Linux glibc 2.28+ ARM64 | Details |
| theme_forge_solar_sail-0.2.1.post1-py3-none-macosx_11_0_arm64.whl | Python 3 | none | macOS 11.0+ ARM64 | Details |
Total release size: 2.1 MB
Release files / theme_forge_solar_sail-0.2.1.post1.tar.gz
| Download URL | theme_forge_solar_sail-0.2.1.post1.tar.gz |
|---|---|
| Size | 399.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5e05094473ffbf5532794eeca6057e7c4b36ded9cd604ad5a6e4744359c118f5
|
|
BLAKE2b-256 checksum How to use checksums |
3ec7f084f81ef5f23d6508fe314e39fe6c00b75311c53e648941268d7c382191
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / theme_forge_solar_sail-0.2.1.post1-py3-none-manylinux_2_28_x86_64.whl
| Download URL | theme_forge_solar_sail-0.2.1.post1-py3-none-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 550.4 kB |
| Tags | Linux glibc 2.28+ x86-64 Python 3 |
|
SHA-256 checksum How to use checksums |
fc149840b54f255728433e1eeeae14f4bfbf7dccd51a46a4c1447e0b84c30f11
|
|
BLAKE2b-256 checksum How to use checksums |
62641e8aec0bbd4911f8a4cea36409dd1cb8cf38ca827b2865e2dc13033e72f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / theme_forge_solar_sail-0.2.1.post1-py3-none-manylinux_2_28_aarch64.whl
| Download URL | theme_forge_solar_sail-0.2.1.post1-py3-none-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 550.4 kB |
| Tags | Linux glibc 2.28+ ARM64 Python 3 |
|
SHA-256 checksum How to use checksums |
e838b5359c3c6eb5b4bbf54aa0c3e2bcbd2296029e19a1865157151ef285d32f
|
|
BLAKE2b-256 checksum How to use checksums |
cec5642ab9dd19f0dfc39df010e930543b778ce403653ca3a6057a29aab6ff87
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logRelease files / theme_forge_solar_sail-0.2.1.post1-py3-none-macosx_11_0_arm64.whl
| Download URL | theme_forge_solar_sail-0.2.1.post1-py3-none-macosx_11_0_arm64.whl |
|---|---|
| Size | 550.3 kB |
| Tags | Python 3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
d3d9f05d97af809703aa762bcc4ca9ab5d1c08b41bf28c99aedcd34c85964385
|
|
BLAKE2b-256 checksum How to use checksums |
d7b12db04d3f32ce16ea6cfc1cd360be59de211936563b0e225c7464ce493025
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logSecurity for theme-forge-solar-sail 0.2.1.post1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 4 files in this release have been uploaded with provenance metadata.
Attestation for theme_forge_solar_sail-0.2.1.post1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.