Ecosystem
%%{init: {"flowchart": {"htmlLabels": true}, "theme": "default"}}%%
graph TD
%% L0 - Data Source
subgraph L0["L0 - Data Source"]
GeoJSON[evansiroky/timezone-boundary-builder<br/>GeoJSON Data]
end
%% L1 - Core Processing
subgraph L1["L1 - Core Processing"]
TZF[ringsaturn/tzf<br/>Go Implementation<br/>Topology-aware processing]
end
%% L2 - Data Distribution
subgraph L2["L2 - Data Distribution"]
TZF_DIST[ringsaturn/tzf-dist<br/>Go module + Rust crate<br/>TZF embedded binary format]
end
%% L3 - Language Implementations
subgraph L3["L3 - Language Implementations"]
TZF_RS[ringsaturn/tzf-rs<br/>Rust Implementation]
TZF_SWIFT[ringsaturn/tzf-swift<br/>Swift Implementation]
end
%% L4 - Language Bindings & Extensions
subgraph L4["L4 - Bindings & Extensions"]
TZFPY[ringsaturn/tzfpy<br/>Python Bindings]
TZF_RB[HarlemSquirrel/tzf-rb<br/>Ruby Bindings]
TZF_WASM[ringsaturn/tzf-wasm<br/>WASM for Browsers]
PG_TZF[ringsaturn/pg-tzf<br/>PostgreSQL Extension]
end
%% L5 - Applications & Services
subgraph L5["L5 - Applications & Services"]
TZF_WEB[ringsaturn/tzf-web<br/>Online Demo]
RUST_TZ_SERVICE[racemap/rust-tz-service<br/>HTTP API]
end
%% Data Flow
GeoJSON --> TZF
TZF --> TZF_DIST
%% Go uses tzf-dist directly
TZF_DIST --> |Go module| TZF
TZF_DIST --> |Rust crate| TZF_RS
TZF_DIST --> |embedded| TZF_SWIFT
%% Rust Ecosystem
TZF_RS --> TZFPY
TZF_RS --> TZF_RB
TZF_RS --> TZF_WASM
TZF_RS --> PG_TZF
TZF_RS --> RUST_TZ_SERVICE
%% Web Applications
TZF_WASM --> TZF_WEB
%% Styling
classDef l0 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef l1 fill:#e8f5e8,stroke:#388e3c,stroke-width:2px
classDef l2 fill:#fff3e0,stroke:#f57c00,stroke-width:2px
classDef l3 fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef l4 fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef l5 fill:#e0f2f1,stroke:#00695c,stroke-width:2px
class GeoJSON l0
class TZF l1
class TZF_DIST l2
class TZF_RS,TZF_SWIFT l3
class TZFPY,TZF_RB,TZF_WASM,PG_TZF l4
class TZF_WEB,RUST_TZ_SERVICE l5
- L0 - Data Source: Raw geographic timezone boundary data from upstream providers
- L1 - Core Processing: Primary data processing — topology-aware polygon simplification, shared-edge deduplication, Polyline encoding, and tile pre-index generation
- L2 - Data Distribution: Processed binary data in theTZF embedded binary format,
distributed as a Go module and Rust crate
- ringsaturn/tzf-dist
- Files:
lite.tzb(~4 MB, topology-simplified, transport profile),lite.tzm(~10 MB, the same data as a memory image),full.tzb(~14 MB, full precision) — all three carry the FUZZY tile preindex and the samedata_version - The crates.io package carries
lite.tzbonly;full.tzbis git-only for size, andfull.tzmis never published — derive it locally withcmd/tzb2tzm - The v1 protobuf artifacts (
combined-with-oceans.*.bin) are no longer published; thetzf-rel/tzf-rel-literepositories are superseded
- L3 - Language Implementations: Core timezone lookup implementations consuming tzf-dist data
- L4 - Language Bindings & Extensions: Wrapper libraries and database extensions built on top of core implementations
- L5 - Applications & Services: End-user applications, web services, and API servers
- ringsaturn/tzf-web — the online demo,
which also renders the FUZZY preindex tiles exported by
GetTZPreindexGeoJSON - racemap/rust-tz-service
- ringsaturn/tzf-web — the online demo,
which also renders the FUZZY preindex tiles exported by
As of 2026-09-12, tzf (Go), tzf-rs (Rust), tzfpy, tzf-wasm and tzf-swift read
the v2 .tzb artifacts; tzf-wasm 2.0.0 builds on tzf-rs 2.0.0, and tzf-swift
2.0.0 is a protobuf-free port over lite.tzb. On 2026-09-14, tzf v2.1.1, tzf-rs
2.1.1 and the tzfpy 2.1.0b2 pre-release moved to tzf-dist v0.0.2026-c-tzb2
(the same 2026c data at 64-point chunks); tzf-wasm and tzf-swift stay on
2.0.0. tzf-rb is maintained independently byHarlemSquirrel and currently builds on the
v1 line.
Last updated on