<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Data for Canada – Blog</title><link>https://www.dataforcanada.org/blog/</link><description>Recent content in Blog on Data for Canada</description><generator>Hugo -- gohugo.io</generator><language>en</language><atom:link href="https://www.dataforcanada.org/blog/index.xml" rel="self" type="application/rss+xml"/><item><title>Deployed S3 Interface and S3 Browser UI</title><link>https://www.dataforcanada.org/blog/2026/deployed-s3-and-browser-ui/</link><pubDate>Sun, 03 May 2026 14:30:00 -0400</pubDate><guid>https://www.dataforcanada.org/blog/2026/deployed-s3-and-browser-ui/</guid><description>
&lt;p>A core part of the mission here at Data for Canada is modernizing how we access, store, and interact with public datasets. Today, we are excited to announce a step forward in our infrastructure with the deployment of a new S3-compatible API and a companion web-based explorer.&lt;/p>
&lt;p>These two tools are designed to serve both programmatic workflows and everyday discovery.&lt;/p>
&lt;h2>1. The Programmatic S3 Interface&lt;span class="hx:absolute hx:-mt-20" id="1-the-programmatic-s3-interface">&lt;/span>
&lt;a href="#1-the-programmatic-s3-interface" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;a href="https://github.com/developmentseed/multistore/"target="_blank" rel="noopener">developmentseed/multistore&lt;/a> has been successfully deployed to &lt;a href="https://s3.dataforcanada.org/"target="_blank" rel="noopener">https://s3.dataforcanada.org/&lt;/a>.&lt;/p>
&lt;p>For data pipelines and cloud-native workflows, standard access protocols are everything. Multistore provides a robust S3-compatible interface, allowing developers, researchers, and data engineers to interact with our hosted datasets using familiar S3 tools and libraries. Whether you are automating data pipelines, querying cloud-optimized formats directly over the network, or syncing large datasets, this endpoint ensures that data retrieval is fast, scalable, and standardized.&lt;/p>
&lt;div role="img" aria-label="Diagram">
&lt;pre class="mermaid hx:mt-6">
flowchart TD
Client([&amp;#34;🌐 S3 Client / User&amp;#34;])
Gateway[&amp;#34;&amp;lt;b&amp;gt;s3.dataforcanada.org&amp;lt;/b&amp;gt;\nS3-Compatible Gateway&amp;#34;]
Client --&amp;gt;|&amp;#34;S3 API Request&amp;#34;| Gateway
Gateway --&amp;gt;|&amp;#34;sourcecooperative bucket&amp;#34;| AWS
Gateway --&amp;gt;|&amp;#34;backblaze-ca-east-006 bucket&amp;#34;| BB
Gateway --&amp;gt;|&amp;#34;cloudflare-apac bucket&amp;#34;| CFAPAC
Gateway --&amp;gt;|&amp;#34;cloudflare-enam bucket&amp;#34;| CFENAM
Gateway --&amp;gt;|&amp;#34;tigris bucket&amp;#34;| TIGRIS
subgraph AWS [&amp;#34;☁️ Amazon Web Services&amp;#34;]
AWSNode[&amp;#34;📍 Oregon, United States&amp;#34;]
end
subgraph BB [&amp;#34;🔵 Backblaze B2&amp;#34;]
BBNode[&amp;#34;📍 Toronto, ON, Canada&amp;#34;]
end
subgraph CFAPAC [&amp;#34;🟠 Cloudflare R2&amp;#34;]
CFAPACNode[&amp;#34;📍 Asia Pacific Region&amp;#34;]
end
subgraph CFENAM [&amp;#34;🟠 Cloudflare R2&amp;#34;]
CFENAMNode[&amp;#34;📍 Eastern North America&amp;#34;]
end
subgraph TIGRIS [&amp;#34;⚡ Tigris Data&amp;#34;]
TIGRISNode[&amp;#34;11 Regions Worldwide 🌍\nAuto-routes to nearest location\nfor lowest latency&amp;#34;]
end
style Gateway fill:#1a5f7a,color:#fff,stroke:#0d3d52
style Client fill:#2d6a4f,color:#fff,stroke:#1b4332
style AWSNode fill:#ff9900,color:#000,stroke:#cc7a00
style BBNode fill:#e03c31,color:#fff,stroke:#b02d24
style CFAPACNode fill:#f6821f,color:#fff,stroke:#c4681a
style CFENAMNode fill:#f6821f,color:#fff,stroke:#c4681a
style TIGRISNode fill:#6c3483,color:#fff,stroke:#512e6b
&lt;/pre>
&lt;/div>&lt;h2>2. The S3 Browser UI&lt;span class="hx:absolute hx:-mt-20" id="2-the-s3-browser-ui">&lt;/span>
&lt;a href="#2-the-s3-browser-ui" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>To complement the API, we have also deployed &lt;a href="https://github.com/walkthru-earth/objex"target="_blank" rel="noopener">walkthru-earth/objex&lt;/a> to &lt;a href="https://objex.labs.dataforcanada.org/"target="_blank" rel="noopener">https://objex.labs.dataforcanada.org/&lt;/a>.&lt;/p>
&lt;p>While an S3 API is perfect for code, sometimes you just need to look around. Objex provides a lightweight, clean, and intuitive web interface for browsing our storage buckets. This allows anyone to navigate through directory structures, discover what files are available, and download data directly from their browser—no command-line tools or specialized software required.&lt;/p>
&lt;h3>Supported Formats&lt;span class="hx:absolute hx:-mt-20" id="supported-formats">&lt;/span>
&lt;a href="#supported-formats" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h3>&lt;p>As of May 3, 2026, objex supports over 100 file formats.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Category&lt;/th>
&lt;th>Formats&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Tabular&lt;/td>
&lt;td>Parquet, CSV, TSV, JSONL, NDJSON&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Geo vector&lt;/td>
&lt;td>GeoParquet, GeoJSON, Shapefile, GeoPackage, FlatGeobuf&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Geo raster&lt;/td>
&lt;td>COG, PMTiles, Zarr v2/v3, GeoZarr&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Geo catalog&lt;/td>
&lt;td>STAC Item / Collection / Catalog / FeatureCollection (JSON), stac-geoparquet&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Point cloud&lt;/td>
&lt;td>COPC, LAZ, LAS&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Notebooks&lt;/td>
&lt;td>Jupyter (.ipynb), marimo&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Code&lt;/td>
&lt;td>30+ languages (Python, TS, Rust, Go, SQL&amp;hellip;)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Documents&lt;/td>
&lt;td>Markdown, PDF, text, logs&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Media&lt;/td>
&lt;td>Images, video, audio&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>3D&lt;/td>
&lt;td>GLB, glTF, OBJ, STL, FBX&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Archives&lt;/td>
&lt;td>ZIP, TAR, GZ, 7Z, RAR&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Database&lt;/td>
&lt;td>DuckDB, SQLite&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2>What’s Next?&lt;span class="hx:absolute hx:-mt-20" id="whats-next">&lt;/span>
&lt;a href="#whats-next" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>By pairing a standardized S3 API with a human-readable explorer, we are bridging the gap between heavy-duty engineering requirements and general public accessibility.&lt;/p>
&lt;p>Take a look around the new explorer, test out the S3 endpoint in your workflows, and stay tuned for more updates as we continue to build out the Data for Canada infrastructure!&lt;/p></description></item><item><title>Deployed an Open Sensor Environmental Station Using Raspberry Pi and Enviro+</title><link>https://www.dataforcanada.org/blog/2026/deployed-static-opensensor-environmental-monitoring-sensor/</link><pubDate>Wed, 22 Apr 2026 10:00:00 -0400</pubDate><guid>https://www.dataforcanada.org/blog/2026/deployed-static-opensensor-environmental-monitoring-sensor/</guid><description>
&lt;p>I recently deployed a static environmental monitoring station that contributes readings to the &lt;a href="https://opensensor.space"target="_blank" rel="noopener">Open Sensor&lt;/a> network. This is a quick post describing what the station is, how it is built, and where you can access the data it produces.&lt;/p>
&lt;h2>1. What is Open Sensor?&lt;span class="hx:absolute hx:-mt-20" id="1-what-is-open-sensor">&lt;/span>
&lt;a href="#1-what-is-open-sensor" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;a href="https://opensensor.space"target="_blank" rel="noopener">Open Sensor&lt;/a> is a community-run network of low-cost environmental sensors. Each station publishes its readings in an open and efficient file format so that anyone can use them. You can read more about how the network is designed on the &lt;a href="https://opensensor.space/architecture/"target="_blank" rel="noopener">architecture page&lt;/a>.&lt;/p>
&lt;h2>2. Hardware&lt;span class="hx:absolute hx:-mt-20" id="2-hardware">&lt;/span>
&lt;a href="#2-hardware" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The station follows Open Sensor&amp;rsquo;s reference build, which is documented under &lt;a href="https://opensensor.space/join-network/#1-hardware-requirements"target="_blank" rel="noopener">hardware requirements&lt;/a>. At a high level, it consists of:&lt;/p>
&lt;ul>
&lt;li>A &lt;strong>Raspberry Pi Zero 2 W&lt;/strong> as the host computer.&lt;/li>
&lt;li>A &lt;strong>Pimoroni Enviro+&lt;/strong> HAT, which provides sensors for temperature, humidity, pressure, light, noise, and air quality (gas and particulate matter when paired with a PMS5003).&lt;/li>
&lt;/ul>
&lt;p>Once the hardware was assembled, the Pi was flashed with the Raspberry Pi OS Lite image, and the &lt;a href="https://github.com/walkthru-earth/opensensor-enviroplus"target="_blank" rel="noopener">OpenSensor Enviroplus&lt;/a> was installed and configured to upload data to Source Cooperative.&lt;/p>
&lt;p>&lt;img src="https://www.dataforcanada.org/blog/2026/deployed-static-opensensor-environmental-monitoring-sensor/d4c-opensensor-01.webp" alt="d4c-opensensor-01" loading="lazy" />&lt;/p>
&lt;h2>3. Data&lt;span class="hx:absolute hx:-mt-20" id="3-data">&lt;/span>
&lt;a href="#3-data" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The station is registered on the network with the identifier &lt;a href="https://opensensor.space/Stations/019d97ff-3220-74fc-8923-f9fb69e2273d/"target="_blank" rel="noopener">&lt;code>019d97ff-3220-74fc-8923-f9fb69e2273d&lt;/code>&lt;/a>. The publicly listed location for this station is set to the &lt;a href="https://en.wikipedia.org/wiki/Central_Experimental_Farm"target="_blank" rel="noopener">Central Experimental Farm&lt;/a> rather than my actual deployment site; I did not want to give away my home location, and the Experimental Farm happens to be one of my favourite places in Ottawa. Once I move locations, I will retroactively update the station location.&lt;/p>
&lt;p>Two datasets are archived on &lt;a href="https://source.coop"target="_blank" rel="noopener">Source Cooperative&lt;/a> under the &lt;a href="https://source.coop/dataforcanada/d4c-datapkg-environment-climate-health"target="_blank" rel="noopener">&lt;code>d4c-datapkg-environment-climate-health&lt;/code>&lt;/a> data package:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Sensor readings&lt;/strong> (temperature, humidity, pressure, gas, particulates, etc.):&lt;br>
&lt;a href="https://source.coop/dataforcanada/d4c-datapkg-environment-climate-health/archive/opensensor.space/enviroplus/station=019d97ff-3220-74fc-8923-f9fb69e2273d"target="_blank" rel="noopener">&lt;code>archive/opensensor.space/enviroplus/station=019d97ff-3220-74fc-8923-f9fb69e2273d&lt;/code>&lt;/a>&lt;/li>
&lt;li>&lt;strong>Station health metrics&lt;/strong> (CPU temperature, uptime, memory, etc.):&lt;br>
&lt;a href="https://source.coop/dataforcanada/d4c-datapkg-environment-climate-health/archive/opensensor.space/enviroplus-health/station=019d97ff-3220-74fc-8923-f9fb69e2273d"target="_blank" rel="noopener">&lt;code>archive/opensensor.space/enviroplus-health/station=019d97ff-3220-74fc-8923-f9fb69e2273d&lt;/code>&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>Both datasets are partitioned by station, which makes it straightforward to query only this station with tools such as DuckDB, or to combine it with other stations in the network. The query below gathers the last 12 hours of readings and plots the temperature as a line graph.&lt;/p>
&lt;div class="hextra-code-block hx:relative hx:mt-6 hx:first:mt-0 hx:group/code">
&lt;div>&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">duckdb&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">seaborn&lt;/span> &lt;span class="k">as&lt;/span> &lt;span class="nn">sns&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sns&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">set_theme&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">con&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">duckdb&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">connect&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">con&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">install_extension&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;httpfs&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">con&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">load_extension&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;httpfs&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Last 12 hours of readings&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">con&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">sql&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> SELECT *
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> FROM read_parquet(
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> &amp;#39;s3://us-west-2.opendata.source.coop/dataforcanada/d4c-datapkg-environment-climate-health/archive/opensensor.space/enviroplus/station=019d97ff-3220-74fc-8923-f9fb69e2273d/**/*.parquet&amp;#39;,
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> hive_partitioning = true
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> )
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> WHERE timestamp &amp;gt;= now() - INTERVAL 12 HOUR
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2"> ORDER BY timestamp DESC;
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">result_df&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">df&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">result_df&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Quick Plot on temperature across time&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">sns&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">lineplot&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">data&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">result_df&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">x&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;timestamp&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">y&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s1">&amp;#39;temperature&amp;#39;&lt;/span>&lt;span class="p">)&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;/div>&lt;div class="hextra-code-copy-btn-container hx:opacity-0 hx:transition hx:group-hover/code:opacity-100 hx:flex hx:gap-1 hx:absolute hx:m-[11px] hx:right-0 hx:top-0">
&lt;button
class="hextra-code-copy-btn hx:group/copybtn hx:cursor-pointer hx:transition-all hx:active:opacity-50 hx:bg-primary-700/5 hx:border hx:border-black/5 hx:text-gray-600 hx:hover:text-gray-900 hx:rounded-md hx:p-1.5 hx:dark:bg-primary-300/10 hx:dark:border-white/10 hx:dark:text-gray-400 hx:dark:hover:text-gray-50"
title="Copy code"
aria-label="Copy code"
data-copied-label="Copied!"
>
&lt;div class="hextra-copy-icon hx:group-[.copied]/copybtn:hidden hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;div class="hextra-success-icon hx:hidden hx:group-[.copied]/copybtn:block hx:pointer-events-none hx:h-4 hx:w-4">&lt;/div>
&lt;/button>
&lt;/div>
&lt;/div>
&lt;h2>4. The Future: Scalable Environmental Governance&lt;span class="hx:absolute hx:-mt-20" id="4-the-future-scalable-environmental-governance">&lt;/span>
&lt;a href="#4-the-future-scalable-environmental-governance" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>The real value lies in scaling this into a high-density network to support &lt;strong>governance&lt;/strong>, bridging the gap between urban and rural environments. Because these sensors are portable and low-cost, they can be deployed across diverse landscapes to drive &lt;strong>intelligent decision-making&lt;/strong> and policy:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Urban:&lt;/strong> Driving real-time traffic signal adjustments, dynamic speed limits, and pollution-aware routing.&lt;/li>
&lt;li>&lt;strong>Rural &amp;amp; Wilderness:&lt;/strong> Monitoring cross-border air pollution, wildfire smoke drift, and micro-climate changes in protected natural areas.&lt;/li>
&lt;/ul>
&lt;p>I’ve already purchased a second station to take into the field. By syncing both the Pi and my phone to the same time server (NTP), I can join the air quality readings with my phone&amp;rsquo;s GPS track using timestamps. This turns future hikes into mobile environmental surveys, mapping the environment one trail at a time.&lt;/p>
&lt;h2>5. Join the Network&lt;span class="hx:absolute hx:-mt-20" id="5-join-the-network">&lt;/span>
&lt;a href="#5-join-the-network" class="subheading-anchor" aria-label="Permalink for this section">&lt;/a>&lt;/h2>&lt;p>&lt;a href="https://opensensor.space/join-network/"target="_blank" rel="noopener">Join the network&lt;/a>, it is super easy, it took me less than 2 hours to get everything working.&lt;/p>
&lt;p>&lt;img src="https://www.dataforcanada.org/blog/2026/deployed-static-opensensor-environmental-monitoring-sensor/opensensor-network-growing.webp" alt="d4c-opensensor-01" loading="lazy" />&lt;/p></description></item></channel></rss>