Files
2026-04-11 00:04:09 -05:00

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

  1. Stable URLs: Old bookmarks continue to work even as new options are added
  2. Compact: Keep URLs under 32-64 characters
  3. Extensible: Reserve space for future expansion
  4. Reversible: Each encoded string can be uniquely decoded back to its components
  5. 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

  1. Never reuse reserved values until a new version is released
  2. Never change existing value meanings (e.g., don't make "1" mean something else)
  3. Always decode based on version character
  4. 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)