<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pounce</title>
    <description>The latest articles on DEV Community by Pounce (@pounce_za_f19a8e5c4630000).</description>
    <link>https://dev.to/pounce_za_f19a8e5c4630000</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4208015%2F7d979686-499e-4b8e-9fcf-e74ab9edcb15.png</url>
      <title>DEV Community: Pounce</title>
      <link>https://dev.to/pounce_za_f19a8e5c4630000</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pounce_za_f19a8e5c4630000"/>
    <language>en</language>
    <item>
      <title>Licences behind a fictional-data map demo: MIT code, CC0 examples and CC BY place references</title>
      <dc:creator>Pounce</dc:creator>
      <pubDate>Sun, 01 Nov 2026 10:01:31 +0000</pubDate>
      <link>https://dev.to/pounce_za_f19a8e5c4630000/licences-behind-a-fictional-data-map-demo-mit-code-cc0-examples-and-cc-by-place-references-3hnl</link>
      <guid>https://dev.to/pounce_za_f19a8e5c4630000/licences-behind-a-fictional-data-map-demo-mit-code-cc0-examples-and-cc-by-place-references-3hnl</guid>
      <description>&lt;p&gt;Pounce Atlas is an open-source explorer for geographic datasets. Its demo data is fictional, but parts of it come from other sources with their own licences. This post separates those licences and gives attribution text you can reuse. It is information, not legal advice.&lt;/p&gt;

&lt;p&gt;Disclosure: AI assisted with drafting this post. Pounce prepared it from the repository's third-party notices and licence file.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Application code and documentation contributed to the repository: MIT licence.&lt;/li&gt;
&lt;li&gt;Invented business and venue attributes in the demo files: CC0 1.0.&lt;/li&gt;
&lt;li&gt;Place names and approximate centre coordinates from GeoNames: CC BY 4.0. Attribution is required.&lt;/li&gt;
&lt;li&gt;Boundary geometry for South Africa: derived from Natural Earth 1:10m admin-1 boundaries, simplified for display. Natural Earth map data is public domain.&lt;/li&gt;
&lt;li&gt;Interface font (Inter): SIL Open Font License 1.1.&lt;/li&gt;
&lt;li&gt;Three.js: MIT licence.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Attribution text you can reuse
&lt;/h2&gt;

&lt;p&gt;Place centres: GeoNames, CC BY 4.0. Selected South African place references associated with fictional example records; coordinates indicate approximate centres. Boundary geometry: Natural Earth, public domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the MIT licence does not cover
&lt;/h2&gt;

&lt;p&gt;The MIT licence does not relicense third-party assets, production data or trademarks. Pounce's name and marks are not licensed as trademarks by MIT, so do not imply endorsement or an affiliation that does not exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the fictional examples come from
&lt;/h2&gt;

&lt;p&gt;The two fixture files, public/data/demo.json and public/data/venues.json, contain invented business and venue names, attributes and events. Their town names and approximate centre coordinates come from a GeoNames South Africa extract downloaded on 21 October 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main dependencies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Three.js 0.186.1 (MIT)&lt;/li&gt;
&lt;li&gt;TypeScript 5.9.3 (Apache-2.0), used for build-time type checking&lt;/li&gt;
&lt;li&gt;Vite 6.4.4 (MIT), build tooling&lt;/li&gt;
&lt;li&gt;Playwright Test 1.62.1 (Apache-2.0), browser QA&lt;/li&gt;
&lt;li&gt;@axe-core/playwright 4.14.0 (MPL-2.0), accessibility QA&lt;/li&gt;
&lt;li&gt;Lighthouse 13.5.0 (Apache-2.0), performance and quality QA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The notices list all 194 locked npm entries in a machine-readable file, docs/dependency-licenses.json.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;Third-party notices: &lt;a href="https://github.com/zaiqltd/pounce-atlas/blob/main/THIRD-PARTY.md" rel="noopener noreferrer"&gt;https://github.com/zaiqltd/pounce-atlas/blob/main/THIRD-PARTY.md&lt;/a&gt;&lt;br&gt;
Licence file: &lt;a href="https://github.com/zaiqltd/pounce-atlas/blob/main/LICENSE" rel="noopener noreferrer"&gt;https://github.com/zaiqltd/pounce-atlas/blob/main/LICENSE&lt;/a&gt;&lt;br&gt;
Demo with fictional data: &lt;a href="https://pounce.co.za/atlas/" rel="noopener noreferrer"&gt;https://pounce.co.za/atlas/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>datascience</category>
      <category>webdev</category>
    </item>
    <item>
      <title>A static Three.js map app: the build and QA checks we run</title>
      <dc:creator>Pounce</dc:creator>
      <pubDate>Sun, 01 Nov 2026 09:56:43 +0000</pubDate>
      <link>https://dev.to/pounce_za_f19a8e5c4630000/a-static-threejs-map-app-the-build-and-qa-checks-we-run-1df2</link>
      <guid>https://dev.to/pounce_za_f19a8e5c4630000/a-static-threejs-map-app-the-build-and-qa-checks-we-run-1df2</guid>
      <description>&lt;p&gt;Pounce Atlas is an open-source explorer for geographic datasets. It is a static web app built with Three.js and TypeScript. This post describes the build and QA steps in the public repository, what each one covers, and what it cannot prove.&lt;/p&gt;

&lt;p&gt;Disclosure: AI assisted with drafting this post. Pounce reviewed it against the repository's package scripts and test files. The examples are fictional.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm run build&lt;/code&gt; runs TypeScript type checking with &lt;code&gt;tsc --noEmit&lt;/code&gt;, then a Vite production build. The project also defines release and private build modes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model tests
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm test&lt;/code&gt; runs Node's built-in test runner over the model tests in &lt;code&gt;tests/*.test.ts&lt;/code&gt;. They cover validation, CSV parsing, activity filters and share state. This suite is separate from the browser tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser tests
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm run test:e2e&lt;/code&gt; runs Playwright Test against &lt;code&gt;tests/browser/atlas.spec.ts&lt;/code&gt;. Examples of what those tests check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A CSV import stays local, escapes markup and disables data sharing.&lt;/li&gt;
&lt;li&gt;An invalid import keeps the existing dataset and explains the problem row.&lt;/li&gt;
&lt;li&gt;A WebGL failure leaves a working, accessible list.&lt;/li&gt;
&lt;li&gt;A failed dataset load recovers with another local fixture.&lt;/li&gt;
&lt;li&gt;A phone-sized layout does not overflow, and the detail sheet closes.&lt;/li&gt;
&lt;li&gt;The main view and the import dialog are checked with automated accessibility tests using axe-core.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some browser tests need a private dataset that is not distributed. They are skipped unless an environment flag is set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licences for the QA tools
&lt;/h2&gt;

&lt;p&gt;The repository's third-party notices list the QA tools and their licences: Playwright Test (Apache-2.0), @axe-core/playwright (MPL-2.0), and Lighthouse (Apache-2.0), which the notices describe as performance and quality QA tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What these checks cannot prove
&lt;/h2&gt;

&lt;p&gt;Passing tests show that the checked paths behave as the tests expect. They do not prove that a dataset is complete, that an address is correct, or that every browser and device works. Treat them as evidence for specific behaviour, not a guarantee.&lt;/p&gt;

&lt;p&gt;Repository: &lt;a href="https://github.com/zaiqltd/pounce-atlas" rel="noopener noreferrer"&gt;https://github.com/zaiqltd/pounce-atlas&lt;/a&gt;&lt;br&gt;
Browser test source: &lt;a href="https://github.com/zaiqltd/pounce-atlas/blob/main/tests/browser/atlas.spec.ts" rel="noopener noreferrer"&gt;https://github.com/zaiqltd/pounce-atlas/blob/main/tests/browser/atlas.spec.ts&lt;/a&gt;&lt;br&gt;
Demo with fictional data: &lt;a href="https://pounce.co.za/atlas/" rel="noopener noreferrer"&gt;https://pounce.co.za/atlas/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>testing</category>
    </item>
    <item>
      <title>What 21 model tests check in a static map explorer</title>
      <dc:creator>Pounce</dc:creator>
      <pubDate>Sun, 01 Nov 2026 09:56:07 +0000</pubDate>
      <link>https://dev.to/pounce_za_f19a8e5c4630000/what-21-model-tests-check-in-a-static-map-explorer-5hmp</link>
      <guid>https://dev.to/pounce_za_f19a8e5c4630000/what-21-model-tests-check-in-a-static-map-explorer-5hmp</guid>
      <description>&lt;p&gt;Pounce Atlas is an open-source explorer for geographic datasets. It runs as a static web app built with Three.js and TypeScript. Its data handling is covered by a Node test file with 21 test cases. This post lists what those tests check, and what they do not prove.&lt;/p&gt;

&lt;p&gt;Disclosure: AI assisted with drafting this post. Pounce reviewed it against the public source. The examples are fictional.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the tests run
&lt;/h2&gt;

&lt;p&gt;The project uses Node's built-in test runner. &lt;code&gt;npm test&lt;/code&gt; runs &lt;code&gt;node --experimental-strip-types --test tests/*.test.ts&lt;/code&gt;, so the model tests need no separate test framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  What they check
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Validation.&lt;/strong&gt; Bundled examples must validate as independent datasets. Invalid coordinates are rejected, including a latitude of 91, a boolean latitude, and coordinates supplied on only one side. A duplicate public ID fails before a dataset replaces the current one. An unsupported schema version or a missing name fails.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private fields.&lt;/strong&gt; Extra fields such as email or phone are stripped during validation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Unsafe input.&lt;/strong&gt; Website values with unsafe schemes, such as javascript: or data:, are rejected, and so are URLs with embedded credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dates.&lt;/strong&gt; Impossible calendar dates and malformed date strings fail. A future event must carry an announced status rather than occurred. Date stepping is tested to stay stable across month and year boundaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Map rules.&lt;/strong&gt; A province-only point is not drawn as an exact location. A record without coordinates stays usable in the Industries and list views. An exact map cluster never includes places with similar names.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Activity.&lt;/strong&gt; Activity date filters are inclusive. Records without events are not counted in activity totals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CSV import.&lt;/strong&gt; The parser handles quoted commas, escaped quotes and newlines. It flags an unterminated quote, a duplicate header and a ragged row. CSV imports do not invent coordinates or events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local file safety.&lt;/strong&gt; Imported file content is treated as text and is not evaluated. One test feeds in an HTML image tag with an onerror handler and checks that it stays plain text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share links.&lt;/strong&gt; Share state round-trips Unicode filters and selections without including a data payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the tests do not prove
&lt;/h2&gt;

&lt;p&gt;They check code paths. They do not show that any external dataset is complete, that a record's address is correct, or that an announced event later happened. The methodology explains what the app can and cannot claim: &lt;a href="https://github.com/zaiqltd/pounce-atlas/blob/main/docs/METHODOLOGY.md" rel="noopener noreferrer"&gt;https://github.com/zaiqltd/pounce-atlas/blob/main/docs/METHODOLOGY.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Test source: &lt;a href="https://github.com/zaiqltd/pounce-atlas/blob/main/tests/model.test.ts" rel="noopener noreferrer"&gt;https://github.com/zaiqltd/pounce-atlas/blob/main/tests/model.test.ts&lt;/a&gt;&lt;br&gt;
Demo with fictional data: &lt;a href="https://pounce.co.za/atlas/" rel="noopener noreferrer"&gt;https://pounce.co.za/atlas/&lt;/a&gt;&lt;br&gt;
Code licence: MIT.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>javascript</category>
      <category>testing</category>
    </item>
    <item>
      <title>An announcement isn’t an opening: separating event, observation and snapshot dates</title>
      <dc:creator>Pounce</dc:creator>
      <pubDate>Sun, 01 Nov 2026 09:34:46 +0000</pubDate>
      <link>https://dev.to/pounce_za_f19a8e5c4630000/an-announcement-isnt-an-opening-separating-event-observation-and-snapshot-dates-5199</link>
      <guid>https://dev.to/pounce_za_f19a8e5c4630000/an-announcement-isnt-an-opening-separating-event-observation-and-snapshot-dates-5199</guid>
      <description>&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; AI assisted the drafting of this article; Pounce reviewed it against the public Atlas source. Pounce builds &lt;a href="https://pounce.co.za/atlas/" rel="noopener noreferrer"&gt;Pounce Atlas&lt;/a&gt;, an open-source explorer for geographic datasets. Its examples are fictional, and its activity view describes only events recorded in the selected dataset.&lt;/p&gt;

&lt;p&gt;A map can make a date look more certain than the evidence behind it. A marker appears, a timeline gains an entry, and a reader may infer that a business opened or expanded on that day. But a dataset often carries several different clocks: when an event happened or is planned, when a record was checked, when a snapshot was generated, and the cutoff through which a source was considered. Collapsing those into one date turns evidence about the data into a claim about the world.&lt;/p&gt;

&lt;p&gt;Atlas keeps these meanings separate in its &lt;a href="https://github.com/zaiqltd/pounce-atlas/blob/main/docs/DATA-CONTRACT.md" rel="noopener noreferrer"&gt;public data contract&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four dates, four questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Event date (events[].date) asks: when is the described event dated?&lt;/strong&gt; It is an ISO calendar date for the event itself. The accompanying status says whether that event is occurred or announced. An announced opening scheduled for a future day is still an announcement, not a completed opening. Preserve that status instead of converting a plan into a fact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Record check date (checkedAt) asks: when was this record checked?&lt;/strong&gt; It is a record-level observation about review, not proof that every field was independently reverified. A recent check date does not move an older event forward in time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snapshot generation time (generatedAt) asks: when was this dataset file generated?&lt;/strong&gt; It describes the build of a particular snapshot. Regenerating a file can update this timestamp even when a record was not checked that day and no event occurred then.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source cutoff (sourceAsOf) asks: what source period does the dataset claim to cover?&lt;/strong&gt; It is a declared source cutoff, not a blanket assertion that all records were checked at the cutoff. The contract explicitly warns against that inference.&lt;/p&gt;

&lt;p&gt;There can be other dates too. A source page’s publication date, the first time a collector fetched it, and the first time a team noticed an event are not interchangeable with those four fields. If they matter, keep them distinct and define them. Do not silently substitute one for another.&lt;/p&gt;

&lt;h2&gt;
  
  
  A fictional example
&lt;/h2&gt;

&lt;p&gt;Imagine a clearly fictional business called &lt;strong&gt;Harbour Lantern Works&lt;/strong&gt;. A source note dated 18 October says it has announced a second workshop for 1 February next year. A researcher checks the record on 20 October. The dataset’s source cutoff is 25 October, and the file is generated on 26 October.&lt;/p&gt;

&lt;p&gt;A careful record could retain the planned event date as 1 February and set its status to announced; it could record checkedAt as 20 October, sourceAsOf as 25 October, and generatedAt as the actual snapshot-build timestamp on 26 October. The source note’s 18 October publication date remains separate if the dataset stores it. The company and dates here are invented to illustrate the schema, not claims about a real business.&lt;/p&gt;

&lt;p&gt;A reader should be able to tell that the item is a future plan reported in a snapshot, not evidence that the workshop is already open. If the source only says “early next year,” do not invent a precise day. The Atlas contract says to leave an uncertain event out of a precise dated timeline until it has been checked.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep geography and absence honest too
&lt;/h2&gt;

&lt;p&gt;An event has no coordinates in this schema. Its optional locationLabel is text for context; it does not locate the event at a company’s headquarters. The dataset may locate a record at town precision, but that is not an event coordinate or a verified street address. Don’t copy the record’s map point onto an event as if the event happened there.&lt;/p&gt;

&lt;p&gt;Likewise, an empty activity view has a narrow meaning. Atlas filters Activity to records with a matching event in the chosen range and filters. If no event matches, the result is “no matching event recorded in this selected snapshot and range.” It is not proof that nothing happened. The methodology notes that a quiet area can reflect incomplete collection, and that Map or Industries may still show records absent from Activity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the distinction executable
&lt;/h2&gt;

&lt;p&gt;The public validateDataset implementation checks event dates and statuses, and rejects a future event marked occurred. The model tests exercise invalid calendar dates, require a future event to be announced, and check that Activity date filters include matching dates while records without events do not enter Activity counts. I ran npm test in the public source checkout for this article: &lt;strong&gt;21 tests passed, 0 failed&lt;/strong&gt;. That is evidence about the checked code paths, not proof that any external dataset is complete or that an announced event later occurred.&lt;/p&gt;

&lt;p&gt;The lesson is simple: event time describes the event; check time describes observation; generation time describes the file; and source cutoff describes the declared coverage boundary. Keep those clocks visible, carry announced through the interface, and treat no match as a limit of the selected data rather than a claim about reality.&lt;/p&gt;

&lt;p&gt;Explore the &lt;a href="https://pounce.co.za/atlas/" rel="noopener noreferrer"&gt;live Pounce Atlas demo&lt;/a&gt; using its fictional examples, or inspect the &lt;a href="https://github.com/zaiqltd/pounce-atlas" rel="noopener noreferrer"&gt;MIT-licensed application source&lt;/a&gt;, &lt;a href="https://github.com/zaiqltd/pounce-atlas/blob/main/docs/DATA-CONTRACT.md" rel="noopener noreferrer"&gt;data contract&lt;/a&gt;, &lt;a href="https://github.com/zaiqltd/pounce-atlas/blob/main/docs/METHODOLOGY.md" rel="noopener noreferrer"&gt;methodology&lt;/a&gt;, and &lt;a href="https://github.com/zaiqltd/pounce-atlas/blob/main/tests/model.test.ts" rel="noopener noreferrer"&gt;model tests&lt;/a&gt;. Application code is MIT licensed; data and map/font assets have separate notices.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>datascience</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
