This hanging holder keeps two spare toilet rolls in reach without using any floor or counter space. It has two round baskets covered in puff stitches, stacked on a long backing panel that hangs from a wooden ring. You can hang it on a towel hook, a robe hook or a single screw.
The main color is a warm rust, close to terracotta. Each basket has a cream rim that frames the opening. Together the colors look calm and natural, so the holder suits a bathroom with wood, brass or white fixtures. The puff stitches add texture and make the basket walls sturdy enough to keep their shape.
This pattern uses US crochet terms. The finished holder is about 20 in (50.8 cm) long laid flat and 4 in (10.2 cm) wide at the panel. Each basket is about 5.5 in (14.0 cm) across the opening and 4.75 in (12.1 cm) tall, so a standard roll fits easily.
You make it in a few parts. First you crochet two baskets, each starting with a flat round base and continuing up into the puff-stitch wall and cream rim. Next you work the backing panel in rows and taper the top into a strap. Finally, you sew the baskets to the panel and fold the strap over the ring.
Finished Size and Construction
- Finished size: 20 in (50.8 cm) long laid flat, about 18 in (45.7 cm) hanging length below the ring
- Skill level: Easy-intermediate
- Terminology: US crochet terms
- Yarn weight: Worsted (#4) cotton
- Hook: 5.0 mm (H-8)
- Number of pieces: 4 (2 baskets, 1 backing panel, 1 wooden ring)
- Layout: Baskets stacked vertically on the panel with a 1.5 in (3.8 cm) gap between them
- Basket size: 5.5 in (14.0 cm) across, 4.75 in (12.1 cm) tall
- Basket size before the rim: about 3.9 in (9.9 cm) tall
- Rim depth: 3 rounds, about 0.85 in (2.2 cm)
- Panel size: 4 in (10.2 cm) wide × 20 in (50.8 cm) long
Materials
Yarn: Use a smooth worsted cotton or a cotton blend. Cotton holds its shape in a damp bathroom and makes clearly defined puffs. Avoid very splitty yarn, because puffs pull up several loops at once.
- Color A (rust): 200 g, about 310 m
- Color B (cream): 25 g, about 40 m
The quantities include a margin of roughly 15%, so you have enough for a gauge swatch and small differences in tension.
Tools:
– 5.0 mm (H-8) crochet hook
– Wooden ring, 3 in (7.6 cm) across
– 6 locking stitch markers
– Tapestry needle
– Scissors
– Measuring tape
– Rust-proof pins and a blocking mat
Abbreviations (US Terms)
- ch: chain
- sl st: slip stitch
- sc: single crochet
- sc2tog: single crochet 2 together
- BLO: back loop only
- st(s): stitch(es)
- sp: space
- rnd(s): round(s)
- inc: 2 sc in the same st
Puff stitch (puff): Yarn over, insert the hook in the st or sp, yarn over and pull up a loop to about 0.75 in (1.9 cm). Repeat this 3 more times in the same place (9 loops on the hook). Yarn over and pull through all 9 loops. The ch-1 that follows in the pattern locks the puff closed.
Gauge and Checkpoints
Gauge: 14 sc and 14 rows = 4 in (10.2 cm) in sc rows.
Make one basket base before you start anything else. It doubles as your gauge test, and everything else in the pattern is sized from it.
Checkpoints:
– After base Rnd 5: about 2.75 in (7.0 cm) across
– After base Rnd 10: about 5.5 in (14.0 cm) across
– After puff Rnd 18: the wall is about 3.6 in (9.1 cm) tall above the base ridge
– Finished basket: 4.75 in (12.1 cm) tall
– Panel after Row 14: 4 in (10.2 cm) long and 4 in (10.2 cm) wide
If your base is too big, go down to a 4.5 mm hook. If it is too small or feels stiff, go up to a 5.5 mm hook. A toilet roll is about 4.25 in (10.8 cm) across, so the basket opening must stay at least 5 in (12.7 cm) wide.

Basket (Make 2)
Base
Use Color A.
Rnd 1: Make a magic ring, ch 1, then work 6 sc into the ring. Join with a sl st to the first sc. (6 sts)
Rnd 2: Ch 1, inc in each st around. Join. (12 sts)
Rnd 3: Ch 1, [sc 1, inc] 6 times. Join. (18 sts)
Rnd 4: Ch 1, [sc 2, inc] 6 times. Join. (24 sts)
Rnd 5: Ch 1, [sc 3, inc] 6 times. Join. (30 sts)
Checkpoint: about 2.75 in (7.0 cm) across.
Rnd 6: Ch 1, [sc 4, inc] 6 times. Join. (36 sts)
Rnd 7: Ch 1, [sc 5, inc] 6 times. Join. (42 sts)
Rnd 8: Ch 1, [sc 6, inc] 6 times. Join. (48 sts)
Rnd 9: Ch 1, [sc 7, inc] 6 times. Join. (54 sts)
Rnd 10: Ch 1, [sc 8, inc] 6 times. Join. (60 sts)
Checkpoint: the base is flat and about 5.5 in (14.0 cm) across. If it ruffles, go down a hook size. If it cups, go up a hook size.
Wall
Rnd 11 (turning ridge): Ch 1, sc in the BLO of each st around. Join. (60 sts)
Working in the back loops leaves a ridge that turns the wall upward.
Rnd 12: Ch 1, sc in each st around. Join. (60 sts)
Rnd 13 (first puff rnd): Ch 2 (this does not count as a st). [Puff in the next st, ch 1, skip the next st] 30 times. Join with a sl st to the top of the first puff. (30 puffs + 30 ch-1 sps = 60 sts)
Rnd 14: Sl st into the next ch-1 sp, ch 2. Work a puff in the same sp, ch 1. Then [puff in the next ch-1 sp, ch 1] 29 times. Join to the first puff. (30 puffs + 30 ch-1 sps = 60 sts)
Because each puff sits in the gap between two puffs from the round below, the rows are staggered. That gives the scalloped, bumpy texture.
Rnds 15–18: Repeat Rnd 14 four more times. (30 puffs + 30 ch-1 sps per round)
The puffs are slightly wider than one sc, so the wall bulges gently outward, just like the rounded body in the photo.
Checkpoint: there are 6 puff rounds in total, and the wall is about 3.6 in (9.1 cm) tall above the ridge.
Rnd 19 (conversion rnd): Ch 1, sc in the top of each puff and in each ch-1 sp around. Join with a sl st, pulling Color B through for the join. Fasten off Color A. (30 sc in puffs + 30 sc in ch-1 sps = 60 sts)
Checkpoint: about 3.9 in (9.9 cm) tall before the rim.
Rim (Border)
Rim gauge: The rim uses the same sc gauge as the base, 14 sts = 4 in (10.2 cm).
Use Color B.
Rnd 20: Ch 1, sc in each st around. Join. (60 sts)
Rnd 21: Ch 1, sc in each st around. Join. (60 sts)
Rnd 22: Ch 1, sc in each st around. Join with an invisible join. Fasten off and weave in the ends. (60 sts)
Place 4 stitch markers 15 sts apart to split the rim into quarters (4 × 15 = 60). This helps you center the basket on the panel later.
Why the math works: The base ends with 60 sts. Every wall round also holds exactly 60 stitch positions: 30 puffs and 30 spaces in the puff rounds, and 60 sc in the plain rounds. Because nothing is added or removed, the wall rises straight up from the base. The rim’s 60 sts measure about 17.1 in (43.4 cm) around, which gives an opening of about 5.5 in (14.0 cm). A 4.25 in (10.8 cm) roll fits with room to spare.
Backing Panel (Make 1)
Use Color A.
Foundation: Ch 15.
Row 1: Sc in the 2nd ch from the hook and in each ch across. (14 sts)
Rows 2–56: Ch 1, turn, sc in each st across. (14 sts per row)
Checkpoint: the panel is 16 in (40.6 cm) long and 4 in (10.2 cm) wide.
Taper
Row 57: Ch 1, turn, sc2tog, sc 10, sc2tog. (12 sts)
Row 58: Ch 1, turn, sc across. (12 sts)
Row 59: Ch 1, turn, sc2tog, sc 8, sc2tog. (10 sts)
Row 60: Ch 1, turn, sc across. (10 sts)
Row 61: Ch 1, turn, sc2tog, sc 6, sc2tog. (8 sts)
Row 62: Ch 1, turn, sc across. (8 sts)
Row 63: Ch 1, turn, sc2tog, sc 4, sc2tog. (6 sts)
Strap
Rows 64–70: Ch 1, turn, sc across. (6 sts per row)
Fasten off, leaving a 12 in (30.5 cm) tail.
Checkpoint: 70 rows = 20 in (50.8 cm). The taper (Rows 57–63) is 2 in (5.1 cm) long. The strap (Rows 64–70) is 2 in (5.1 cm) long and about 1.7 in (4.3 cm) wide.
Make All Pieces
- Baskets: 2, worked in Color A with Color B rims (about 75 g of A and 12 g of B each)
- Backing panel: 1, in Color A (about 30 g)
- Wooden ring: 1
Layout (front view, top to bottom):
( ring )
[strap] Rows 64–70
/taper \ Rows 57–63
| panel | Rows 41–56, plain
|BASKET 1| Rows 24–40
| gap | Rows 20–23
|BASKET 2| Rows 3–19
| panel | Rows 1–2
Joining
Method: Whipstitch with a long tail of Color A and a tapestry needle.
- Lay the panel flat with the right side facing up, and Row 1 at the bottom.
- Mark the center 10 sts of Row 3 and the center 10 sts of Row 19, leaving 2 sts free on each side.
- Take a basket and pick 10 neighboring rim sts at the back, centered between two quarter markers. Then find the 10 BLO ridge sts (from Rnd 11) directly below them.
- Whipstitch the 10 rim sts to the 10 sts marked on Row 19, working one basket st to one panel st. The rim gauge and the panel gauge are the same, so the stitches line up 1:1 without stretching.
- Whipstitch the 10 ridge sts to the 10 sts marked on Row 3, again working 1:1.
- To keep the back flat, tack the middle of the basket wall to the panel at Row 11 with 3 or 4 small stitches.
- Repeat steps 2–6 for the second basket, using Row 24 for the ridge and Row 40 for the rim.
Tension: Pull each stitch snug enough to close the seam, but not so tight that the panel puckers. The panel should still lie flat and measure 4 in (10.2 cm) wide behind each basket.
Ring: Fold the strap from front to back over the wooden ring. Sew Row 70 to the back of the panel across Row 61, then weave in the tail.
Size checkpoint: the panel is 20 in (50.8 cm) laid flat. The baskets are 1.5 in (3.8 cm) apart, and the lower basket sits about 0.5 in (1.3 cm) above the bottom edge.
Final Blocking
- Lightly spray the whole holder with water until it is damp but not soaking.
- Pin the panel flat at 4 in (10.2 cm) × 20 in (50.8 cm), making sure the edges are straight.
- Stuff each basket with a toilet roll or a rolled towel to round out the walls.
- Gently pinch any flattened puffs back into shape with your fingers.
- Let it dry completely, which takes about 24 hours.
- Take out the stuffing and hang the holder.
Final Quality-Control Checklist
- Both bases lie flat and measure 5.5 in (14.0 cm) across
- Each basket has 6 staggered puff rounds of 30 puffs
- The rims are 3 rounds of Color B with 60 sts each
- The panel is 14 sts wide with even edges
- The taper goes 14 → 12 → 10 → 8 → 6 sts
- The baskets are centered and level, with a 1.5 in (3.8 cm) gap between them
- The strap is sewn securely around the ring
- All ends are woven in
Troubleshooting
The base ruffles: Your tension is loose or you have too many sts. Recount each round and go down a hook size.
The base cups upward: Your tension is tight. Go up a hook size.
The puffs look flat: Pull the loops up taller, to a full 0.75 in (1.9 cm), and keep them all the same height.
There are holes between the puffs: Your ch-1 is too loose. Make it snug.
The basket is too tight for a roll: Rework it with a larger hook. The opening needs to be at least 5 in (12.7 cm).
The panel curls: Block it flat. Check that you made a ch 1 at the start of every row and didn’t count it as a stitch.
The baskets tilt forward: Add more tacking stitches along the middle of the back wall.
Care
Hand wash in cool water and lay flat to dry, shaping the baskets as they dry. Don’t wring the holder or put it in the dryer, because that crushes the puffs.

Final Notes
Everything in this pattern follows from the gauge: 14 sc = 4 in (10.2 cm). The base grows to 60 sts, about 5.5 in (14.0 cm) across. The wall keeps those 60 sts all the way up through 6 puff rounds and a 3-round rim, so each basket ends 4.75 in (12.1 cm) tall. The panel is 14 sts wide and 70 rows long, tapering to a 6-st strap, for a total of 20 in (50.8 cm). The baskets join to it one stitch to one stitch. If you hit each checkpoint along the way, the finished holder will hang straight and hold two rolls.
Happy crocheting!