<?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: Peter Haller</title>
    <description>The latest articles on DEV Community by Peter Haller (@phaller222).</description>
    <link>https://dev.to/phaller222</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%2F4055674%2F335eeb7c-1e5d-4db2-97ca-3504fb0d2539.jpg</url>
      <title>DEV Community: Peter Haller</title>
      <link>https://dev.to/phaller222</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/phaller222"/>
    <language>en</language>
    <item>
      <title>Scan a sticker, start the clock: NFC + MQTT as first-class citizens of a task tracker</title>
      <dc:creator>Peter Haller</dc:creator>
      <pubDate>Thu, 30 Jul 2026 21:13:38 +0000</pubDate>
      <link>https://dev.to/phaller222/scan-a-sticker-start-the-clock-nfc-mqtt-as-first-class-citizens-of-a-task-tracker-4ka7</link>
      <guid>https://dev.to/phaller222/scan-a-sticker-start-the-clock-nfc-mqtt-as-first-class-citizens-of-a-task-tracker-4ka7</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — &lt;a href="https://github.com/phaller222/Prioritize" rel="noopener noreferrer"&gt;Prioritize&lt;/a&gt; is a self-hostable Spring Boot platform for organizing people, devices, and work. Its twist: &lt;strong&gt;NFC tags and MQTT sensors are first-class domain objects&lt;/strong&gt;, not bolted-on integrations. Bind a tag to a task, tap it, and the task's time tracking starts — over a single REST call. &lt;code&gt;docker compose up&lt;/code&gt; and you're running. Built for the self-hosted / homelab / maker crowd.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The friction nobody mentions
&lt;/h2&gt;

&lt;p&gt;Time tracking and status updates don't fail because the software is bad. They fail because of one more thing: one more app to open, one more login, one more context switch. On a shop floor, at a workbench, in a lab or a makerspace, that little bit of friction is enough that it just… doesn't happen. The timesheet gets reconstructed from memory on Friday, and everyone knows how accurate &lt;em&gt;that&lt;/em&gt; is.&lt;/p&gt;

&lt;p&gt;So what if the trigger were physical? Tap a sticker on the machine you're working on, and the clock starts. Tap it again when you walk away, and it stops — session saved.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9mn24sp70hpxqy3cz7uh.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9mn24sp70hpxqy3cz7uh.gif" alt="Example app using Prioritize" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's a real recording. Both taps in it are genuine REST calls against a running instance — nothing faked.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: NFC and MQTT as first-class citizens
&lt;/h2&gt;

&lt;p&gt;Most project tools treat the physical world as an afterthought. You get there through an integrations page, a webhook, a Zapier zap glued onto the side.&lt;/p&gt;

&lt;p&gt;Prioritize is built the other way around. An &lt;strong&gt;NFC tag&lt;/strong&gt; and an &lt;strong&gt;MQTT sensor&lt;/strong&gt; are domain objects that live right next to your projects, tasks, resources, and skills:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;TIMETRACKER tag&lt;/strong&gt; is bound to a task; scanning it toggles that task's clock.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;resource&lt;/strong&gt; (a machine, a sensor) can register itself over MQTT and stream telemetry.&lt;/li&gt;
&lt;li&gt;A telemetry &lt;strong&gt;state rule&lt;/strong&gt; (e.g. temperature crosses a threshold → &lt;code&gt;ALARM&lt;/code&gt;) can fire without any glue code.&lt;/li&gt;
&lt;li&gt;Skills exist for &lt;strong&gt;people and devices&lt;/strong&gt; alike — because on a shop floor, "who/what can do this" applies to both.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The physical world isn't an integration. It's part of the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happens on a scan
&lt;/h2&gt;

&lt;p&gt;A scan is one REST call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/v1/nfc/scan/{uuid}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;For a &lt;code&gt;TIMETRACKER&lt;/code&gt; tag, that toggles the bound task's time tracking — start on the first tap, stop on the next — and the completed work session is saved automatically. Here it is with &lt;code&gt;curl&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8080/api/v1/nfc/scan/TT-9F3A-01 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-u&lt;/span&gt; admin:p@ssword
&lt;span class="c"&gt;# -&amp;gt; { "uuid": "TT-9F3A-01", "type": "TIMETRACKER",&lt;/span&gt;
&lt;span class="c"&gt;#      "action": "TRACKING_STARTED", "taskId": 42, "tracking": true }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now the honest part, because this is exactly the question a self-hoster asks next:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Prioritize is the backend — you bring the reader.&lt;/strong&gt; A scan is just that one REST call. Whatever reads the tag and &lt;em&gt;fires&lt;/em&gt; it — an NFC-capable phone app, a fixed reader at a workstation, an ESP32 or a Raspberry Pi, or a three-line shell script — is up to you. Prioritize provides the endpoint (and can broadcast every scan over MQTT so other systems can react); it does not ship a reader app.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's the whole contract. If you can make an HTTP POST, you can wire up a physical trigger.&lt;/p&gt;
&lt;h2&gt;
  
  
  Beyond the tap
&lt;/h2&gt;

&lt;p&gt;The NFC trick is the fun part, but it sits on a real platform:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MQTT telemetry&lt;/strong&gt; with state-transition rules and alarms — sensors self-register and stream values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BPMN orchestration&lt;/strong&gt; via &lt;a href="https://www.flowable.org/" rel="noopener noreferrer"&gt;Flowable&lt;/a&gt; — model &lt;em&gt;order, waiting, and responsibility&lt;/em&gt; across tasks and devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recurring (cron) task schedules&lt;/strong&gt; — spawn tasks on a cadence.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documents with versioning&lt;/strong&gt;, org/role/permission management, and skills for people and resources.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;REST API throughout&lt;/strong&gt; (OpenAPI/Swagger) plus a &lt;strong&gt;Vaadin admin GUI&lt;/strong&gt; for the org, resource, document, skill, scheduling and process subsystems.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Run it yourself in one command
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That gives you the app plus PostgreSQL. Want zero dependencies? The standalone image runs on an embedded H2 database with no external services at all. MQTT and Keycloak are opt-in profiles. The admin GUI and Swagger UI are up as soon as the container is.&lt;/p&gt;
&lt;h2&gt;
  
  
  Where it fits (and where it doesn't)
&lt;/h2&gt;

&lt;p&gt;Prioritize is a &lt;strong&gt;platform&lt;/strong&gt;, not a turnkey vertical app. It's a good fit if you're self-hosting and want projects, devices, and physical triggers to live in one honest, REST-driven model — maintenance, labs, workshops, makerspaces, small-industry setups. It's &lt;em&gt;not&lt;/em&gt; trying to out-feature a dedicated PM SaaS; the point is the interlock between work and the physical world.&lt;/p&gt;
&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;Would you tap a sticker to start your timer? And if you had a "physical trigger for anything" endpoint sitting in your homelab — what would &lt;em&gt;you&lt;/em&gt; wire it to? A 3D printer finishing a job? A lab freezer? The coffee machine? I'd genuinely like to hear it in the comments.&lt;/p&gt;

&lt;p&gt;If the idea resonates, a ⭐ on the repo helps more people find it:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/phaller222" rel="noopener noreferrer"&gt;
        phaller222
      &lt;/a&gt; / &lt;a href="https://github.com/phaller222/Prioritize" rel="noopener noreferrer"&gt;
        Prioritize
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      IoT-ready, neutral platform for project &amp;amp; resource management with NFC, MQTT and BPMN process orchestration (Flowable) — Spring Boot REST backend + Vaadin admin GUI.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Prioritize&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Open-source framework for organizing companies, employees, devices (IoT), and their tasks — Spring Boot 4 / Java 21.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Find the right people — and things — for the right job.&lt;/strong&gt; Prioritize models organizational structures (companies, departments, users, roles), manages documents with versioning, represents skills for people &lt;strong&gt;and&lt;/strong&gt; devices, controls IoT resources over MQTT and REST, and organizes work as projects, tasks and goals with NFC-driven time tracking. It exposes a REST API throughout, against which arbitrary clients can be built.&lt;/p&gt;




&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Status&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Released and self-hostable — a Spring Boot platform you can get running in one command (see &lt;a href="https://github.com/phaller222/Prioritize#quickstart" rel="noopener noreferrer"&gt;Quickstart&lt;/a&gt;). The runnable Spring Boot core covers: company/user management, documents with versioning, skills for people and devices, resource control (MQTT/REST), telemetry state-transition rules, recurring (cron) task schedules, BPMN orchestration via Flowable, and the &lt;strong&gt;project subsystem&lt;/strong&gt; — projects, blackboards, tasks, goal-driven progress, task time tracking, and NFC tags as physical triggers (including…&lt;/p&gt;&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/phaller222/Prioritize" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


</description>
      <category>opensource</category>
      <category>selfhosted</category>
      <category>iot</category>
      <category>springboot</category>
    </item>
  </channel>
</rss>
