Mod
Seams & Stitches
No reviews yet
This mod adds sewing to Minecraft! In an interactive way.
Includes quality of life improvements and small tweaks to enhance and customize gameplay.
Community voices
Reviews
Click once to include, again to exclude, again to clear
No reviews yet. Be the first to review this project!
Get it on
Available Platforms
About
Project Details
For authors
Embed Badge
If you're the author of this project, you can embed a live badge anywhere that supports HTML or Markdown. It updates automatically whenever ratings change.
Use HTML for any page that supports it, or Markdown for README files and Markdown-based descriptions.
Identifiers
Platform IDs
Resources
External Links
About
Description
Seams and Stitches
Summary
This mod adds interactive sewing to Minecraft. It introduces a Tailoring Bench where players craft items by stitching along seam paths in a minigame. Hit more stitches within the timing window to produce higher-quality results. Mastering a pattern unlocks Quick Craft, letting you skip the minigame for repeat crafts. How many completions are required before mastery is unlocked is configurable per recipe.
A Needle and Scissors are required to use the bench. Both are craftable.
Quality Tiers
Each completed craft is graded based on the fraction of stitches hit and how precisely they were timed:
| Tier | Lore | Behavior |
|---|---|---|
| Poor | "Poorly sewn by <player\>" | Minimum passing threshold — item produced with lowest bonus values |
| Well | (none) | Base result — no lore added |
| Expert | "Expertly crafted by <player\>" | Hit rate meets the expert threshold |
| Master | "Masterfully crafted by <player\>" | Every stitch hit within the perfect window |
If fewer stitches are hit than the poor threshold, the craft fails entirely and no item is produced.
Quality tiers can grant per-attribute bonuses defined in quality_bonuses. Attribute values are set explicitly per tier, replacing the item's vanilla default for that attribute.
Instructions for Use
1. Folder Structure
To add custom sewing recipes, place them in the following path inside your modpack or data pack:
modpack_name/
└── data/
└── seamsandstitches/
└── recipe/
2. JSON Recipe Structure
Each custom recipe must be its own individual JSON file and can be named anything you like.
Top-level fields:
| Key | Description |
|---|---|
type |
Must be "seamsandstitches:sewing_pattern" |
texture |
Path to the item texture used as the sewing canvas (e.g., "minecraft:textures/item/leather_helmet.png") |
output |
Object with id ("mod_id:item_name") and count |
ingredients |
List of ingredient objects ({ "item": "mod_id:item_name" }), shapeless and order-independent |
seams |
List of seam definitions (see below) |
requires_pattern |
(Optional) Recipe ID the player must have unlocked before this recipe appears in the bench |
quality_breakpoints |
(Optional) Per-recipe quality thresholds (see below). Falls back to the global poorThreshold config value |
quality_bonuses |
(Optional) List of attribute bonuses applied per quality tier (see below) |
deferred_ingredients |
(Optional) List of 0-based ingredient indices that are not consumed when the craft starts. These items remain in the bench during the minigame and are consumed only on successful completion. If the craft is cancelled they are returned. |
transfer_contents |
(Optional, default false) When true, the inventory contents of the first deferred ingredient are copied onto the assembled output while leaving the output's own component configuration intact (e.g. a toolbelt:belt_size value set in the recipe output). Items exposing IItemHandler are copied slot-by-slot; items using minecraft:container or minecraft:bundle_contents have only that component transferred. Those two component types are also auto-detected when non-empty even without this flag; set it explicitly when the source container may be empty, or for IItemHandler-only modded containers. |
crafts_to_master |
(Optional, default 1) Number of successful minigame completions required before Quick Craft is unlocked for this recipe. While progress is below the threshold, the preview panel shows X/N where X is the current count. |
display_name |
(Optional) Overrides the name shown in the pattern picker dropdown and selector button. Accepts a plain string or a full Minecraft text component (e.g. { "translate": "my.key" }). Falls back to the output item's hover name if omitted. |
Seam fields:
| Key | Description |
|---|---|
id |
Unique name for this seam segment (e.g., "collar", "left_sleeve") |
path |
Array of [x, y] pixel coordinates (0–15 for a 16×16 texture) tracing the seam line |
speed |
Float — traversal speed in path-index units per second (e.g., 2.0) |
Quality breakpoints fields (quality_breakpoints):
| Key | Default | Description |
|---|---|---|
poor |
0.25 |
Minimum hit fraction to produce any item. Below this the craft fails |
well |
0.5 |
Minimum hit fraction for Well quality |
expert |
0.75 |
Minimum hit fraction for Expert quality |
master |
1.0 |
Fraction of stitches that must be perfect (hit within the target's green ring) to achieve Master |
Quality bonus fields (quality_bonuses is a list of these):
| Key | Description |
|---|---|
attribute |
The attribute to modify (e.g., "minecraft:generic.armor") |
slot |
(Optional) Equipment slot group: "head", "chest", "legs", "feet", "main_hand", "off_hand", "armor", "any" |
poor |
Attribute value applied at Poor quality |
well |
Attribute value applied at Well quality |
expert |
Attribute value applied at Expert quality |
master |
Attribute value applied at Master quality |
The quality bonus replaces the item's vanilla default for that attribute rather than adding to it.
Supported attributes:
Generic
| Attribute | ResourceLocation |
|---|---|
| Armor | minecraft:generic.armor |
| Armor toughness | minecraft:generic.armor_toughness |
| Attack damage | minecraft:generic.attack_damage |
| Attack knockback | minecraft:generic.attack_knockback |
| Attack speed | minecraft:generic.attack_speed |
| Burning time | minecraft:generic.burning_time |
| Explosion knockback resistance | minecraft:generic.explosion_knockback_resistance |
| Fall damage multiplier | minecraft:generic.fall_damage_multiplier |
| Flying speed | minecraft:generic.flying_speed |
| Follow range | minecraft:generic.follow_range |
| Gravity | minecraft:generic.gravity |
| Jump strength | minecraft:generic.jump_strength |
| Knockback resistance | minecraft:generic.knockback_resistance |
| Luck | minecraft:generic.luck |
| Max absorption | minecraft:generic.max_absorption |
| Max health | minecraft:generic.max_health |
| Movement efficiency | minecraft:generic.movement_efficiency |
| Movement speed | minecraft:generic.movement_speed |
| Oxygen bonus | minecraft:generic.oxygen_bonus |
| Safe fall distance | minecraft:generic.safe_fall_distance |
| Scale | minecraft:generic.scale |
| Step height | minecraft:generic.step_height |
| Water movement efficiency | minecraft:generic.water_movement_efficiency |
Player
| Attribute | ResourceLocation |
|---|---|
| Block break speed | minecraft:player.block_break_speed |
| Block interaction range | minecraft:player.block_interaction_range |
| Entity interaction range | minecraft:player.entity_interaction_range |
| Mining efficiency | minecraft:player.mining_efficiency |
| Sneaking speed | minecraft:player.sneaking_speed |
| Submerged mining speed | minecraft:player.submerged_mining_speed |
| Sweeping damage ratio | minecraft:player.sweeping_damage_ratio |
3. Example Recipe
{
"type": "seamsandstitches:sewing_pattern",
"texture": "minecraft:textures/item/leather_helmet.png",
"output": {
"id": "minecraft:leather_helmet",
"count": 1
},
"ingredients": [
{ "item": "minecraft:leather" },
{ "item": "minecraft:leather" },
{ "item": "minecraft:leather" },
{ "item": "minecraft:leather" },
{ "item": "minecraft:leather" }
],
"seams": [
{
"id": "crown",
"path": [[4,11],[3,10],[3,9],[3,8],[3,7],[3,6],[3,5],[4,4],[5,3],[6,3],[7,3],[8,3],[9,3],[10,3],[11,4],[12,5],[12,6],[12,7],[12,8],[12,9],[12,10],[11,11]],
"speed": 2
},
{
"id": "left_strap",
"path": [[6,4],[6,5],[6,6],[7,7],[6,7],[5,8],[5,9],[5,10],[5,11]],
"speed": 2
}
],
"quality_breakpoints": {
"poor": 0.25,
"well": 0.5,
"expert": 0.75,
"master": 1.0
},
"quality_bonuses": [
{
"attribute": "minecraft:generic.armor",
"slot": "head",
"poor": 0,
"well": 1,
"expert": 2,
"master": 3
}
]
}
4. Upgrade Recipe (Container Content Transfer)
When upgrading a container item — such as a wallet or shulker box — use deferred_ingredients to keep the source item in the bench until the craft completes, and transfer_contents to carry its stored contents onto the new item.
The deferred ingredient index refers to its position in the ingredients array (0-based). In the example below, index 0 is the copper wallet.
{
"type": "seamsandstitches:sewing_pattern",
"texture": "lightmanscurrency:textures/item/wallet/wallet_copper.png",
"output": {
"id": "lightmanscurrency:wallet_iron",
"count": 1
},
"ingredients": [
{ "item": "lightmanscurrency:wallet_copper" },
{ "item": "minecraft:iron_ingot" },
{ "item": "minecraft:iron_ingot" }
],
"deferred_ingredients": [0],
"transfer_contents": true,
"seams": [
{
"id": "stitching",
"path": [[4,4],[5,4],[6,4],[7,4],[8,4],[9,4],[10,4],[11,4],[11,5],[11,6],[11,7],[11,8],[10,9],[9,9],[8,9],[7,9],[6,9],[5,9],[4,9],[4,8],[4,7],[4,6],[4,5]],
"speed": 2.0
}
]
}
How it works:
- The copper wallet (index
0) stays in the bench when the minigame starts. If the player cancels, the wallet is returned. - On successful completion, the wallet's stored items are copied onto the iron wallet output — only the inventory is transferred; the output keeps its own component configuration.
- The remaining ingredients (iron ingots) are consumed immediately when the craft starts as normal.
5. Custom Ingredient Types
seamsandstitches:item_variation
Matches a base ingredient only when a specific data marker is present (or absent) on the item. Useful for distinguishing items that share an item ID but differ in internal state — for example, toolbelts of different slot capacities that are all toolbelt:belt.
Fields:
| Key | Description |
|---|---|
base |
Base ingredient — { "item": "..." } or { "tag": "..." } — the item must satisfy this first |
component_key |
The marker to check. Use a plain tag name (e.g. "my_tag") to check the item's minecraft:custom_data compound, or a namespaced resource location (e.g. "toolbelt:belt_size") to look up a registered data component type |
component_value |
(Optional) Expected value as a plain string. Integer and string component values both serialise to their natural string form ("4", "small", etc.). If omitted, the ingredient matches items where the component or tag is entirely absent |
Absence matching — omitting component_value lets you target the "default" state of an item that gains a component only after being upgraded:
{
"type": "seamsandstitches:item_variation",
"base": { "item": "toolbelt:belt" },
"component_key": "toolbelt:belt_size"
}
Matches any toolbelt:belt that has no belt_size component (the base, un-upgraded belt).
Value matching — specify component_value to require a specific value:
{
"type": "seamsandstitches:item_variation",
"base": { "item": "toolbelt:belt" },
"component_key": "toolbelt:belt_size",
"component_value": "3"
}
Matches only a belt whose belt_size component serialises to "3". A belt with belt_size: 4 or no component at all is rejected.
Combine with deferred_ingredients and transfer_contents to build a full upgrade chain:
{
"type": "seamsandstitches:sewing_pattern",
"transfer_contents": true,
"deferred_ingredients": [0],
"display_name": "Iron Toolbelt (4 Slots)",
"output": {
"id": "toolbelt:belt",
"count": 1,
"components": { "toolbelt:belt_size": 4 }
},
"ingredients": [
{
"type": "seamsandstitches:item_variation",
"base": { "item": "toolbelt:belt" },
"component_key": "toolbelt:belt_size",
"component_value": "3"
},
{ "item": "toolbelt:pouch" },
{ "item": "materialistic:red_string" },
{ "item": "materialistic:red_string" },
{ "item": "materialistic:iron_emblem" },
{ "tag": "c:ingots/iron" }
],
"seams": [ "..." ]
}
The output's belt_size: 4 component is preserved by the targeted content transfer — only the tool inventory carries over from the size-3 belt.
Configuration
Config file: config/seamsandstitches-common.toml
Default Recipes
| Output | Ingredients | Quality Bonuses |
|---|---|---|
| Book | 3x Paper, 1x Leather | — |
| Painting | 1x White Wool, 8x Sticks | — |
| Leather Helmet | 5x Leather | Armor (head): Poor 0 / Well 1 / Expert 2 / Master 3 |
| Leather Chestplate | 8x Leather | Armor (chest): Poor 0 / Well 1 / Expert 2 / Master 3 |
| Leather Leggings | 7x Leather | Armor (legs): Poor 0 / Well 1 / Expert 2 / Master 3 |
| Leather Boots | 3x Leather, 1x String | Armor (feet): Poor 0 / Well 1 / Expert 2 / Master 3 |
| Leather Horse Armor | 12x Leather | — |
Recipe Overrides
When enabled, the specified items can no longer be crafted at a crafting table and must instead be made at the Tailoring Bench.
| Option | Default | Description |
|---|---|---|
enableRecipeOverrides |
true |
Globally enables or disables all Tailoring Bench recipe overrides |
override_<recipe_id> |
true |
Per-recipe toggle (only active when overrides are enabled globally) |
Overridable recipe IDs:
- Armor:
leather_helmet,leather_chestplate,leather_leggings,leather_boots,leather_horse_armor - Items:
book,painting
Dye Basin Overrides
By default the Dye Basin is the only way to dye items. The config gives per-category control over both sides of that: whether the vanilla crafting-table recipe is disabled, and whether the basin recipe itself is active.
Master switch
| Option | Default | Description |
|---|---|---|
disableShapelessDyeRecipes |
true |
When true (default), vanilla shapeless dye recipes are disabled and the Dye Basin is the primary way to re-color items. Set to false to restore all vanilla dye recipes regardless of per-category settings |
[dye_basin_overrides.vanilla] — re-enable individual vanilla shapeless dye recipes
Only meaningful when disableShapelessDyeRecipes is true. Set an entry to true to restore that specific vanilla recipe while keeping all others disabled.
| Option | Default | Vanilla recipe(s) restored when true |
|---|---|---|
enable_shapeless_armor_dyeing |
false |
Leather armor dyeing (special crafting) |
enable_shapeless_wool_dyeing |
false |
{color}_wool shapeless dye recipes |
enable_shapeless_bed_dyeing |
false |
{color}_bed shapeless dye recipes |
enable_shapeless_carpet_dyeing |
false |
{color}_carpet shapeless dye recipes |
enable_shapeless_terracotta_dyeing |
false |
{color}_terracotta shapeless dye recipes |
enable_shapeless_candle_dyeing |
false |
{color}_candle shapeless dye recipes |
enable_shapeless_stained_glass_dyeing |
false |
{color}_stained_glass crafting-table recipes |
enable_shapeless_shulker_box_dyeing |
false |
Shulker box coloring (special crafting) |
enable_shapeless_concrete_powder_dyeing |
false |
{color}_concrete_powder shapeless dye recipes |
[dye_basin_overrides.basin] — enable/disable individual basin recipes
Set to false to remove a basin recipe entirely (useful if another mod handles that item family).
| Option | Default |
|---|---|
enable_dyeable |
true |
enable_wool |
true |
enable_carpet |
true |
enable_terracotta |
true |
enable_banner |
true |
enable_candle |
true |
enable_bed |
true |
enable_stained_glass |
true |
enable_stained_glass_pane |
true |
enable_shulker_box |
true |
enable_glazed_terracotta |
true |
enable_concrete_powder |
true |
enable_concrete |
true |
enable_sophisticated_backpacks |
true |
All options require a game restart or /reload to take effect.
Leather Tanning
| Option | Default | Description |
|---|---|---|
animalsDropHides |
true |
When true (default), leather-dropping animals (cows, mooshrooms, horses, donkeys, mules, llamas, hoglins) drop raw hides instead of vanilla leather, requiring the Tanning Rack to convert them back. Set to false to restore vanilla leather drops |
General Options
| Option | Default | Description |
|---|---|---|
poorThreshold |
0.25 |
Global minimum hit fraction (0.0–1.0) required to produce any item. Individual recipes can override this via quality_breakpoints.poor |
vanillafyUI |
false |
When true, the Tailoring Bench UI uses the classic vanilla gray style instead of the dark UI |
Debug Options
| Option | Default | Description |
|---|---|---|
debugOverlay |
false |
When enabled, hovering over the sewing canvas shows [x, y] pixel coordinates; clicking records them to a growing array; R clears the array; C copies it to the clipboard. Useful when designing seam paths for custom recipes |
Dye Basin
The Dye Basin is a block for dyeing items. Craft it with any planks arranged in a U-shape with a bucket in the center (W_W / WBW / WWW).
How to use:
- Fill the basin with a water bucket.
- Right-click with a dye item to load a color — the water tints to match.
- Right-click with an item that has a registered
dye_bathrecipe for that color. The item sits on the washboard ridge. - Right-click empty-handed three times to dunk the item into the dye.
- After the third dunk, the dyed result ejects from the front face and the dye clears. The water remains for the next item.
Hold Shift + right-click empty-handed to retrieve the placed item without dyeing it.
Dye Bath Recipe Structure
Place recipe JSONs in the same data/seamsandstitches/recipe/ folder as sewing patterns.
Top-level fields:
| Key | Description |
|---|---|
type |
Must be "seamsandstitches:dye_bath" |
ingredient |
Ingredient object ({ "item": "..." } or { "tag": "..." }) matching the item to be dyed |
dye |
(Optional) Lowercase dye color name (e.g., "red", "light_blue"). If omitted, the recipe matches any dye and uses the active dye at craft time |
result_pattern |
(Optional) Item ID template where {color} is replaced with the active dye's name (e.g., "minecraft:{color}_wool" → "minecraft:red_wool"). Use this when the output item follows a standard color-naming convention. Logs a warning and produces no output if the resolved item is unknown |
result |
(Optional) Static output item ({ "id": "...", "count": 1 }). The input item's data components are always transmuted onto the output. Omit when using result_pattern or when the output is the input item re-colored |
dye_component_selectors |
(Optional) List of DataComponentType<Integer> IDs to write the dye's ARGB value into. Use for modded items that store color in their own integer components rather than vanilla's minecraft:dyed_color (e.g., "sophisticatedcore:main_color"). Gate these recipes with a neoforge:mod_loaded condition |
display_rotation |
(Optional) [x, y, z] pre-rotation in degrees applied to the held item before the basin renderer tilts it onto the washboard. Full-cube block items (wool, concrete, glass blocks, etc.) are automatically detected and get a rotation that lays them flat on the slope. Only specify this to override that auto-detected value — e.g. carpet uses [-90, 0, 0] because it is a thin block, not a full cube |
display_translation |
(Optional) [x, y, z] offset in the washboard's slope-aligned frame, in blocks. Full-cube blocks automatically receive a small lift so they sit on the slope surface. Specify to fine-tune positioning for non-standard models |
display_scale |
(Optional) Scale applied to the item rendered on the washboard. Accepts a bare float for uniform scale (0.8) or an [x, y, z] array for per-axis scale ([1, 1, 0.5]). Full-cube blocks automatically receive a Z-squish to prevent them protruding through the back of the basin. Specify to override |
Color output rules — exactly one of the following determines what color is applied:
| Condition | Output item | Color applied |
|---|---|---|
result_pattern present |
New item resolved from pattern | None (color is encoded in the item ID) |
result present |
Transmuted copy of input (preserves all data components) | None (output is static) |
Neither present, dye_component_selectors non-empty |
Copy of input | Written to each listed component as an ARGB integer |
Neither present, dye_component_selectors empty |
Copy of input | Written as vanilla minecraft:dyed_color component automatically |
Default Dye Bath Items
The following items are supported out of the box. All 16 dye colors are accepted for each family unless noted. Applying a new dye to an already-colored item re-colors it.
| Item family | Ingredient tag | Notes |
|---|---|---|
| Wool | minecraft:wool |
|
| Carpet | minecraft:wool_carpets |
|
| Terracotta | c:terracotta |
Includes plain (uncolored) terracotta |
| Glass / Stained Glass | c:glass_blocks |
Includes plain minecraft:glass; dyeing it produces stained glass |
| Glass Pane / Stained Glass Pane | c:glass_panes |
Includes plain minecraft:glass_pane; dyeing it produces a stained glass pane |
| Glazed Terracotta | c:glazed_terracotta |
|
| Candle | minecraft:candles |
Includes plain (uncolored) candle |
| Bed | minecraft:beds |
|
| Banner | minecraft:banners |
Applied banner patterns are preserved across re-dyes |
| Shulker Box | c:shulker_boxes |
Includes undyed shulker box; inventory contents are preserved |
| Concrete Powder | c:concrete_powder |
|
| Concrete | c:concrete |
|
| Leather armor & wolf armor | minecraft:dyeable |
Uses minecraft:dyed_color component; any item added to this tag is automatically compatible |
Any mod item added to the minecraft:dyeable tag is automatically compatible with the dyeable recipe.
Custom Dyeing Recipes
Color-pattern dyeing — one recipe covers all 16 dyes for wool. {color} is substituted with the active dye name at craft time:
{
"type": "seamsandstitches:dye_bath",
"ingredient": { "tag": "minecraft:wool" },
"result_pattern": "minecraft:{color}_wool"
}
Vanilla dyed items — one recipe covers all 16 dyes for leather armor. Omitting result and result_pattern copies the input item and writes minecraft:dyed_color automatically:
{
"type": "seamsandstitches:dye_bath",
"ingredient": { "tag": "minecraft:dyeable" },
"display_scale": 0.8
}
Modded container dyeing — for items that store color in their own integer data component rather than vanilla's minecraft:dyed_color, use dye_component_selectors to name those components. The input item is copied with all data components preserved, then each listed component is written with the dye's ARGB value:
{
"neoforge:conditions": [{ "type": "neoforge:mod_loaded", "modid": "examplemod" }],
"type": "seamsandstitches:dye_bath",
"ingredient": { "tag": "c:example_dyeable_items" },
"dye_component_selectors": ["examplemod:primary_color"],
"display_scale": 0.8
}
Cross-mod color conversion — when a mod's colored item set has no white variant, use a specific dye: "white" recipe with a static result to redirect to the vanilla equivalent. Pair it with a general result_pattern recipe for the other 15 colors:
{
"type": "seamsandstitches:dye_bath",
"ingredient": { "tag": "examplemod:colored_items" },
"dye": "white",
"result": { "id": "minecraft:string", "count": 1 }
}
Tanning Rack
Leather no longer drops directly from animals — cows, mooshrooms, horses, donkeys, mules, llamas, and hoglins instead drop a species-specific raw hide item. Hides can only be tanned back into leather with the Tanning Rack.
Building and Using the Rack
The Tanning Rack is a 2×2×2 block made by 6 sticks and 3 planks.
Slots:
| Slot | Purpose |
|---|---|
| 4 hide slots | Each holds a single hide (any species), stretched and displayed in the frame. Progress ticks independently per slot |
| 1 lye slot | Holds seamsandstitches:lye, consumed one per hide |
Tanning process:
- Insert up to 4 hides, one per slot.
- Insert lye. One lye is consumed the moment a hide begins tanning.
- Lye is crafted from 2 Sand + 2 Bone Meal placed diagonally (2×2 grid).
- Each slot finishes independently and converts its hide into leather.
Screenshots
Gallery
Versions
Files
Relations
Project Relations
More like this
Similar Mods
Suggestions use data such as tags, dependencies, dependents, descriptions, titles, and more to rank how much they overlap with this mod.
On ModDex
Community snapshot
By the numbers
Statistics
Want to reach Minecraft players?
We're looking for a server hosting partner to feature here and other parts of the site. Interested? Send us a message!
Get in touchGet it on
Available Platforms
On ModDex
Community snapshot
By the numbers
Statistics
Resources