Skip to content

Add support for writing RFID tags#156

Open
Lemmons wants to merge 6 commits into
paxx12-snapmaker-u1:developfrom
Lemmons:feature/rfid-ui-1.0
Open

Add support for writing RFID tags#156
Lemmons wants to merge 6 commits into
paxx12-snapmaker-u1:developfrom
Lemmons:feature/rfid-ui-1.0

Conversation

@Lemmons
Copy link
Copy Markdown

@Lemmons Lemmons commented Jan 19, 2026

Web ui and apis runs as part of moonraker, accessible at http://{u1-hostname/ip}/rfid. Includes all rfid fields supported in v1.0.0. Also adds new new GCODE commands to support the web UI functionality. The web UI also contains an export and import tag functionality for ease of cloning/backing up tags, etc.

UI General Look

image image image image

Empty and Missing Tag support

Properly shows when a tag is empty or has an error vs missing.
image
image

Mobile Browser Support

Also renders and works well on a mobile browser.
RFID Tag Manager - Snapmaker U1

Snapmaker Native Tags

Native Snapmaker filament tags are support for reading, but not writing or erasing. The UI prevents submitting, and the api also rejects requests to modify them.

@paxx12
Copy link
Copy Markdown
Contributor

paxx12 commented Jan 20, 2026

That is crazy :) I'm currently on holidays will review this in a few days, as there's a number of changes.

How you also intend to guide user to write both sides of spool?

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Jan 20, 2026

That is crazy :) I'm currently on holidays will review this in a few days, as there's a number of changes.

How you also intend to guide user to write both sides of spool?

I have been thinking about that. Currently I'm thinking to do the "simple" thing and have a prompt for the user to confirm/dismiss any time they write a tag saying they should update the other side as well. That will also likely necessitate adding a "clone" functionality of some sort. That being said, I'd prefer to add those in as a separate pr, and focus on getting these changes in (with your feedback on what is here now), as the pr already is pretty large.

FILAMENT_DT_CONFIG_FILE = "filament_detect.json"

+# Material density defaults (g/cm³) for tag writing
+MATERIAL_DENSITIES = {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

what about mathicing Orca's material list here:
https://github.com/OrcaSlicer/OrcaSlicer/blob/b93112c67431d2cb962f2b6b7ad21fb13989119e/src/libslic3r/MaterialType.cpp#L92

But in all honesty, considering the variety of offerings on the market, locking the materials to a list might fall short pretty quickly

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are defaults only, the user writing the tag will always be able to specify whatever they want, but pulling in a more extensive table isn't a bad idea either.

@Cass67
Copy link
Copy Markdown

Cass67 commented Jan 22, 2026

I have been thinking about that. Currently I'm thinking to do the "simple" thing and have a prompt for the user to confirm/dismiss any time they write a tag saying they should update the other side as well. That will also likely necessitate adding a "clone" functionality of some sort. That being said, I'd prefer to add those in as a separate pr, and focus on getting these changes in (with your feedback on what is here now), as the pr already is pretty large.

As a V1 of this feature which looks great btw .. Id imagine anyone, like me, would not find dealing with a prompt a hardship at all. Way easier than messing around with phone apps. wrt to clone would be nice to have a list of saved tags to select from, simple json file written to the fs when a new tag is created. Hope this makes it in, excited :D ...

@unlucio
Copy link
Copy Markdown

unlucio commented Jan 22, 2026

Way easier than messing around with phone apps.

This is more about one's personal process than anything. For instance, I add spools to my spoolman instance as I buy them, when they come in, I already have the 2 tags ready and just stick them ont the spool, and I'm done with it. For me is an easier and smoother process than having to flip the spool on the printer just to tag it.
That said, I can def see the value of this app, and having the option.
Would I activate it on my printer? Yes,
Would I use it to write my tags? Probably not much more than sporadically, but it's always good to have an option.

<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RFID Tag Manager - Snapmaker U1</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@simonwep/pickr/dist/themes/nano.min.css">
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I love the feature! I would recommend to put the two external css and js files locally on the printer to be able to use it in offline environments

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Jan 23, 2026

Way easier than messing around with phone apps.

This is more about one's personal process than anything. For instance, I add spools to my spoolman instance as I buy them, when they come in, I already have the 2 tags ready and just stick them ont the spool, and I'm done with it. For me is an easier and smoother process than having to flip the spool on the printer just to tag it. That said, I can def see the value of this app, and having the option. Would I activate it on my printer? Yes, Would I use it to write my tags? Probably not much more than sporadically, but it's always good to have an option.

Yeah, there are three things I wanted to accomplish with this. First was to get filament write support in general into the firmware, as it unlocks a lot more than just a web ui. Second was I wanted to get more rfid data into the firmware at an accessible place (like the uid) as that also unlocks more automation potential (such as spoolman integration for snapmaker native rfid tags). The web ui was more a of convenience feature for me than anything else, as it makes iteration quicker, since I don't need to be at the printer to update tags, and since I have an iphone, there isn't (yet) a dedicated way to write openspool tags. I've used generic tag writing apps on iphone, but so far I haven't found one that I like.

The important thing to me is to make it easier to use rfid tags, and to make them more useful in general. Whatever changes are made, they shouldn't force somebody into a particular workflow, but should hopefully make that workflow easier at some point.

@unlucio
Copy link
Copy Markdown

unlucio commented Jan 23, 2026

Snapmaker filaments "integration" and tracking in spoolman is potentially done here: https://github.com/unlucio/SnapmakerU1-Extended-Firmware/blob/spoolman/docs/spoolman.md#properly-tagged-spools

if/when this PR will land #163 I indeed plan to integrate it wiht your code to allow further automations for those that want them.

PS: since there are quite a few people working on the material topic, I invited you to a chat in Discord about it.

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Jan 24, 2026

Snapmaker filaments "integration" and tracking in spoolman is potentially done here: https://github.com/unlucio/SnapmakerU1-Extended-Firmware/blob/spoolman/docs/spoolman.md#properly-tagged-spools

if/when this PR will land #163 I indeed plan to integrate it wiht your code to allow further automations for those that want them.

PS: since there are quite a few people working on the material topic, I invited you to a chat in Discord about it.

Thanks, we should definitely coordinate on an overall plan for this, so we don't all just keep doing the same work over and over again.

@kman3d
Copy link
Copy Markdown

kman3d commented Jan 24, 2026

All of this sounds fantastic. Is there a way to write to the tag the "used filament amount" for tracking purpose?

@Cass67
Copy link
Copy Markdown

Cass67 commented Jan 24, 2026

Way easier than messing around with phone apps.

This is more about one's personal process than anything. For instance, I add spools to my spoolman instance as I buy them, when they come in, I already have the 2 tags ready and just stick them ont the spool, and I'm done with it. For me is an easier and smoother process than having to flip the spool on the printer just to tag it. That said, I can def see the value of this app, and having the option. Would I activate it on my printer? Yes, Would I use it to write my tags? Probably not much more than sporadically, but it's always good to have an option.

Yah fair enough, I'm coming in cold and don't have a process nailed yet. Feels like it should be easier :)

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Jan 25, 2026

All of this sounds fantastic. Is there a way to write to the tag the "used filament amount" for tracking purpose?

@kman3d, There is separate filament tracking support a few of the community are working on right now. Because there are nominally two tags per filament spool, its not so simple as writing the amount of used filament to the tag. Its not to say that wouldn't necessarily be useful information to have on it, but it cannot be the sole source of truth. Anyway, regardless of "how", I do expect to see some decent filament tracking coming before too long

@unlucio
Copy link
Copy Markdown

unlucio commented Jan 26, 2026

All of this sounds fantastic. Is there a way to write to the tag the "used filament amount" for tracking purpose?

It can get quite unreliable pretty quickly. The only case it doesn't get unreliable is if you never move the spool from its holder (or at least the same side) from when it's new to when it's finished, and most of all: you never use it on other printers

@paxx12 paxx12 added the nfc Set of features related to NFC and RFID tags label Jan 31, 2026
@paxx12
Copy link
Copy Markdown
Contributor

paxx12 commented Feb 4, 2026

@Lemmons The idea is great.

I would do the following changes:

  • overlays/firmware-extended/13-rfid-support/patches/03-add-ntag-write-support.patch can stay
  • introduce new component filament_tag.py (maybe like this since all your current commands are FILAMENT_TAG_*) that will add a commands to write the tags and call fm175xx_reader.py methods
  • The moonraker component is completely not needed
  • The web should add nginx/fluidd.d/ alias with location to index
  • The web should call moonraker websocket and communicate over existing API

As for the UI

  • Instead of adding interface at the bottom, I would instead add buttons that would show the modals for RFID operations: Create (if channel empty), Update (if existing) and Erase (if existing).
  • I would also rename Channel to Extruder.

This also means that UI would parse the Snapmaker U1 internal data structures. But I think this is fine, as we really then introduce pretty much web app.

Please take a look also at the: #236.

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Feb 4, 2026

@paxx12 Awesome. Thanks. I'll see if I can get those changes made in the next day or two.

@paxx12 paxx12 added the enhancement New feature or request label Feb 15, 2026
@Lemmons Lemmons force-pushed the feature/rfid-ui-1.0 branch from dc330c3 to 4db586d Compare February 16, 2026 14:32
@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Feb 16, 2026

@paxx12 I had to do a pretty major rework of it, but I believe I have incorporated the changes requested. I'll post some new screenshots before too long of what the new ui looks like.

@paxx12
Copy link
Copy Markdown
Contributor

paxx12 commented Feb 16, 2026

@Lemmons Awesome

@github-actions
Copy link
Copy Markdown

✅ Build Artifacts

Version: 1.1.1-paxx12-test-pr-156
Build: d8a51be (merge of 4db586d into develop)
Duration: 4m 38s

Artifact Size
basic-build 205.31 MB
extended-build 240.76 MB
basic-devel-build 205.72 MB
extended-devel-build 241.17 MB

View workflow run

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Feb 16, 2026

@paxx12 I updated the pr description with the updated screenshots. There are still a few rough edges (such as the code currently not being able to tell the difference between an empty tag and an invalid/corrupted tag), but I think we can deal with those later.

@paxx12
Copy link
Copy Markdown
Contributor

paxx12 commented Feb 16, 2026

@Lemmons we need to think how to connect those also with @suchmememanyskill changes. I think probably gcode macro should be enough. I will for sure make amendments. I will think about that.

@github-actions
Copy link
Copy Markdown

✅ Build Artifacts

Version: 1.1.1-paxx12-test-pr-156
Build: a6d5bca (merge of 9bf69c7 into develop)
Duration: 5m 10s

Artifact Size
basic-build 205.31 MB
extended-build 240.76 MB
basic-devel-build 205.72 MB
extended-devel-build 241.17 MB

View workflow run

@suchmememanyskill
Copy link
Copy Markdown
Contributor

Yeah, adding in the gcode should be enough. Although currently my filament detection system cannot write. Can see if i can implement that.

@paxx12
Copy link
Copy Markdown
Contributor

paxx12 commented Feb 16, 2026

@Lemmons I'm thinking that the best would be to drop all special handling of OpenSpool from firmware, just expose raw command to write data to tag. So, make html/js to generate valid payload, but call: FILAMENT_TAG_WRITE CHANNEL=N DATA=HEXENCODED.

I have my own ndef.js encoder in here: https://github.com/paxx12/PrintTag-Web/blob/main/public/ndef.js.

@github-actions
Copy link
Copy Markdown

✅ Build Artifacts

Version: 1.1.1-paxx12-test-pr-156
Build: bb3e6d4 (merge of 0cf73fa into develop)
Duration: 5m 9s

Artifact Size
basic-build 205.31 MB
extended-build 240.76 MB
basic-devel-build 205.72 MB
extended-devel-build 241.17 MB

View workflow run

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Feb 16, 2026

@Lemmons I'm thinking that the best would be to drop all special handling of OpenSpool from firmware, just expose raw command to write data to tag. So, make html/js to generate valid payload, but call: FILAMENT_TAG_WRITE CHANNEL=N DATA=HEXENCODED.

I have my own ndef.js encoder in here: https://github.com/paxx12/PrintTag-Web/blob/main/public/ndef.js.

That sounds reasonable. Would make it a bit more flexible to any tag type.

@github-actions
Copy link
Copy Markdown

✅ Build Artifacts

Version: 1.1.1-paxx12-test-pr-156
Build: 4eaa273 (merge of 2e417e0 into develop)
Duration: 5m 43s

Artifact Size
basic-build 205.31 MB
extended-build 240.76 MB
basic-devel-build 205.72 MB
extended-devel-build 241.17 MB

View workflow run

@github-actions
Copy link
Copy Markdown

✅ Build Artifacts

Version: 1.1.1-paxx12-test-pr-156
Build: 33432b7 (merge of 8bb8526 into develop)
Duration: 5m 13s

Artifact Size
basic-build 205.31 MB
extended-build 240.76 MB
basic-devel-build 205.72 MB
extended-devel-build 241.17 MB

View workflow run

@Lemmons Lemmons force-pushed the feature/rfid-ui-1.0 branch from 8bb8526 to 1137955 Compare February 18, 2026 04:37
@github-actions
Copy link
Copy Markdown

✅ Build Artifacts

Version: 1.1.1-paxx12-test-pr-156
Build: 57adf4f (merge of 1137955 into develop)
Duration: 5m 20s

Artifact Size
basic-build 205.31 MB
extended-build 240.76 MB
basic-devel-build 205.72 MB
extended-devel-build 241.17 MB

View workflow run

error, records, card_uid, cc_bytes = ndef_parse(data_buf)

# Expected NTAG215 CC: E1 10 3F 00 (NDEF magic, v1.0, 504 bytes, read/write)
# Expected NTAG216 CC: E1 10 6D 00 (NDEF magic, v1.0, 872 bytes, read/write)
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

other parts of the code don't support ntag216, but it won't hurt anything here.

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Feb 18, 2026

@paxx12 I think this is read for review, if you don't have any other changes you'd like to see

@github-actions
Copy link
Copy Markdown

✅ Build Artifacts

Version: 1.1.1-paxx12-test-pr-156
Build: 1c59476 (merge of d4be507 into develop)
Duration: 5m 22s

Artifact Size
basic-build 205.31 MB
extended-build 240.77 MB
basic-devel-build 205.72 MB
extended-devel-build 241.17 MB

View workflow run

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Feb 18, 2026

one item of potential discussion, I used urlsafe base64 encoding for the raw tag data payload in the gcode command, but I'd be find changing it to HEX, this is more of a "technically its more efficient during transmission" decisions which was unneeded.

Copy link
Copy Markdown
Contributor

@paxx12 paxx12 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have some initial questions. I did not yet run this myself to test exactly how it behaves.

Random thought:

This is very interesting project, it just asks if it has to be part of this repo, or could it be managed externally.

I'm starting to think if this would not be better suited to be connected with filament-detect together and built to provide its own interface and actually provide the UI for that project.

This way both, would be treated as external dependency.

cc @suchmememanyskill

@@ -0,0 +1,26 @@
Including: home/lava/klipper/klippy/extras/filament_detect.py
--- rootfs.original/home/lava/klipper/klippy/extras/filament_detect.py 2026-01-19 20:46:51.443456566 +0000
+++ rootfs/home/lava/klipper/klippy/extras/filament_detect.py 2026-02-08 22:00:00.000000000 +0000
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems it would be better to merge this change with prior patch, since this now creates patches that has to run in a specific sequence.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, I wasn't sure what the preference was for these sort of changes, but I'm fine with that.

# NTAG tag write/erase operations
# Provides gcode commands for writing and erasing NTAG filament tags

[filament_tag]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would likely add this as a klipper tweak, feature that has to be explicitly enabled.

if len(data) > 12 and data[0] != 0xE1:
for i in range(min(16, len(data) - 4)):
if data[i] == 0xE1 and (data[i+1] == 0x10 or data[i+1] == 0x11 or data[i+1] == 0x40):
if (data[i] & 0xE1) == 0xE1 and (data[i+1] & 0x10) == 0x10:
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems that only this change is required in this file? Correct as this improved ndef parsing? Can we drop all rest of changes? Can we put this change in separate commit?

def _ensure_cc_bytes(self, channel, info):
"""Ensure CC bytes (page 3) are correct for an NTAG tag.

CC is OTP (One-Time Programmable): hardware performs new = old | written,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Interesting. Forbid my ignorance, but can we erase the tag to write it next without performing this form of re-detect?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah. This is mainly just to make sure that the CC bits are set to the expected values, and raise a warning if not. My understanding is that they should generally be set to the correct values by the manufacturer, but I haven't had a chance to go through and look at it in too much detail. When I was initially playing around with writing tags I corrupted the CC bits of a few of them, which lead me down a bit of a rabbit hole. A bit of the CC between both extras files can likely be cleaned up a bit, but likely a decent amount of it can be cleaned up, or regulated to more generic warning logs rather than method outputs, etc.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

definitely doesn't need to be done when erasing/rewriting an existing good tag.

<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>RFID Tag Manager - Snapmaker U1</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@simonwep/pickr/dist/themes/nano.min.css">
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would really want to avoid external dependencies. Is this required? Or can we generate a minimal CSS?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is just the color picker. The native color picker doesn't have transparency support, and I wanted to be able to support a color picker with transparency. It would not be too difficult to just write a color picker with transparency support ourselves though.

@@ -0,0 +1,164 @@
<!DOCTYPE html>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Lemmons I think we need to test this after enabling the Web Authentication. Can you take a look at auth.js use in firmware-config and remote-screen to read, inject bearer token and show when the authentication required?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. Auth actually is one my specialties😅

Comment thread .gitmodules
[submodule "deps/screen-apps"]
path = deps/screen-apps
url = https://github.com/paxx12/screen-apps.git
[submodule "deps/PrintTag-Web"]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm still debating with myself about submodules or cache_git.sh.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Personally, I really don't like submodules, but usually when I've used them it's in large, complex repos, where they wreak havoc. Here I'm happy to do whatever.

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Feb 23, 2026

I have some initial questions. I did not yet run this myself to test exactly how it behaves.

Random thought:

This is very interesting project, it just asks if it has to be part of this repo, or could it be managed externally.

I'm starting to think if this would not be better suited to be connected with filament-detect together and built to provide its own interface and actually provide the UI for that project.

This way both, would be treated as external dependency.

cc @suchmememanyskill

Yeah, the further along it has gotten, I'm starting to think the same. That said, I don't know how much more time I can realistically put into it. With that though, I want to see it in front of people and making the filament tagging ecosystem better, so for that reason alone I'd really like to see it to some form of completion.

@suchmememanyskill should I pivot this to support your filament_detect project instead? I could first port the tag writing logic over, and then we could put the UI as a front end for the project?

kbaker827 pushed a commit to kbaker827/SnapmakerU1-Extended-Firmware that referenced this pull request Mar 4, 2026
- Replace unversioned CDN links for Pickr with pinned local copies
  (v1.9.1 with SHA256 verification via cache_file.sh) so the UI works
  fully offline and builds are reproducible.

- Switch PrintTag-Web from a git submodule to cache_git.sh at a pinned
  SHA (2e2d831), matching the pattern used by every other third-party
  dependency in this repo and removing the need to init submodules.

- Add auth.js (shared from 99-remote-screen) to the rfid-manager page;
  fetch a Moonraker oneshot token before opening the WebSocket so the
  UI works correctly when force_logins is enabled.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@nuclearmistake
Copy link
Copy Markdown

nuclearmistake commented Apr 23, 2026

I've been building with and running this on my local hackjob branch and it's fantastic.

Trying to write during a print will crash the printer currently. Needs this in 2 places in filament_tag.py to prevent arithmetic with None inside get_status

         print_stats = self.printer.lookup_object('print_stats', None)
-        if print_stats and print_stats.get_status(None).get('state') == 'printing':
+        if print_stats and print_stats.get_status(self.reactor.monotonic()).get('state') == 'printing':

@convicte
Copy link
Copy Markdown

It would be fantastic to have this incorporated, since no matter how many different aproaches I've tested each is lacking across usability, spoolman integration, tag operability with U1, etc.

I don't see currently any pipeline that allows both filament quantity tracking, tag read and write as well as U1 tag reliable pickup.

@Lemmons
Copy link
Copy Markdown
Author

Lemmons commented Apr 23, 2026

I've ran out of time to push this forward. I'd be happy if anyone wanted to take it over and get it over the finish line.

@paxx12
Copy link
Copy Markdown
Contributor

paxx12 commented May 10, 2026

I did rebase this on top of develop.

@github-actions
Copy link
Copy Markdown

✅ Build Artifacts

Version: 1.3.0-paxx12-test-pr-156
Build: 57a1c58 (merge of 83fc480 into develop)
Duration: 3m 57s

Artifact Size
extended-devel-build 217.86 MB
extended-build 217.45 MB

View workflow run

Lemmons and others added 4 commits May 10, 2026 17:18
* Includes GCODE and a webui for tag management

update readme

a few more doc updates

DRY out default density definitions

They still are defined in the javascript as well as python, but at least now its only once in the python code

Improve `RFID` troubleshooting steps (paxx12-snapmaker-u1#289)

Update ntag writing support to use a urlsafe base64 encoded binary blob of raw data

This will allow the write command to support various different data formats.

remove file header

remove unneeded extra uid parse logic

Correctly handle CC bytes

Warn if the bytes look off and aren't correctable.

use cc values from filament_tag.py
…lors`

Replaces the flat `color_hex`/`color2`-`color5` fields with `first_color`
(a hex string) and `additional_colors` (an array of hex strings). The array
is built from `RGB_2`–`RGB_5` sliced to `COLOR_NUMS - 1` entries, so the
tag's declared color count is respected. All consumers (rendering,
`populateWriteForm`, export) are updated accordingly.
@paxx12 paxx12 force-pushed the feature/rfid-ui-1.0 branch from 83fc480 to ab62fda Compare May 10, 2026 15:19
@github-actions
Copy link
Copy Markdown

✅ Build Artifacts

Version: 1.3.0-paxx12-test-pr-156
Build: 8c229a4 (merge of ab62fda into develop)
Duration: 3m 57s

Artifact Size
extended-devel-build 217.86 MB
extended-build 217.45 MB

View workflow run

@github-actions
Copy link
Copy Markdown

✅ Build Artifacts

Version: 1.3.0-paxx12-test-pr-156
Build: 5295782 (merge of 4975633 into develop)
Duration: 3m 47s

Artifact Size
extended-devel-build 217.86 MB
extended-build 217.45 MB

View workflow run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request nfc Set of features related to NFC and RFID tags

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants