<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Software Documentation on Open Location Stack</title><link>https://openlocationstack.com/open-location-hub/docs/</link><description>Recent content in Software Documentation on Open Location Stack</description><generator>Hugo</generator><language>en</language><atom:link href="https://openlocationstack.com/open-location-hub/docs/index.xml" rel="self" type="application/rss+xml"/><item><title>API Reference</title><link>https://openlocationstack.com/open-location-hub/docs/api-reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://openlocationstack.com/open-location-hub/docs/api-reference/</guid><description/></item><item><title>Architecture</title><link>https://openlocationstack.com/open-location-hub/docs/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://openlocationstack.com/open-location-hub/docs/architecture/</guid><description>&lt;p&gt;&lt;em&gt;This page is generated from the Open Location Hub source documentation and should not be edited in the website repository.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="layers"&gt;Layers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cmd/hub&lt;/code&gt;: process bootstrap and wiring&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internal/config&lt;/code&gt;: environment-driven configuration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internal/httpapi&lt;/code&gt;: API surface and handlers&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internal/ws&lt;/code&gt;: OMLOX WebSocket wrapper protocol, subscriptions, and fan-out&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internal/storage/postgres&lt;/code&gt;: durable store&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internal/mqtt&lt;/code&gt;: MQTT topic mapping and broker integration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internal/auth&lt;/code&gt;: token verification middleware&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internal/rpc&lt;/code&gt;: local-method dispatch, MQTT RPC bridging, announcements, and aggregation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;internal/hub&lt;/code&gt;: shared CRUD, ingest, derived event generation, collision evaluation, and internal event bus emission&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="metadata-and-hot-state"&gt;Metadata And Hot State&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Postgres is the durable source of truth for hub metadata, zones, fences, trackables, and location providers.&lt;/li&gt;
&lt;li&gt;The runtime resolves the singleton hub metadata row before the service starts so one stable &lt;code&gt;hub_id&lt;/code&gt; and label are available for startup validation, internal event provenance, and identify responses.&lt;/li&gt;
&lt;li&gt;The hub loads those resources into an immutable in-memory metadata snapshot before it accepts traffic.&lt;/li&gt;
&lt;li&gt;Successful CRUD writes update Postgres first, then update the in-memory snapshot, invalidate any affected derived metadata such as zone transforms, and emit a &lt;code&gt;metadata_changes&lt;/code&gt; bus event.&lt;/li&gt;
&lt;li&gt;A background reconcile loop reloads durable metadata periodically and emits the same &lt;code&gt;metadata_changes&lt;/code&gt; notifications when it detects out-of-band create, update, or delete drift.&lt;/li&gt;
&lt;li&gt;Decision-critical ingest state is kept in process memory:
&lt;ul&gt;
&lt;li&gt;dedup windows&lt;/li&gt;
&lt;li&gt;latest provider-source locations&lt;/li&gt;
&lt;li&gt;latest trackable locations and WGS84 motions&lt;/li&gt;
&lt;li&gt;proximity hysteresis state&lt;/li&gt;
&lt;li&gt;fence membership state&lt;/li&gt;
&lt;li&gt;collision pair state&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="event-fan-out"&gt;Event Fan-Out&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;REST, MQTT, or WebSocket ingest enters the shared hub service.&lt;/li&gt;
&lt;li&gt;The hub validates, normalizes, deduplicates, and updates in-memory transient state on the ingest path.&lt;/li&gt;
&lt;li&gt;A buffered native-publication stage emits native location and motion events without blocking ingest on downstream fan-out.&lt;/li&gt;
&lt;li&gt;A second buffered decision stage is the insertion point for future filtered or smoothed track processing and currently drives alternate-CRS publication, geofence evaluation, and optional collision evaluation.&lt;/li&gt;
&lt;li&gt;MQTT and WebSocket consume the resulting internal event stream and publish transport-specific payloads in batches.&lt;/li&gt;
&lt;li&gt;When any non-critical queue fills, the hub drops newer work on that path rather than backpressuring raw ingest.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Implications:&lt;/p&gt;</description></item><item><title>Authentication and Authorization</title><link>https://openlocationstack.com/open-location-hub/docs/auth/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://openlocationstack.com/open-location-hub/docs/auth/</guid><description>&lt;p&gt;&lt;em&gt;This page is generated from the Open Location Hub source documentation and should not be edited in the website repository.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This project supports standards-based JWT bearer authentication for the REST API and an authorization model built around JWT claims plus a server-side permissions file.&lt;/p&gt;
&lt;p&gt;The same token verifier is also used for the OMLOX WebSocket surface, but WebSocket authentication happens per message through &lt;code&gt;params.token&lt;/code&gt; instead of the HTTP &lt;code&gt;Authorization&lt;/code&gt; header.&lt;/p&gt;</description></item><item><title>Configuration</title><link>https://openlocationstack.com/open-location-hub/docs/configuration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://openlocationstack.com/open-location-hub/docs/configuration/</guid><description>&lt;p&gt;&lt;em&gt;This page is generated from the Open Location Hub source documentation and should not be edited in the website repository.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;All runtime configuration is environment-driven.&lt;/p&gt;
&lt;p&gt;Runtime lifecycle behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the hub process runs from a single signal-aware root context created from &lt;code&gt;SIGINT&lt;/code&gt; and &lt;code&gt;SIGTERM&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;startup failures return structured process errors instead of panicking during early config or logger initialization&lt;/li&gt;
&lt;li&gt;graceful shutdown uses a bounded timeout so HTTP shutdown and internal event-publisher fan-out can complete deterministically after a stop signal&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="core"&gt;Core&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;HTTP_LISTEN_ADDR&lt;/code&gt; (default &lt;code&gt;:8080&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HTTP_REQUEST_BODY_LIMIT_BYTES&lt;/code&gt; (default &lt;code&gt;4194304&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;LOG_LEVEL&lt;/code&gt; (default &lt;code&gt;info&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HUB_ID&lt;/code&gt; (optional UUID bootstrap or reset value for the persisted hub identity)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HUB_LABEL&lt;/code&gt; (optional bootstrap or reset value for the persisted human-readable hub label)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;RESET_HUB_ID&lt;/code&gt; (&lt;code&gt;true&lt;/code&gt;/&lt;code&gt;false&lt;/code&gt;, default &lt;code&gt;false&lt;/code&gt;; when &lt;code&gt;true&lt;/code&gt;, overwrite stored hub metadata with explicitly supplied env values)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POSTGRES_URL&lt;/code&gt; (default &lt;code&gt;postgres://postgres:postgres@localhost:5432/openrtls?sslmode=disable&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;MQTT_BROKER_URL&lt;/code&gt; (default &lt;code&gt;tcp://localhost:1883&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WEBSOCKET_WRITE_TIMEOUT&lt;/code&gt; (duration, default &lt;code&gt;5s&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WEBSOCKET_READ_TIMEOUT&lt;/code&gt; (duration, default &lt;code&gt;1m&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WEBSOCKET_PING_INTERVAL&lt;/code&gt; (duration, default &lt;code&gt;30s&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WEBSOCKET_OUTBOUND_BUFFER&lt;/code&gt; (default &lt;code&gt;256&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EVENT_BUS_SUBSCRIBER_BUFFER&lt;/code&gt; (default &lt;code&gt;1024&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NATIVE_LOCATION_BUFFER&lt;/code&gt; (default &lt;code&gt;2048&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DERIVED_LOCATION_BUFFER&lt;/code&gt; (default &lt;code&gt;1024&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hub metadata bootstrap behavior:&lt;/p&gt;</description></item><item><title>Connector Guide: MQTT</title><link>https://openlocationstack.com/open-location-hub/docs/connectors-mqtt/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://openlocationstack.com/open-location-hub/docs/connectors-mqtt/</guid><description>&lt;p&gt;&lt;em&gt;This page is generated from the Open Location Hub source documentation and should not be edited in the website repository.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Use MQTT when your deployment already centers on a broker, when trusted edge
adapters naturally publish broker messages, or when broker-based routing fits
better than a long-lived WebSocket client connection.&lt;/p&gt;
&lt;p&gt;This repository ships a concrete MQTT connector example in
&lt;a href="https://github.com/Open-Location-Stack/open-location-hub/blob/main/connectors/gtfs/README.md"&gt;&lt;code&gt;connectors/gtfs/README.md&lt;/code&gt;&lt;/a&gt;.
The MQTT connector path is documented here against the hub&amp;rsquo;s implemented OMLOX
MQTT surface. Transport details live in
&lt;a href="https://github.com/Open-Location-Stack/open-location-hub/blob/main/specifications/omlox/mqtt.md"&gt;&lt;code&gt;specifications/omlox/mqtt.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Connector Guide: WebSocket</title><link>https://openlocationstack.com/open-location-hub/docs/connectors-websocket/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://openlocationstack.com/open-location-hub/docs/connectors-websocket/</guid><description>&lt;p&gt;&lt;em&gt;This page is generated from the Open Location Hub source documentation and should not be edited in the website repository.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Use WebSocket when you want the simplest connector path into the hub. It maps
well to the current bundled demos, it works cleanly with the hub&amp;rsquo;s auth model,
and it does not require you to design topic routing beyond the OMLOX WebSocket
topic names.&lt;/p&gt;
&lt;p&gt;The bundled connector demonstrators in this repository currently use this
approach:&lt;/p&gt;</description></item><item><title>Connectors</title><link>https://openlocationstack.com/open-location-hub/docs/connectors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://openlocationstack.com/open-location-hub/docs/connectors/</guid><description>&lt;p&gt;&lt;em&gt;This page is generated from the Open Location Hub source documentation and should not be edited in the website repository.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This repository keeps connectors outside the hub runtime. A connector is a
small process that reads data from some upstream system, maps that data to the
hub&amp;rsquo;s OMLOX-facing model, and submits it through the hub&amp;rsquo;s supported transport
surfaces.&lt;/p&gt;
&lt;p&gt;The key point is simple: creating a connector is easy. You do not need to patch
the hub. In most cases you only need:&lt;/p&gt;</description></item><item><title>Getting Started</title><link>https://openlocationstack.com/open-location-hub/docs/getting-started/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://openlocationstack.com/open-location-hub/docs/getting-started/</guid><description>&lt;p&gt;&lt;em&gt;This page is generated from the Open Location Hub source documentation and should not be edited in the website repository.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you want to try Open RTLS Hub on your laptop, start with the shared local
runtime in &lt;a href="https://github.com/Open-Location-Stack/open-location-hub/blob/main/local-hub"&gt;&lt;code&gt;local-hub/&lt;/code&gt;&lt;/a&gt;.
That setup brings up the hub, Postgres, Mosquitto, Dex, and a ready-to-use
observability stack so you can inspect what the hub is doing while you
experiment.&lt;/p&gt;
&lt;h2 id="fast-path"&gt;Fast Path&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Review &lt;a href="https://github.com/Open-Location-Stack/open-location-hub/blob/main/local-hub/README.md"&gt;&lt;code&gt;local-hub/README.md&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Start the stack:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local-hub/start_demo.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="3"&gt;
&lt;li&gt;If you need an auth token for manual calls or connector demos:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;local-hub/fetch_demo_token.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="4"&gt;
&lt;li&gt;Pick an example connector or continue with the docs below.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="what-this-setup-is-for"&gt;What This Setup Is For&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;local development and experimentation&lt;/li&gt;
&lt;li&gt;validating connector behavior against a real hub runtime&lt;/li&gt;
&lt;li&gt;inspecting OTLP telemetry during laptop demos and debugging&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This starter stack is not positioned as a production deployment recipe.&lt;/p&gt;</description></item><item><title>RPC Guide</title><link>https://openlocationstack.com/open-location-hub/docs/rpc/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://openlocationstack.com/open-location-hub/docs/rpc/</guid><description>&lt;p&gt;&lt;em&gt;This page is generated from the Open Location Hub source documentation and should not be edited in the website repository.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="what-rpc-is"&gt;What RPC is&lt;/h2&gt;
&lt;p&gt;RPC is the hub&amp;rsquo;s command and diagnostics interface.&lt;/p&gt;
&lt;p&gt;Use it when you need to ask the hub or a downstream RTLS device/controller to
do something right now. Examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;check whether the control path is alive&lt;/li&gt;
&lt;li&gt;identify a reachable handler&lt;/li&gt;
&lt;li&gt;send an OMLOX core command through the hub&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Do not use RPC for normal CRUD resource management. Use:&lt;/p&gt;</description></item></channel></rss>