From 2783110d3450e4f846caafce562a87ad246f4585 Mon Sep 17 00:00:00 2001 From: Mitch Davis Date: Tue, 1 Sep 2026 12:51:43 -0400 Subject: [PATCH 01/10] Shifted memory addresses forward 8 bytes Eating up unused space after changing barcode from 16 to 6 bytes. Intentionally left 2 bytes buffer after barcode to keep other data points byte-aligned in 4-byte chunks --- _data/spec.json | 448 ++++++++++++++++++++++++++---------------------- 1 file changed, 245 insertions(+), 203 deletions(-) diff --git a/_data/spec.json b/_data/spec.json index 6a06f9b..9da3547 100644 --- a/_data/spec.json +++ b/_data/spec.json @@ -1,8 +1,8 @@ { - "version": "1.003", + "version": "a2.000", "mime_type": "application/opentag3d", "core": { - "address_range": { "start": "0x00", "end": "0x6F" }, + "address_range": { "start": "0x00", "end": "0xDF" }, "fields": [ { "name": "Tag Version", @@ -49,7 +49,7 @@ "added": "1.000", "unit": "string", "type": "utf8", - "start": "0x1B", + "start": "0x0C", "length": 16, "usage": "display", "examples": ["Example Brand", "Polar Filament"], @@ -62,7 +62,7 @@ "added": "1.000", "unit": "string", "type": "utf8", - "start": "0x2B", + "start": "0x1C", "length": 32, "usage": "display", "examples": ["Orange", "White", "Blue", "Electric Watermelon"], @@ -74,7 +74,7 @@ "added": "1.000", "unit": "RGBA", "type": "rgba", - "start": "0x4B", + "start": "0x3C", "length": 4, "usage": "display", "examples": [[255, 166, 77, 255]], @@ -87,7 +87,7 @@ "added": "1.000", "unit": "RGBA", "type": "rgba", - "start": "0x50", + "start": "0x40", "length": 4, "usage": "display", "examples": [[0, 0, 0, 0]], @@ -99,7 +99,7 @@ "added": "1.000", "unit": "RGBA", "type": "rgba", - "start": "0x54", + "start": "0x44", "length": 4, "usage": "display", "examples": [[0, 0, 0, 0]], @@ -111,46 +111,113 @@ "added": "1.000", "unit": "RGBA", "type": "rgba", - "start": "0x58", + "start": "0x48", "length": 4, "usage": "display", "examples": [[0, 0, 0, 0]], "description": "Fourth filament color, if the filament is multi-color. Set to transparent black if the filament is tri color." }, { - "name": "Target Diameter", + "name": "Serial Number / Batch ID", + "id": "serial", + "added": "1.000", + "type": "utf8", + "start": "0x4C", + "length": 32, + "usage": "inventory", + "examples": ["1234-ABCD", "2024-01-23-1234"], + "description": "Manufacturer's identifier for a spool batch or serial number." + }, + { + "name": "SKU", + "id": "sku", + "added": "2.000", + "type": "utf8", + "start": "0x6C", + "length": 16, + "usage": "inventory", + "description": "Product SKU for the material and color." + }, + { + "name": "Barcode", + "id": "barcode", + "added": "2.000", + "type": "int", + "start": "0x7C", + "length": 6, + "usage": "inventory", + "description": "The barcode number for the spool. This can be UPC12, UPC13, GS1/GTIN. (Recommended: UPC13)" + }, + { + "name": "Manufacture Date", + "id": "mfg_date", + "added": "1.000", + "unit": "YYYY,MM,DD", + "type": "date", + "start": "0x84", + "length": 4, + "usage": "inventory", + "examples": [[2024, 1, 23]], + "description": "Stored as 2 bytes for year, then 1 byte for month and 1 byte for day." + }, + { + "name": "Manufacture Time", + "id": "mfg_time", + "added": "1.000", + "unit": "UTC hh:mm:ss", + "type": "time", + "start": "0x88", + "length": 3, + "usage": "inventory", + "examples": [[10, 30, 45]], + "description": "Stored as 1 byte each for hour, minute, and second in 24-hour UTC." + }, + { + "name": "Filament Diameter", "id": "diameter", "added": "1.000", "unit": "mm", "type": "int", - "start": "0x5C", + "start": "0x8C", "length": 2, "usage": "operational", "scaling": 0.001, "examples": [1750, 2850], "required": true, - "description": "Filament diameter (target) in µm (micrometers). Eg `1750` → `1.750mm`." + "description": "Filament (target) diameter in µm (micrometers). Eg `1750` → `1.750mm`." }, { - "name": "Target Weight", - "id": "weight", + "name": "Measured Tolerance", + "id": "tolerance", "added": "1.000", - "unit": "g", + "unit": "µm", "type": "int", - "start": "0x5E", - "length": 2, + "start": "0x8E", + "length": 1, "usage": "operational", - "examples": [1000, 5000, 750], - "required": true, - "description": "Filament weight in grams, excluding spool weight. This is the TARGET weight (e.g., 1kg). Actual measured weight is stored in a different field." + "examples": [20, 55], + "description": "Measured tolerance in µm (micrometers)." }, { - "name": "Print Temperature", + "name": "Minimum Nozzle Diameter", + "id": "nozzle_diameter", + "added": "2.000", + "unit": "mm", + "type": "int", + "start": "0x8F", + "length": 1, + "usage": "operational", + "scaling": "0.1", + "examples": [2, 4, 6], + "description": "Minimum nozzle diameter in mm (millimeters) with an implied decimal point. Eg `2` → `0.2mm`" + }, + { + "name": "Target Print Temperature", "id": "print_temp", "added": "1.000", "unit": "ºC", "type": "int", - "start": "0x60", + "start": "0x90", "length": 1, "usage": "operational", "scaling": 5, @@ -159,184 +226,197 @@ "description": "Recommended print temperature in degrees Celsius, divided by 5. For example, `42` = `210°C`." }, { - "name": "Bed Temperature", - "id": "bed_temp", + "name": "Minimum Print Temperature", + "id": "min_print_temp", "added": "1.000", "unit": "ºC", "type": "int", - "start": "0x61", + "start": "0x91", "length": 1, "usage": "operational", "scaling": 5, - "examples": [12, 16], - "required": true, - "description": "Recommended bed temperature in degrees Celsius, divided by 5. For example, `12` = `60°C`." + "examples": [38], + "description": "Minimum nozzle temperature, divided by 5. For example, `38` = `190ºC`." }, { - "name": "Density", - "id": "density", + "name": "Maximum Print Temperature", + "id": "max_print_temp", "added": "1.000", - "unit": "g/cm³", + "unit": "ºC", "type": "int", - "start": "0x62", - "length": 2, + "start": "0x92", + "length": 1, "usage": "operational", - "scaling": 0.001, - "examples": [1240, 3900], + "scaling": 5, + "examples": [45], + "description": "Maximum nozzle temperature, divided by 5." + }, + { + "name": "Target Bed Temperature", + "id": "bed_temp", + "added": "1.000", + "unit": "ºC", + "type": "int", + "start": "0x94", + "length": 1, + "usage": "operational", + "scaling": 5, + "examples": [12, 16], "required": true, - "description": "Filament density in µg (micrograms) per cubic centimeter. Eg `1240` → `1.240g/cm³`. (Recommendations: 1.24 for PLA, 1.07 for ABS, 1.27 for PETG)" + "description": "Recommended bed temperature in degrees Celsius, divided by 5. For example, `12` = `60°C`." }, { - "name": "Transmission Distance (TD)", - "id": "td", + "name": "Minimum Bed Temperature", + "id": "min_bed_temp", "added": "1.000", - "unit": "mm", + "unit": "ºC", "type": "int", - "start": "0x64", - "length": 2, + "start": "0x95", + "length": 1, "usage": "operational", - "scaling": 0.1, - "examples": [118], - "description": "Opaque thickness in tens of millimeters Eg. `118` → `11.8`." - } - ] - }, - "extended": { - "address_range": { "start": "0x70", "end": "0xBA" }, - "fields": [ + "scaling": 5, + "examples": [8], + "description": "Minimum bed temperature, divided by 5. For example, `8` = `40ºC`." + }, { - "name": "Online Data URL", - "id": "data_url", + "name": "Maximum Bed Temperature", + "id": "max_bed_temp", "added": "1.000", - "unit": "string", - "type": "ascii", - "start": "0x70", - "length": 32, + "unit": "ºC", + "type": "int", + "start": "0x96", + "length": 1, "usage": "operational", - "examples": ["pfil.us?i=8078-RQSR"], - "description": "URL to access online JSON additional parameters. Formatted without `https` to save space." + "scaling": 5, + "examples": [12], + "description": "Maximum bed temperature, divided by 5." }, { - "name": "Serial Number / Batch ID", - "id": "serial", + "name": "Target Chamber Temperature", + "id": "chamber_temp", "added": "1.000", - "type": "utf8", - "start": "0x90", - "length": 16, - "usage": "display", - "examples": ["1234-ABCD", "2024-01-23-1234"], - "description": "Manufacturer's identifier for a spool batch or serial number." + "unit": "ºC", + "type": "int", + "start": "0x97", + "length": 1, + "usage": "operational", + "scaling": 5, + "examples": [12, 16], + "required": true, + "description": "Recommended chamber temperature in degrees Celsius, divided by 5. For example, `12` = `60°C`." }, { - "name": "Manufacture Date", - "id": "mfg_date", + "name": "Target Volumetric Speed", + "id": "target_vso", "added": "1.000", - "unit": "YYYY,MM,DD", - "type": "date", - "start": "0xA0", - "length": 4, - "usage": "display", - "examples": [[2024, 1, 23]], - "description": "Stored as 2 bytes for year, then 1 byte for month and 1 byte for day." + "unit": "mm³/s", + "type": "int", + "start": "0x98", + "length": 1, + "usage": "operational", + "examples": [80], + "description": "Default recommended speed." }, { - "name": "Manufacture Time", - "id": "mfg_time", + "name": "Minimum Volumetric Speed", + "id": "min_vso", "added": "1.000", - "unit": "UTC hh:mm:ss", - "type": "time", - "start": "0xA4", - "length": 3, - "usage": "display", - "examples": [[10, 30, 45]], - "description": "Stored as 1 byte each for hour, minute, and second in 24-hour UTC." + "unit": "mm³/s", + "type": "int", + "start": "0x99", + "length": 1, + "usage": "operational", + "examples": [20], + "description": "Mininum speed recommendation." }, { - "name": "Spool Core Diameter", - "id": "spool_core_diameter", + "name": "Maximum Volumetric Speed", + "id": "max_vso", "added": "1.000", - "unit": "mm", + "unit": "mm³/s", "type": "int", - "start": "0xA7", + "start": "0x9A", "length": 1, "usage": "operational", - "examples": [100, 80], - "description": "Core diameter in mm (millimeters)." + "examples": [120], + "description": "Maximum safe speed." }, { - "name": "MFI Temp", - "id": "mfi_temp", + "name": "Maximum Dry Temperature", + "id": "max_dry_temp", "added": "1.000", "unit": "ºC", "type": "int", - "start": "0xA8", + "start": "0x9C", "length": 1, "usage": "operational", "scaling": 5, - "examples": [210], - "description": "MFI test temperature, divided by 5. For example, `42` = `210ºC`." + "examples": [10, 11], + "description": "Maximum safe drying temperature, divided by 5." }, { - "name": "MFI Load", - "id": "mfi_load", + "name": "Dry Time", + "id": "dry_time", "added": "1.000", - "unit": "g", + "unit": "hr", "type": "int", - "start": "0xA9", + "start": "0x9D", "length": 1, "usage": "operational", - "scaling": 10, - "examples": [216], - "description": "MFI test load grams, divided by 10. For example, `216` = `2.16kg`." + "examples": [4, 8, 12], + "description": "Recommended drying time." }, { - "name": "MFI Value", - "id": "mfi_value", + "name": "Transmission Distance (TD)", + "id": "td", "added": "1.000", - "unit": "g/10min", + "unit": "mm", "type": "int", - "start": "0xAA", + "start": "0x9E", "length": 1, "usage": "operational", - "scaling": 10, - "examples": [63], - "description": "MFI value, divided by 10." + "scaling": 0.1, + "examples": [118], + "description": "Opaque thickness in tens of millimeters Eg. `118` → `11.8`." }, { - "name": "Measured Tolerance", - "id": "tolerance", + "name": "Density", + "id": "density", "added": "1.000", - "unit": "µm", + "unit": "g/cm³", "type": "int", - "start": "0xAB", - "length": 1, + "start": "0xA0", + "length": 2, "usage": "operational", - "examples": [20, 55], - "description": "Measured tolerance in µm (micrometers)." + "scaling": 0.001, + "examples": [1240, 3900], + "required": true, + "description": "Filament density in µg (micrograms) per cubic centimeter. Eg `1240` → `1.240g/cm³`. (Recommendations: 1.24 for PLA, 1.07 for ABS, 1.27 for PETG)" }, { - "name": "Empty Spool Weight", - "id": "empty_spool_weight", + "name": "Target Weight", + "id": "weight", "added": "1.000", "unit": "g", "type": "int", - "start": "0xAC", + "start": "0xA2", "length": 2, "usage": "operational", - "examples": [105], - "description": "Weight of empty spool in grams." + "examples": [1000, 5000, 750], + "required": true, + "description": "Filament weight in grams, excluding spool weight. This is the TARGET weight (e.g., 1kg). Actual measured weight is stored in a different field." }, { - "name": "Measured Filament Weight", - "id": "measured_weight", + "name": "Empty Spool Weight", + "id": "empty_spool_weight", "added": "1.000", "unit": "g", "type": "int", - "start": "0xAE", + "start": "0xA4", "length": 2, "usage": "operational", - "examples": [1002], - "description": "Weight of filament only." + "examples": [105], + "description": "Weight of empty spool in grams." }, { "name": "Measured Filament Length", @@ -344,124 +424,86 @@ "added": "1.000", "unit": "m", "type": "int", - "start": "0xB0", + "start": "0xA6", "length": 2, "usage": "operational", "examples": [336], "description": "Length in meters." }, { - "name": "Max Dry Temp", - "id": "max_dry_temp", - "added": "1.000", - "unit": "ºC", - "type": "int", - "start": "0xB2", - "length": 1, - "usage": "operational", - "scaling": 5, - "examples": [10, 11], - "description": "Max safe drying temp, divided by 5." - }, - { - "name": "Dry Time", - "id": "dry_time", + "name": "Measured Filament Weight", + "id": "measured_weight", "added": "1.000", - "unit": "hr", + "unit": "g", "type": "int", - "start": "0xB3", - "length": 1, + "start": "0xA8", + "length": 2, "usage": "operational", - "examples": [4, 8, 12], - "description": "Recommended drying time." + "examples": [1002], + "description": "Weight of filament only. This should be the actual measurement taken" }, { - "name": "Min Print Temp", - "id": "min_print_temp", + "name": "Spool Core Diameter", + "id": "spool_core_diameter", "added": "1.000", - "unit": "ºC", + "unit": "mm", "type": "int", - "start": "0xB4", + "start": "0xAA", "length": 1, "usage": "operational", - "scaling": 5, - "examples": [38], - "description": "Minimum nozzle temp, divided by 5. For example, `38` = `190ºC`." + "examples": [100, 80], + "description": "Core diameter in mm (millimeters)." }, { - "name": "Max Print Temp", - "id": "max_print_temp", + "name": "MFI Temp", + "id": "mfi_temp", "added": "1.000", "unit": "ºC", "type": "int", - "start": "0xB5", + "start": "0xAC", "length": 1, "usage": "operational", "scaling": 5, - "examples": [45], - "description": "Maximum nozzle temp, divided by 5." + "examples": [210], + "description": "MFI test temperature, divided by 5. For example, `42` = `210ºC`." }, { - "name": "Min Bed Temp", - "id": "min_bed_temp", + "name": "MFI Load", + "id": "mfi_load", "added": "1.000", - "unit": "ºC", + "unit": "g", "type": "int", - "start": "0xB6", + "start": "0xAD", "length": 1, "usage": "operational", - "scaling": 5, - "examples": [8], - "description": "Minimum bed temp, divided by 5. For example, `8` = `40ºC`." + "scaling": 10, + "examples": [216], + "description": "MFI test load grams, divided by 10. For example, `216` = `2.16kg`." }, { - "name": "Max Bed Temp", - "id": "max_bed_temp", + "name": "MFI Value", + "id": "mfi_value", "added": "1.000", - "unit": "ºC", + "unit": "g/10min", "type": "int", - "start": "0xB7", + "start": "0xAE", "length": 1, "usage": "operational", - "scaling": 5, - "examples": [12], - "description": "Maximum bed temp, divided by 5." + "scaling": 10, + "examples": [63], + "description": "MFI value, divided by 10." }, { - "name": "Min Volumetric Speed", - "id": "min_vso", + "name": "Online Data URL", + "id": "data_url", "added": "1.000", - "unit": "mm³/s", - "type": "int", + "unit": "string", + "type": "ascii", "start": "0xB8", - "length": 1, - "usage": "operational", - "examples": [20], - "description": "Min speed recommendation." - }, - { - "name": "Max Volumetric Speed", - "id": "max_vso", - "added": "1.000", - "unit": "mm³/s", - "type": "int", - "start": "0xB9", - "length": 1, - "usage": "operational", - "examples": [120], - "description": "Max safe speed." - }, - { - "name": "Target Volumetric Speed", - "id": "target_vso", - "added": "1.000", - "unit": "mm³/s", - "type": "int", - "start": "0xBA", - "length": 1, + "length": 32, "usage": "operational", - "examples": [80], - "description": "Default recommended speed." + "examples": ["pfil.us?i=8078-RQSR"], + "description": "URL to access online JSON additional parameters. Formatted without `https` to save space." } ] } From b4d42b87f9e84f485305b9ef6b65d82dfd53ecbc Mon Sep 17 00:00:00 2001 From: Mitch Davis Date: Fri, 4 Sep 2026 14:03:20 -0400 Subject: [PATCH 02/10] Added rough draft getting started page. This will likely need to be updated, but this serves as a good starting point --- _data/navigation.yml | 2 + assets/css/main.scss | 124 ++++++++++++ assets/images/getting-started-developer.svg | 11 ++ .../images/getting-started-manufacturer.svg | 9 + assets/images/getting-started-user.svg | 14 ++ getting-started.md | 186 ++++++++++++++++++ index.md | 4 +- 7 files changed, 349 insertions(+), 1 deletion(-) create mode 100644 assets/images/getting-started-developer.svg create mode 100644 assets/images/getting-started-manufacturer.svg create mode 100644 assets/images/getting-started-user.svg create mode 100644 getting-started.md diff --git a/_data/navigation.yml b/_data/navigation.yml index 6db98eb..fdc6409 100644 --- a/_data/navigation.yml +++ b/_data/navigation.yml @@ -1,4 +1,6 @@ main: + - title: "Getting Started" + url: "/getting-started/" - title: "About" url: "/about" - title: "Spec" diff --git a/assets/css/main.scss b/assets/css/main.scss index 91f0f4d..4056f15 100644 --- a/assets/css/main.scss +++ b/assets/css/main.scss @@ -93,6 +93,130 @@ textarea { transition: border-color 0.2s; } +/* Getting Started */ + +.getting-started__lede { + max-width: 52rem; + margin: 0 0 2rem; + color: $light-gray; + font-size: 1.2em; + line-height: 1.6; +} + +.role-grid, +.benefit-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1rem; + margin: 1.5rem 0 3rem; +} + +.role-card { + display: flex; + min-height: 11rem; + flex-direction: column; + justify-content: flex-end; + padding: 1.3rem; + color: inherit; + background: linear-gradient(145deg, #1e232e, #151922); + border: 1px solid #303847; + border-radius: 1rem; + text-decoration: none; + transition: + border-color 0.2s ease, + transform 0.2s ease; + + &:hover { + color: inherit; + border-color: $primary-color; + transform: translateY(-2px); + } + + strong { + margin-bottom: 0.35rem; + color: #fff; + font-size: 1.15em; + } + + span:last-child { + color: $light-gray; + font-size: 0.88em; + line-height: 1.45; + } +} + +.role-card--primary { + background: linear-gradient( + 145deg, + rgba($primary-color, 0.27), + rgba($primary-color, 0.08) + ); + border-color: rgba($primary-color, 0.7); +} + +.role-card__eyebrow { + margin-bottom: 0.75rem; + color: rgb(198, 157, 235) !important; + font-size: 0.7em !important; + font-weight: bold; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.role-card__icon { + width: 3.5rem; + height: 3.5rem; + margin: 0 0 auto; +} + +.benefit-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + margin-bottom: 2rem; +} + +.benefit-card { + padding: 1.25rem; + background: #181d27; + border: 1px solid #29313e; + border-radius: 0.75rem; + + h4 { + margin: 0 0 0.5rem; + border-bottom: 0; + } + + p { + margin: 0; + color: $light-gray; + } +} + +.start-path { + margin: 1rem 0; + padding: 0.25rem 1.25rem 0.5rem; + background: rgba($primary-color, 0.07); + border-left: 3px solid $primary-color; + border-radius: 0 0.75rem 0.75rem 0; +} + +.getting-started__actions { + display: flex; + gap: 0.75rem; + flex-wrap: wrap; + margin: 1.5rem 0; +} + +@media (max-width: 700px) { + .role-grid, + .benefit-grid { + grid-template-columns: 1fr; + } + + .role-card { + min-height: 9rem; + } +} + /* GFM Alerts */ .markdown-alert { diff --git a/assets/images/getting-started-developer.svg b/assets/images/getting-started-developer.svg new file mode 100644 index 0000000..1c30aaf --- /dev/null +++ b/assets/images/getting-started-developer.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/assets/images/getting-started-manufacturer.svg b/assets/images/getting-started-manufacturer.svg new file mode 100644 index 0000000..d306ee5 --- /dev/null +++ b/assets/images/getting-started-manufacturer.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/images/getting-started-user.svg b/assets/images/getting-started-user.svg new file mode 100644 index 0000000..65bbf62 --- /dev/null +++ b/assets/images/getting-started-user.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/getting-started.md b/getting-started.md new file mode 100644 index 0000000..d24be7d --- /dev/null +++ b/getting-started.md @@ -0,0 +1,186 @@ +--- +title: Getting Started +layout: single +permalink: /getting-started/ +description: Learn what OpenTag3D can do and how users, developers, and filament manufacturers can get started. +--- + +

+ Self-aware filament. Let every spool tell your printer and + slicer what it is and how it should be used. Automatic setup. Fewer mistakes. +

+ + + +## For people who print + +### Why does filament need an RFID tag? + +An RFID tag gives every spool a digital identity. It carries the filament's +material, color, recommended settings, and other useful details. Compatible +printers and slicers can read that information automatically, so you spend less +time adjusting profiles, catch incompatible settings before a print starts, +and keep your filament organized. + +
+ +
+ +#### Save Time + +Your spool can provide its configuration and profiles for you. Change materials +or colors without manually changing your print settings. + +
+ +
+ +#### Make Less Mistakes + +Your printer can warn you when your settings fall outside the filament's +specifications, helping catch errors that could cause a print to fail before it +starts. + +
+ +
+ +#### Be More Organized + +Every tag identifies its spool, including details such as color, material, and +serial number. Use that information for inventory and organization that ties +directly into your printers. + +
+ +
+ +### What can it enable? + +OpenTag3D is a standard, not a single app or product. It gives projects a common +set of data they can use to build features such as: + +- **Automatic slicer profiles:** Load settings from the filament instead of + finding and entering them by hand. +- **Inventory management:** Identify each spool uniquely and keep its material, + color, and other details together. +- **Automatic dryer settings:** Select an appropriate temperature and duration + for the material, reducing the risk of a drying mistake. +- **Filament-remaining estimates:** Use the tag as a rotation marker and combine + it with the stored core diameter, or weigh the spool and subtract the stored + empty-spool weight. + +> [!NOTE] +> These are capabilities the standard makes possible. Availability depends on +> the printer, slicer, accessory, or community project you use. + +### I’m sold. How do I start? + +
+ +#### 1. Use filament and projects that already support OpenTag3D + +This is the easiest route: buy a tagged spool, then use it with a compatible +printer, accessory, slicer, or community project. See the current +[supporters and implementation status](/about#supporters). + +
+ +
+ +#### 2. Write your own tags + +Buy compatible NFC tags, enter the spool information in +[Make a Tag](/make), and write the result using one of the methods below. The +specification is designed around **NTAG215** tags; **NTAG216** tags are also +supported. + +Some filament companies provide a lookup that fills in product data for you: + +- [Polar Filament](https://pfil.us/rfid) + +If the manufacturer does not offer a lookup, you can enter the information +yourself. + +
+ +#### With a phone (recommended) + +- **Android:** Open [Make a Tag](/make) in a Web NFC-compatible browser. You can + create, read, and write a tag directly from the page. +- **iPhone:** A native app is required. OpenTag3D-compatible iPhone apps are in + development, but none are available yet. + +##### OpenTag3D phone apps + +| Platform | Available apps | +| --- | --- | +| Android | None yet. Use the [Web NFC tag tool](/make) in the meantime. | +| iPhone | None yet. | + +Building an app? Let us know so it can be added here. + +#### With a computer (advanced) + +- **NFC Tools Desktop:** Use a USB NFC reader such as the ACR122U (typically + around $30) to read and write tags. Follow Polar Filament’s + [OpenTag3D NFC Tools guide](https://pfil.us/opentag3d.php). +- **Proxmark3:** Use this popular RFID development toolkit with the Proxmark3 + export provided by [Make a Tag](/make). + +#### With a Flipper Zero + +The hardware is capable of reading and writing compatible tags, but the full +OpenTag3D workflow is not documented yet. This is not currently a recommended +getting-started path. + +## For developers + +OpenTag3D is openly documented and its source is available on GitHub. Start with +the specification, then use the existing source and community projects as +implementation references. + + + +The [reader implementation guidelines](/spec#reader-implementation-guidelines) +cover the details most hardware and firmware integrations need first. + +## For manufacturers + +OpenTag3D is free to adopt. There are **no licensing fees, required vendors, or +certification requirements**. You can source tags and readers entirely on your +own, manufacture your own solution, and implement as much of the open standard +as your product needs. + +There is no central service that your product must depend on. The essential +filament data lives on the tag and works offline; optional web lookups can be +hosted by the manufacturer or another provider. OpenTag3D is both open source +and decentralized. + +We recommend talking with the community on Discord before implementation. We +can walk through the getting-started documentation, answer integration +questions, and help you avoid common hardware and data-format pitfalls. You can +also [review the specification](/spec) or +[contact the project maintainers](/about#contact). diff --git a/index.md b/index.md index 76fefbb..fd890a8 100644 --- a/index.md +++ b/index.md @@ -9,13 +9,15 @@ header: overlay_filter: "0.6" overlay_image: /assets/images/background.jpg actions: + - label: "Get Started" + url: "/getting-started/" - label: "View Spec" url: "/spec" announcement: "[OpenTag3D v2.0](./articles/v2-already) is out now!" caption: "Placeholder Background by [**morgaannn23**](https://wallpapercave.com/w/wp6945227)" excerpt: "An open source standard for 3D printer filament RFID tags. Designed from the ground up for compatibility between printers, filament manufacturers, and accessories, implementation is simple and low-cost." intro: - - excerpt: "Proprietary locks you in. Open sets you free. — [Tim Berners-Lee](https://www.w3.org/People/Berners-Lee/)" + - excerpt: "Proprietary locks you in. Open sets you free. [Tim Berners-Lee](https://www.w3.org/People/Berners-Lee/)" feature_row: - title: "Low-Cost, Off-the-Shelf Hardware" excerpt: "OpenTag3D uses standard NFC tags (NTAG215/216). These tags are readable and writable by smartphones, compatible with most off-the-shelf RFID/NFC readers (including low-cost PN532 modules), and require no proprietary hardware. This allows everyone, from corporations to hobbyists, to implement the standard into their applications, printers or accessories." From aa79acabb86d0301f9ee0cf66c671be67d4d814f Mon Sep 17 00:00:00 2001 From: "Queen Vinyl Da.i'gyu-Kazotetsu" Date: Fri, 4 Sep 2026 18:40:10 -0700 Subject: [PATCH 03/10] Styling tweaks --- assets/css/main.scss | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/assets/css/main.scss b/assets/css/main.scss index 4056f15..a146203 100644 --- a/assets/css/main.scss +++ b/assets/css/main.scss @@ -93,6 +93,10 @@ textarea { transition: border-color 0.2s; } +.feature__wrapper { + text-align: center; +} + /* Getting Started */ .getting-started__lede { @@ -122,6 +126,7 @@ textarea { border: 1px solid #303847; border-radius: 1rem; text-decoration: none; + text-align: center; transition: border-color 0.2s ease, transform 0.2s ease; @@ -166,7 +171,7 @@ textarea { .role-card__icon { width: 3.5rem; height: 3.5rem; - margin: 0 0 auto; + margin: auto; } .benefit-grid { From 744bce6d23d676ffbba915fc2b6f4d0a2b11bdbb Mon Sep 17 00:00:00 2001 From: "Queen Vinyl Da.i'gyu-Kazotetsu" Date: Fri, 4 Sep 2026 19:48:21 -0700 Subject: [PATCH 04/10] Consolidate styling (use notice mixin) --- assets/css/main.scss | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/assets/css/main.scss b/assets/css/main.scss index a146203..fce3878 100644 --- a/assets/css/main.scss +++ b/assets/css/main.scss @@ -197,11 +197,17 @@ textarea { } .start-path { - margin: 1rem 0; - padding: 0.25rem 1.25rem 0.5rem; - background: rgba($primary-color, 0.07); + @include notice($primary-color); + font-size: revert !important; border-left: 3px solid $primary-color; - border-radius: 0 0.75rem 0.75rem 0; + + a { + color: $link-color; + + &:hover { + color: $link-color-hover; + } + } } .getting-started__actions { From 2d68355856b020dfebda0d6189d86b98e68b0e0e Mon Sep 17 00:00:00 2001 From: "Queen Vinyl Da.i'gyu-Kazotetsu" Date: Fri, 4 Sep 2026 19:55:35 -0700 Subject: [PATCH 05/10] Fix styling for role card images --- assets/css/main.scss | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/assets/css/main.scss b/assets/css/main.scss index fce3878..6f17852 100644 --- a/assets/css/main.scss +++ b/assets/css/main.scss @@ -172,6 +172,14 @@ textarea { width: 3.5rem; height: 3.5rem; margin: auto; + scale: 1; + transition: scale 0.2s; +} + +.role-card:hover .role-card__icon { + /* Overwrite box-shadow for hovering on images in links */ + box-shadow: none !important; + scale: 1.1; } .benefit-grid { From d973d5843d65ea02a4ed92290908abfd9f9529a6 Mon Sep 17 00:00:00 2001 From: "Queen Vinyl Da.i'gyu-Kazotetsu" Date: Fri, 4 Sep 2026 20:16:23 -0700 Subject: [PATCH 06/10] Small wording tweaks --- getting-started.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/getting-started.md b/getting-started.md index d24be7d..883eb7e 100644 --- a/getting-started.md +++ b/getting-started.md @@ -123,23 +123,23 @@ yourself. -#### With a phone (recommended) +##### With a phone (recommended) -- **Android:** Open [Make a Tag](/make) in a Web NFC-compatible browser. You can +- **Android:** Open [Make a Tag](/make) in a [Web NFC-compatible browser](https://caniuse.com/webnfc). You can create, read, and write a tag directly from the page. - **iPhone:** A native app is required. OpenTag3D-compatible iPhone apps are in development, but none are available yet. -##### OpenTag3D phone apps +###### OpenTag3D phone apps -| Platform | Available apps | -| --- | --- | -| Android | None yet. Use the [Web NFC tag tool](/make) in the meantime. | -| iPhone | None yet. | +| Platform | Available apps | +| -------- | ------------------------------------------------------------ | +| Android | None yet. Use the [Web NFC tag tool](/make) in the meantime. | +| iPhone | None yet. | Building an app? Let us know so it can be added here. -#### With a computer (advanced) +##### With a computer (advanced) - **NFC Tools Desktop:** Use a USB NFC reader such as the ACR122U (typically around $30) to read and write tags. Follow Polar Filament’s @@ -147,10 +147,10 @@ Building an app? Let us know so it can be added here. - **Proxmark3:** Use this popular RFID development toolkit with the Proxmark3 export provided by [Make a Tag](/make). -#### With a Flipper Zero +##### With a Flipper Zero The hardware is capable of reading and writing compatible tags, but the full -OpenTag3D workflow is not documented yet. This is not currently a recommended +OpenTag3D workflow is not finished yet. This is not currently a recommended getting-started path. ## For developers From 2706ddb1e5eec04c2bb43fb1ad85484f1c2c604a Mon Sep 17 00:00:00 2001 From: "Queen Vinyl Da.i'gyu-Kazotetsu" Date: Fri, 4 Sep 2026 21:02:19 -0700 Subject: [PATCH 07/10] Wording tweaks to user categories --- getting-started.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/getting-started.md b/getting-started.md index 883eb7e..9e04826 100644 --- a/getting-started.md +++ b/getting-started.md @@ -12,13 +12,13 @@ description: Learn what OpenTag3D can do and how users, developers, and filament From 1103cf7662f90f5fcc15c34d5e206b1c52548581 Mon Sep 17 00:00:00 2001 From: "Queen Vinyl Da.i'gyu-Kazotetsu" Date: Fri, 4 Sep 2026 21:43:22 -0700 Subject: [PATCH 09/10] Discord community is not yet up --- getting-started.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/getting-started.md b/getting-started.md index f5574cf..149c853 100644 --- a/getting-started.md +++ b/getting-started.md @@ -179,8 +179,4 @@ filament data lives on the tag and works offline; optional web lookups can be hosted by the manufacturer or another provider. OpenTag3D is both open source and decentralized. -We recommend talking with the community on Discord before implementation. We -can walk through the getting-started documentation, answer integration -questions, and help you avoid common hardware and data-format pitfalls. You can -also [review the specification](/spec) or -[contact the project maintainers](/about#contact). +Please feel free to [contact the project maintainers](/about#contact) to discuss implementation. We can walk through the getting-started documentation, answer integration questions, and help you avoid common hardware and data-format pitfalls. From 66ad830e3b7f173cc2c1cf1151dbd7b0d1329cc9 Mon Sep 17 00:00:00 2001 From: "Queen Vinyl Da.i'gyu-Kazotetsu" Date: Fri, 4 Sep 2026 21:43:31 -0700 Subject: [PATCH 10/10] Tweak styling --- getting-started.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/getting-started.md b/getting-started.md index 149c853..f9cd554 100644 --- a/getting-started.md +++ b/getting-started.md @@ -95,18 +95,12 @@ set of data they can use to build features such as: ### I’m sold. How do I start? -
- #### 1. Use filament and projects that already support OpenTag3D This is the easiest route: buy a tagged spool, then use it with a compatible printer, accessory, slicer, or community project. See the current [supporters and implementation status](/about#supporters). -
- -
- #### 2. Write your own tags Buy compatible NFC tags, enter the spool information in @@ -121,8 +115,6 @@ Some filament companies provide a lookup that fills in product data for you: If the manufacturer does not offer a lookup, you can enter the information yourself. -
- ##### With a phone (recommended) - **Android:** Open [Make a Tag](/make) in a [Web NFC-compatible browser](https://caniuse.com/webnfc). You can