6.1 KiB
Product Encoding System
Overview
This document describes the hex-based encoding system for creating stable, bookmarkable URLs for product configurations. The system uses bit-packing to create compact strings that encode product type, color, material, and hardware options.
Design Goals
- Stable URLs: Old bookmarks continue to work even as new options are added
- Compact: Keep URLs under 32-64 characters
- Extensible: Reserve space for future expansion
- Reversible: Each encoded string can be uniquely decoded back to its components
- Version-aware: Support future format changes without breaking old URLs
Encoding Format
Format: v-T-C-M-HHHH-HHHH-HHHH
│ │ │ │ │ │ └── Hardware 3 (optional)
│ │ │ │ │ └─────── Hardware 2 (optional)
│ │ │ │ └──────────── Hardware 1
│ │ │ └────────────── Material (1 hex char, 0-F)
│ │ └──────────────── Color (1 hex char, 0-F)
│ └────────────────── Type (1 hex char, 0-F)
└──────────────────── Version (1 hex char, 0-F)
Example: "0-1-4-1-0D94"
- Version: 0 (using 5-bit encoding per field)
- Type: 1 (Patio Door)
- Color: 4 (White)
- Material: 1 (Aluminum)
- Hardware 1: 0D94 (Lever, Standard, Brass)
Max Length: ~24 characters (with 3 hardware items)
Version 0 Encoding (Current)
Main Product Attributes (Single Hex Character Each)
Each main attribute uses a single hex character (0-F = 0-15):
Type Values (1 hex char)
1 = Patio Door
2 = Reserved
3 = Storm Door
4 = Reserved
5 = Storm Window
6 = Reserved
7 = Primary Window
8-F = Reserved (8 slots for future door/window types)
Color Values (1 hex char)
1 = Black
2 = Bronze
3 = Sandstone
4 = White
5 = Tan
6 = Mill
7-F = Reserved (9 slots for future colors)
Material Values (1 hex char)
1 = Aluminum
2 = Vinyl
3-F = Reserved (13 slots for future materials)
Hardware Encoding (4 Hex Characters = FFFF)
Each hardware item uses 4 hex characters (16 bits) split into fields using 5 bits per field:
16 bits total:
- Bits 10-14: Type (5 bits, 0-31 values)
- Bits 5-9: Style (5 bits, 0-31 values)
- Bits 0-4: Color (5 bits, 0-31 values)
- Bit 15: Reserved (1 bit)
Hardware Type Values (5 bits = 0-31)
0 = None/Not Set
1 = Lever
2 = Pull
3 = Pull Handle
4 = Deadbolt
5 = Hinge
6-31 = Reserved (26 slots)
Hardware Style Values (5 bits = 0-31)
0 = None/Not Set
1 = Standard
2 = Push
3 = Alternative
4 = Contemporary
5 = Traditional
6-31 = Reserved (26 slots)
Hardware Color Values (5 bits = 0-31)
0 = None/Not Set
1 = Brass
2 = White
3 = Black
4 = Satin
5 = Nickel
6 = Bronze
7-31 = Reserved (25 slots)
Bit Math Examples
Encoding Hardware
Example: Lever, Standard, Brass
- Type: 1 (Lever)
- Style: 1 (Standard)
- Color: 1 (Brass)
Binary calculation:
Type (1) = 00001 (bits 10-14)
Style (1) = 00001 (bits 5-9)
Color (1) = 00001 (bits 0-4)
Combined: 0000010000100001 = 0x0421
Hex: "0421"
Example: Pull Handle, Alternative, Satin
- Type: 3 (Pull Handle)
- Style: 3 (Alternative)
- Color: 4 (Satin)
Binary calculation:
Type (3) = 00011 (bits 10-14)
Style (3) = 00011 (bits 5-9)
Color (4) = 00100 (bits 0-4)
Combined: 0000110001100100 = 0x0C64
Hex: "0C64"
Decoding Hardware
Given hex: "0D94"
Binary: 0000110110010100
Extract fields:
Type = bits 10-14 = 00011 = 3 (Pull Handle)
Style = bits 5-9 = 01100 = 12
Color = bits 0-4 = 10100 = 20
URL Examples
Simple Products (No Hardware)
"0-1-4-1" = Patio Door, White, Aluminum
"0-3-4-1" = Storm Door, White, Aluminum
"0-7-1-1" = Primary Window, Black, Aluminum
"0-5-2-2" = Storm Window, Bronze, Vinyl
Products with Hardware
"0-3-4-1-0421" = Storm Door, White, Aluminum, Lever-Standard-Brass
"0-3-1-1-0421-0C64" = Storm Door, Black, Aluminum,
Hardware1: Lever-Standard-Brass,
Hardware2: Pull Handle-Alternative-Satin
Expansion Strategy
Adding New Options (Compatible)
When adding new options within existing capacity (0-15 for main attributes, 0-31 for hardware fields):
Old system: Color 1-6 defined, 7-15 reserved
New system: Add Color 7 = Charcoal
Old URLs still work: "0-1-4-1" still means Patio Door, White, Aluminum
New URLs use new values: "0-1-7-1" means Patio Door, Charcoal, Aluminum
Version 1 (Future Expansion)
If we exceed 16 main attribute values or 32 hardware field values:
Version 1: Use 6 bits per hardware field (64 values each)
Format: "1-TT-CC-MM-HHHHH-HHHHH"
Changes:
- Main attributes expand to 2 hex chars each (256 values)
- Hardware expands to 5 hex chars each (18 bits = 6 bits per field)
Compatibility Rules
- Never reuse reserved values until a new version is released
- Never change existing value meanings (e.g., don't make "1" mean something else)
- Always decode based on version character
- Maintain lookup tables for each version
Implementation Notes
- Use bit-shifting operators (
<<,>>) for performance - Use bitwise AND (
&) with masks to extract fields - Pad hex strings with leading zeros to fixed width
- Validate decoded values against valid ranges
- Return error for unknown version codes
Benefits
✅ Stable: Values 0-15 remain the same even if we expand to 0-31
✅ Compact: 13-24 characters for most products
✅ Readable: Hex is human-debuggable
✅ Efficient: Single parse operation, no string splitting
✅ Extensible: Version prefix allows future format changes
✅ Reliable: Bit operations are deterministic and reversible
Last Updated: March 26, 2026
Current Version: 0 (5-bit hardware encoding)