Skip to main content

JEF

Status

FieldValue
Extension(s).jef
Common ecosystemJanome, Elna-related workflows
Format familyMachine-specific file
Satin Studio statusPlanned
Open / importNo
ExportNo
ConfidenceHigh for broad structure; machine variants remain.

What it is

JEF is the common machine format for Janome home embroidery machines. Unlike sparse expanded streams, it usually carries hoop, palette, extent, and stitch-offset information.

Satin Studio direction

Satin Studio plans to import exact JEF stitches with hoop/thread metadata and export only when the selected machine and hoop can safely contain the design.

Versions and variants

JEF support needs a machine-generation matrix. Janome version letters, hoop codes, palette tables, trim settings, and JEF+ or newer variants should be tracked separately.

File identification notes

JEF is little-endian and header-driven. Publicly documented fields include:

  • A stitch-data offset, commonly 0x74 + 8 * color_change_count.
  • A date/version area, including version letters used by different Janome machine generations.
  • Color count and point/stitch-data length fields.
  • Hoop code and extent/edge-distance records for common hoops.
  • A palette-index list and repeated separator values before the stitch data.

The stitch body uses signed 8-bit relative x, y movement. If x == 0x80, the record is a command. Common command prefixes are:

  • 0x80 0x10: end.
  • 0x80 0x01: color change / stop.
  • 0x80 0x02: jump; also used as trim behavior in some machine/software settings.

Some Janome machines can trim on color changes, long jumps, or explicit zero-distance jump/cut commands depending on machine settings.

Observed structure notes

  • Observed JEF readers start with a little-endian stitch-data offset, skip date/version-style metadata, read a color count, then read palette indexes before seeking to the stitch stream.
  • Normal stitch records are signed two-byte dx, dy pairs with Y inverted for embroidery coordinates. A first byte 0x80 introduces a command byte plus two payload bytes.
  • Observed commands include 0x02 jump with payload movement, 0x01 color change or stop depending on the next thread entry, and 0x10 end.
  • Observed writers compute stitch-data offset as 0x74 + color_count * 8 and then write palette indexes followed by repeated 0x0D separator values before stitch data.
  • Observed JEF headers include a 14-byte timestamp string, color count, point count, hoop code, design half-width/half-height, and edge distances for common hoops.
  • Observed writers finish stitch data with 0x80 0x10 and no movement payload.

Structure sketch

JEF is little-endian and header-driven. Stitch data starts at the offset stored in the header.

struct JefFile<'a> {
stitch_data_offset: u32,
header_after_offset: &'a [u8], // date/version, counts, hoop, extents, and separators vary by generation
palette_indexes: &'a [u32],
stitch_records: &'a [JefRecord],
}

enum JefRecord {
Stitch { dx: i8, dy: i8 },
Jump { dx: i8, dy: i8 }, // 0x80 0x02 + payload movement
ColorChangeOrStop, // 0x80 0x01
End, // 0x80 0x10
}

What we still need

Palette tables, hoop-code tables, trim behavior by machine, and validation files from multiple Janome generations.