This hanging toilet paper holder has three round baskets stacked in one vertical column, and each basket holds one standard roll. A short strap links each pair of baskets. A longer strap loops over a wooden ring at the top, so the whole set hangs from one wall hook.
The holder uses one color, a soft dusty rose. Each basket has a solid round base, a solid band at the bottom of the sides, an open mesh body, and a raised puff-stitch heart on the front. A reverse single crochet rim with a rope texture finishes the top edge. The style is cozy and cottage-inspired.
The pattern uses US crochet terms. Each basket is 5 in (12.7 cm) across and 4 in (10.2 cm) tall. The joined holder is about 14 in (35.6 cm) from the bottom of the lowest basket to the highest rim. It is about 18.75 in (47.6 cm) long to the top of the ring.
How it’s made: crochet three identical baskets in joined rounds from the base up, add a rim border to each one, make three straps in rows, then sew the pieces together along the back, matching stitch to stitch.
Finished Size and Construction
- Finished size: about 5 in (12.7 cm) wide x 18.75 in (47.6 cm) long, including the ring
- Skill level: Intermediate (puff stitches, reverse single crochet)
- Terminology: US crochet terms
- Yarn weight: Worsted (#4) cotton or cotton blend
- Hook: 5.0 mm (H-8)
- Number of pieces: 3 baskets, 2 connector straps, 1 hanging strap
- Layout: 1 column of 3 baskets, with a 1 in (2.5 cm) gap between baskets
- Piece size: each basket is 5 in (12.7 cm) in diameter x 4 in (10.2 cm) tall
- Size before border: each basket is 5 in (12.7 cm) in diameter x 3.5 in (8.9 cm) tall
- Border depth: 0.5 in (1.3 cm), 2 rounds
Materials
Choose a firm worsted-weight cotton. Cotton holds its shape, copes well with bathroom humidity, and shows puff stitches clearly.
- Dusty Rose: 200 g / about 380 m (416 yd), based on about 190 m per 100 g. The holder itself uses about 165 g.
These quantities include a margin for your gauge swatch and for differences in tension.
Tools:
– 5.0 mm (H-8) crochet hook
– 1 wooden ring, 2.75 in (7.0 cm) in diameter
– Tapestry needle
– 6 stitch markers
– Measuring tape
– Scissors
– Small towel for blocking
Abbreviations (US Terms)
- ch – chain
- sl st – slip stitch
- sc – single crochet
- dc – double crochet
- BLO – back loop only
- sp – space
- st(s) – stitch(es)
- rev sc – reverse single crochet (crab stitch): work from left to right. Insert the hook in the next st to the right, yo, pull up a loop, yo, pull through both loops.
- puff – puff stitch (see below)
Puff stitch: (Yo, insert hook in the indicated st or sp, yo, pull up a loop to about 0.5 in / 1.3 cm) 4 times, giving 9 loops on the hook. Yo, pull through all 9 loops, then ch 1 to close. The closing ch does not count as a st. Each puff counts as 1 st and replaces 1 ch-1 sp in the mesh.
Gauge and Checkpoints
Gauge:
– In dc rounds: 15 dc and 8 rounds = 4 in (10.2 cm).
– In sc rows (for the straps): 15 sc and 16 rows = 4 in (10.2 cm).
Make one complete basket first, without the border, and measure it before you make the others. Each dc round adds about 1 in (2.5 cm) to the diameter of the base. On the sides, each dc round adds about 0.5 in (1.3 cm) of height.
Checkpoints:
– After Round 1: base about 1 in (2.5 cm) across
– After Round 3: base about 3 in (7.6 cm) across
– After Round 5: base 5 in (12.7 cm) across, lying flat
– After Round 6: circumference 16 in (40.6 cm)
– After Round 12: sides 3.5 in (8.9 cm) tall, measured from the fold ridge
– After Round 14: total height 4 in (10.2 cm)
If the base is too big: go down to a 4.5 mm hook.
If the base is too small: go up to a 5.5 mm hook. A basket 4.75 in (12.1 cm) across or smaller may not fit a roll, so test with a real roll after Round 6.

Basket (Make 3)
Work in joined rounds with the right side facing, and do not turn. The ch 3 at the start of a round counts as 1 dc. Join each round with a sl st to the top of the beginning ch 3, or to the third ch of the beginning ch 4.
Base
Round 1: Make a magic ring, ch 3, then work 11 dc in the ring. Join and pull the ring closed. (12 sts)
Round 2: Ch 3, dc in the same st, then 2 dc in each st around. Join. (24 sts)
Round 3: Ch 3, dc in the same st, dc in the next st, 2 dc in the next st, dc in the next st; repeat around. Join. (36 sts)
Round 4: Ch 3, dc in the same st, dc in the next 2 sts, 2 dc in the next st, dc in the next 2 sts; repeat around. Join. (48 sts)
Round 5: Ch 3, dc in the same st, dc in the next 3 sts, 2 dc in the next st, dc in the next 3 sts; repeat around. Join. (60 sts)
The base should lie flat and measure 5 in (12.7 cm) across.
Sides
Round 6 (turning round): Ch 3, dc in the BLO of each st around. Join. (60 sts)
Working in the back loops turns the fabric upward. It also leaves a ridge of unworked front loops from Round 5 on the outside, which you’ll use for joining. Round 6 forms the solid band at the bottom of the sides.
About the mesh rounds:
– Each mesh unit is 2 sts: 1 dc plus 1 ch-1 sp (or 1 puff).
– Each round has 30 units, numbered 1–30 starting from the join.
– The heart is centered on unit 16, directly opposite the join.
– On Round 7, place markers in units 13 and 19 to frame the heart.
Round 7 (heart row 1): Ch 4 (counts as dc and ch 1), skip the next st, dc in the next st, ch 1, skip the next st; repeat until unit 15 is complete. For unit 16, work dc in the next st, then a puff in the next st. Repeat dc in the next st, ch 1, skip the next st to the end. Join. (60 sts: 30 dc, 29 ch-1 sps, 1 puff)
From Round 8 on, work each unit’s dc into the dc below it. Work each ch-1 or puff into the ch-1 sp or puff below it.
Round 8 (heart row 2): Ch 4, then dc in the next dc, ch 1 through unit 14. In units 15–17, work dc in the next dc, then a puff in the next sp. Repeat dc in the next dc, ch 1 to the end. Join. (60 sts: 30 dc, 27 ch-1 sps, 3 puffs)
Round 9 (heart row 3): Work as for Round 8, with puffs in units 14–18. (60 sts: 30 dc, 25 ch-1 sps, 5 puffs)
Round 10 (heart row 4): Work as for Round 8, with puffs in units 13–19. (60 sts: 30 dc, 23 ch-1 sps, 7 puffs)
Round 11 (heart row 5): Work as for Round 8, with puffs in units 14, 15, 17, and 18. Unit 16 gets a plain ch 1, which forms the dip between the two lobes. (60 sts: 30 dc, 26 ch-1 sps, 4 puffs)
The finished heart has 20 puffs, with the point at the bottom. It is about 3.75 in (9.5 cm) wide and 2.5 in (6.4 cm) tall.
Round 12 (top band): Ch 3, then dc in each dc, each ch-1 sp, and the top of each puff around. Join. (30 dc over dc + 30 dc over sps and puffs = 60 sts)
The sides now measure 3.5 in (8.9 cm) from the fold ridge. Push the puffs outward from the inside so the heart stands out. Keep the yarn attached for the border.
Make All Pieces
Baskets: Make 3 baskets in Dusty Rose. Each uses about 50 g.
Connector straps (make 2):
– Ch 7.
– Row 1: Sc in the 2nd ch from the hook and in each ch across, turn. (6 sc)
– Rows 2–10: Ch 1, sc in each st across, turn. (6 sc)
– Fasten off, leaving a 12 in (30.5 cm) tail.
Each connector strap is 1.6 in (4.1 cm) wide x 2.5 in (6.4 cm) long.
Hanging strap (make 1): Work as for a connector strap, continuing through Row 26. (6 sc) Fasten off, leaving a 24 in (61.0 cm) tail. The strap is 1.6 in (4.1 cm) wide x 6.5 in (16.5 cm) long.
All three straps together use about 15 g.
Layout (top to bottom, back view):
[ wooden ring ]
[hanging strap]
[ Basket A ] <- top
[ connector 1 ]
[ Basket B ] <- middle
[ connector 2 ]
[ Basket C ] <- bottom
Joining
Join the pieces with a whip stitch on the back, using the strap tails. Line up each 6-st strap end with the 6 back-center sts of a basket: sts 58, 59, 60, 1, 2, and 3. Sew each strap st to exactly 1 basket st. The strap hides the round join.
Connector strap 1 (Basket B to Basket A):
1. Lay Rows 1–2 of the strap flat on the outside of Basket B, over Round 12, sts 58–3. Whip stitch around the edges, sewing 1 basket st to each strap st.
2. Let Rows 3–4 pass over the 0.5 in (1.3 cm) border without sewing them.
3. Rows 5–8 form the open 1 in (2.5 cm) gap.
4. Lay Rows 9–10 over Round 6 on the back of Basket A. Sew the last row into the 6 unworked front loops of Round 5 (sts 58–3), then sew down both side edges.
Connector strap 2: Repeat these steps to join Basket C to Basket B.
Hanging strap:
1. Sew Rows 1–2 to Round 12 of Basket A, the same way as the connector straps.
2. Let Rows 3–4 pass over the border.
3. Rows 5–12 rise 2 in (5.1 cm) above the rim.
4. Wrap Rows 13–18 around the ring. This takes 1.5 in (3.8 cm).
5. Fold Rows 19–26 down behind Rows 5–12 and whip stitch them together, row to row.
Tension: Pull each whip stitch snug but not tight, so the strap lies flat without puckering the basket. Each strap should hang straight down from the center back.
Size checkpoint: Hang the holder and measure it.
– From the bottom of Basket C to the rim of Basket A: 14 in (35.6 cm)
– To the top of the ring: about 18.75 in (47.6 cm)
– Each gap between baskets: 1 in (2.5 cm)
Border
Work the border on each basket before joining. It is a rim finish, so each basket keeps its own stitch count.
Border gauge: 15 sc = 4 in (10.2 cm). This matches the dc body gauge, so you work 1 sc into each st.
For counting, divide the rim into two halves:
– Front half: sts 17–46, centered on the heart (unit 16 = sts 31–32).
– Back half: sts 47–60 and 1–16, centered on the join.
Round 13: Ch 1, sc in each st around. Join to the first sc. (60 sc: 30 front, 30 back)
Round 14: Ch 1, then rev sc in each st around, working from left to right. Join to the first rev sc. Fasten off and weave in the ends. (60 rev sc: 30 front, 30 back)
Why the math works: Round 12 has 60 sts, which measure 16 in (40.6 cm) around. The border gauge is also 15 sts per 4 in (10.2 cm), so its 60 sts measure the same 16 in (40.6 cm). Because no sts are added or removed, the rim doesn’t flare or pull in. Each half is 30 sts, or 8 in (20.3 cm). The two border rounds add 0.5 in (1.3 cm), so the basket grows from 3.5 in (8.9 cm) to 4 in (10.2 cm) tall.
Final Blocking
- Lightly mist the holder with water, or steam it from 1 in (2.5 cm) away without letting the iron touch the yarn.
- Stuff each basket with a rolled small towel or a toilet roll.
- Shape each base flat and each side straight up. Check that each basket is 5 in (12.7 cm) across.
- Pinch the puffs outward to round out the hearts.
- Lay the straps flat and smooth the edges.
- Let the holder dry completely, about 12–24 hours, before hanging it.
Final Quality-Control Checklist
- 3 baskets, each with 60 sts per round from Round 5 on
- Each heart has 20 puffs and sits opposite the round join
- Bases lie flat at 5 in (12.7 cm) across
- Each basket is 4 in (10.2 cm) tall
- Both border rounds have 60 sts (30 front, 30 back)
- Straps are 6 sts wide and centered over sts 58–3
- Gaps between baskets are 1 in (2.5 cm)
- All ends are woven in securely
- A roll slides in and out easily
Troubleshooting
The heart is off center. Count the units from the join, not from a marker that may have moved. Unit 16 is the center.
The puffs look flat. Pull each loop up to a full 0.5 in (1.3 cm), and close each puff with a firm ch 1.
The base cups or ruffles. Cupping means your tension is tight, and ruffling means it is loose. Change hook size and redo the base.
The basket is too small for a roll. Standard rolls are about 4.5 in (11.4 cm) across. Go up a hook size and make the basket again.
The rim flares. Check that Round 13 has exactly 60 sc and that the rev sc isn’t too loose.
The baskets tip forward. Sew each strap end across all 6 sts and down both side edges, not just at the center.
Care
Hand wash in cool water with mild soap. Press out the water in a towel, then reshape and dry flat with the baskets stuffed.

Final Notes
Here is how the measurements build on each other:
– A gauge of 15 dc per 4 in (10.2 cm) gives 60 sts and a 5 in (12.7 cm) base.
– Five mesh rounds plus two solid rounds make 3.5 in (8.9 cm) sides.
– The 60-st border adds 0.5 in (1.3 cm), for a 4 in (10.2 cm) basket.
– Three baskets plus two 1 in (2.5 cm) gaps make a 14 in (35.6 cm) column.
– With the strap and ring, the holder hangs about 18.75 in (47.6 cm) long.
Check the base after Round 5 and the fit with a roll after Round 6, and the rest of the measurements will follow. Happy crocheting!