Rendering these values. This takes a few seconds.
Download STL
Read this model as text

A card sleeve wallet that prints as one flat sheet, a few layers high, and is folded into shape like a paper kit. The panels are stiff, the fold lines are thin bands that bend around the stack of cards. Two side flaps lock into slits with arrow tabs, so it needs no glue. An optional envelope flap closes the top with a tuck-in tongue, and an optional fan lever in the bottom pushes the cards up to different heights.

The image shows the solid OpenSCAD renders at cards 5 · cash_room 1 · closing_flap true · fan_lever true · panel_thickness 0.6 · fold_thickness 0.4 · card_play 1 · fold 0 · push 0 · color_wallet SteelBlue.

MIT

Origami sleeve wallet, folded from one flat print

mick/origami-sleeve-wallet@0.2.0

Remix this
Report

For a legal or policy problem: a license violation, personal data, somebody else’s work republished as their own. A model that prints badly is a comment, not a report.

Sign in to report

0reused0 remixes · 0 imports0downloads0.2.0latest

Parameters

from source
28, steps of 1
03, steps of 0.5
0.41.2, steps of 0.1
0.120.6, steps of 0.02
0.52, steps of 0.25
0100, steps of 5

Showing the render for these values.

Description

What is this

A card sleeve wallet that prints as one flat sheet, a few layers high, and is folded into shape like a paper kit. The panels are stiff, the fold lines are thin bands that bend around the stack of cards. Two side flaps lock into slits with arrow tabs, so it needs no glue. An optional envelope flap closes the top with a tuck-in tongue, and an optional fan lever in the bottom pushes the cards up to different heights.

What you use it for

A very thin wallet for a handful of cards plus bank notes folded in thirds (they fit the card-sized pocket). Made for PETG on a 180 mm bed. Print it flat with fold = 0, the lever prints beside the sheet. Then fold: drop the lever over the post on the back panel with its longest layer down, front panel up over the back so the post lands in its slot, side flaps over the front and push each arrow tab through its slit (one barb first, like a button), then the closing flap over everything with its tongue in the top slit. Push the button on the side up with your thumb and the cards fan out, the back card highest. Push the cards back in and the lever goes down with them.

Design notes

Everything folds the same way, toward the top of the print, so the bed side becomes the outside of the wallet and the thin fold layers sit on the outer surface. Each fold is a band as wide as the stack it wraps around, not a sharp crease, so it bends in a gentle curve and the wallet stays flat when it is nearly empty. The side flaps wrap around the front panel, the closing flap wraps around both, and each band is one panel thickness wider than the one below it.

The fan lever is the one part that is as thick as the card stack. It is a stack of 0.8 mm layers, one per card, that get shorter toward the front. A point further from the pivot rises higher, so each card is lifted by the tip of its own layer to its own height, while at rest the arm lies flat and all cards stand level. Layers only get shorter going up, so it prints flat without overhangs. It turns on a post that grows from the back panel and ends in a slot in the front panel, so the post is held at both ends. The button leaves the pocket through the lower part of one side, which is why that side flap is shorter than the other. The fan is cleanest when the stack lies against the back panel, so keep notes in front of the cards.

Without the lever a hole through the bottom fold lets you push the cards up. A notch in the front panel gives your thumb grip either way. The arrow tabs end up between the front panel and the cards, their heads taper so cards slide over them. The closing tongue has no barbs and points in the direction the cards go in.

Print tips: PETG, 0.2 mm layers, so panels are three layers, folds are two and each lever step is four. Set the bottom and top infill pattern to lines at 45 degrees so the lines cross every fold, never run along it. The preview at fold above 0 uses stiff bands with two 90 degree corners, the real bands curve.

Parameters

cards and cash_room set how thick the pocket is, and with that the width of every fold band and the number of steps in the lever. closing_flap adds or removes the envelope flap and its slit. fan_lever switches between the lever and the simple push hole. panel_thickness and fold_thickness are the two heights in the sheet, keep them multiples of your layer height. card_play is the room around a card. fold and push are preview only: fold 0 is what you print, 100 shows it folded, and push turns the lever, opens the closing flap and shows the cards. color_wallet is the display colour.

Use with your agent
{
  "mcpServers": {
    "remixcad": {
      "type": "http",
      "url": "https://remix-cad.vercel.app/api/mcp"
    }
  }
}
get_model("mick/origami-sleeve-wallet@0.2.0")

Returns the manifest, the source, the import closure and the license obligations. Full MCP setup.

Parameter table

Parsed from the Customizer annotations in main.scad
Parameters of Origami sleeve wallet, folded from one flat print, with the ranges the source declares
NameDefaultRangeUnitDescription
cards52 to 8 step 1
cash_room10 to 3 step 0.5
closing_flaptrue
fan_levertrue
panel_thickness0.60.4 to 1.2 step 0.1
fold_thickness0.40.12 to 0.6 step 0.02
card_play10.5 to 2 step 0.25
fold00 to 100 step 5
push00 to 100 step 10
color_wallet"SteelBlue"SteelBlue, Silver, Gainsboro, White, DimGray, Black, SlateGray, FireBrick, ForestGreen, Goldenrod

Lineage

0 models depend on this one

Only what this model came from and what came from it.

Remix, the code changed Import, used unchanged and pinned The version you are on Withdrawn, still recorded

License

Whoever downloads this takes these obligations along
  • mick/origami-sleeve-wallet@0.2.0 is MIT

Source

main.scad is the entrypoint
main.scad
// A card sleeve wallet printed as one flat sheet a few layers high and folded like a
// paper kit. Panels are stiff, fold lines are thin bands that bend around the stack of
// cards. Side flaps lock into slits with arrow tabs, so it needs no glue.
// Everything folds toward the top of the print: the bed side becomes the outside.
// An optional lever in the bottom fans the cards out at different heights.

/* [Wallet] */
// Number of cards it should hold.
cards = 5; // [2:1:8]
// Extra room for folded bank notes, in mm.
cash_room = 1; // [0:0.5:3]
// Envelope flap that closes the top.
closing_flap = true;
// Lever in the bottom that pushes the cards up to different heights.
fan_lever = true;

/* [Print] */
// Thickness of the panels. Three layers of 0.2.
panel_thickness = 0.6; // [0.4:0.1:1.2]
// Thickness of the fold lines. Two layers of 0.2.
fold_thickness = 0.4; // [0.12:0.02:0.6]
// Room around a card, per side.
card_play = 1; // [0.5:0.25:2]

/* [Preview] */
// 0 is the flat sheet you print. 100 shows it folded.
fold = 0; // [0:5:100]
// How far the lever is pushed. Shows the cards, only when fold is above 0.
push = 0; // [0:10:100]

/* [Colour] */
// Display only, the STL carries no colour.
color_wallet = "SteelBlue"; // [SteelBlue, Silver, Gainsboro, White, DimGray, Black, SlateGray, FireBrick, ForestGreen, Goldenrod]

/* [Hidden] */
$fn = 48;
card_w = 85.6;
card_h = 54;
card_t = 0.76;

t = panel_thickness;
ft = min(fold_thickness, t);

// Lever
slab = 0.8;                 // one lever step per card, four layers of 0.2
lever_t = cards * slab;
eye_r = 4;                  // round end of the lever around the pivot
post_d = 3.6;
lever_zone = fan_lever ? 2 * eye_r + 1 : 0;   // strip under the cards where the lever lies
max_lift = 18;              // back card
min_lift = 6;               // front card
btn_w = 8;

W = card_w + 2 * card_play;          // back panel
H = fan_lever ? lever_zone + card_h + card_play + 0.5 : card_h + 2 * card_play;
Wf = W - 1.5;                         // front panel, clear of the side folds
Hf = H - 1;
// pocket thickness, the tabs lie inside too
inner = max(cards * card_t + cash_room + t, fan_lever ? lever_t + 0.4 : 0);
s_front = inner + 2 * t;              // fold band around the cards
s_side = s_front + t;                 // around the cards and the front panel
s_lid = s_side + t;                   // around the side flaps as well

r = 3;            // corner radius of the panels
edge = r + 1;     // folds stop this far from a corner
flap_w = 18;
lid_h = 18;
lid_taper = 14;
neck_w = 12;
neck_l = 2.5;
head_l = 9;
barb = 2;
tip_w = 4;
tongue_w = 20;
tongue_l = 9;
slit = t + 0.6;
push_r = 9;

// Pivot in the bottom left corner, arm to the right, button out of the right side.
xp = -W / 2 + eye_r + 1;
yp = eye_r + 1;
L1 = card_w / 2 - xp;                 // pivot to the far bottom corner of a card
sin_max = max_lift / L1;
th = asin(sin_max) * push / 100;
btn_x0 = W / 2 + 1.5 - xp;            // button starts just outside the pocket
// The right side fold starts above the path of the button.
y0_right = fan_lever ? ceil(yp + 1 + (btn_x0 + btn_w / 2) * sin_max + 4.5) : edge;

function lift_target(k) = max_lift - (k - 1) * (max_lift - min_lift) / (cards - 1);
function slab_len(k) = L1 * lift_target(k) / max_lift;
function card_lift(k) = max(0, slab_len(k) * sin(th) - eye_r * (1 - cos(th)));

A = 90 * fold / 100;                  // each fold band turns 90 degrees at both of its edges
A_lid = A * (1 - push / 100);         // pushing the lever shows the flap open
D = 20 * fold / 100;                  // tabs dive through their slit

echo(str("Flat sheet: ", W + 2 * (s_side + flap_w + neck_l + head_l), " x ",
  H + s_front + Hf + (closing_flap ? s_lid + lid_h + tongue_l : 0), " mm"));

// ---- 2D helpers ----
module rounded(rad) { offset(r = rad) offset(delta = -rad) children(); }

// A slot with round ends, long side along x.
module slot(l, w) {
  hull() for (s = [-1, 1]) translate([s * (l - w) / 2, 0]) circle(d = w);
}

// Without the lever: a hole through the bottom fold to push the cards up.
module push_hole2d() { if (!fan_lever) translate([0, -s_front / 2]) circle(r = push_r); }

// ---- Panels, in print coordinates ----
module back2d() {
  difference() {
    rounded(r) translate([-W / 2, 0]) square([W, H]);
    push_hole2d();
  }
}

module front2d() {
  difference() {
    rounded(r) translate([-Wf / 2, -s_front - Hf]) square([Wf, Hf]);
    push_hole2d();
    // thumb notch in the top edge
    translate([0, -s_front - Hf - 3]) circle(r = 11);
    // slits for the side tabs, left and right
    translate([-(W / 2 - flap_w - 0.2 - slit / 2), -s_front - H / 2])
      rotate(90) slot(neck_w + 1.5, slit);
    translate([W / 2 - flap_w - 0.2 - slit / 2, -s_front - (y0_right + H - edge) / 2])
      rotate(90) slot(neck_w + 1.5, slit);
    // slit for the closing tongue
    if (closing_flap)
      translate([0, -s_front - (H - lid_h - 0.2 - slit / 2)]) slot(tongue_w + 1, slit);
    // the pivot post ends here, a slot because the real fold is not square
    if (fan_lever)
      translate([xp, -s_front - yp]) rotate(90) slot(post_d + 2.6, post_d + 0.6);
  }
}

module band_front2d() {
  difference() {
    translate([-Wf / 2 + r, -s_front - 0.05]) square([Wf - 2 * r, s_front + 0.1]);
    push_hole2d();
  }
}

// Right side between y0 and y1, the left is its mirror.
module band_side2d(y0, y1) { translate([W / 2 - 0.05, y0]) square([s_side + 0.1, y1 - y0]); }

module flap2d(y0, y1) {
  x0 = W / 2 + s_side;
  taper = min(8, (y1 - y0 - 22) / 2);
  hull() {
    translate([x0 - 0.01, y0]) square([0.02, y1 - y0]);
    for (y = [y0 + taper + 2, y1 - taper - 2])
      translate([x0 + flap_w - 2, y]) circle(r = 2);
  }
}

module tab2d(yc) {
  x1 = W / 2 + s_side + flap_w;
  hw = neck_w + 2 * barb;
  translate([x1 - 0.01, yc - neck_w / 2]) square([neck_l + 1, neck_w]);
  hull() {
    for (s = [-1, 1]) translate([x1 + neck_l + 0.75, yc + s * (hw / 2 - 0.75)]) circle(d = 1.5);
    translate([x1 + neck_l + head_l - tip_w / 2, yc]) circle(d = tip_w);
  }
}

module band_lid2d() { translate([-(W / 2 - edge), H - 0.05]) square([W - 2 * edge, s_lid + 0.1]); }

module lid2d() {
  yb = H + s_lid;
  a = W / 2 - edge;
  hull() {
    translate([-a, yb - 0.01]) square([2 * a, 0.02]);
    for (s = [-1, 1]) translate([s * (a - lid_taper - 3), yb + lid_h - 3]) circle(r = 3);
  }
}

module tongue2d() {
  ye = H + s_lid + lid_h;
  hull() {
    translate([-tongue_w / 2, ye - 0.01]) square([tongue_w, 0.02]);
    for (s = [-1, 1]) translate([s * (tongue_w / 2 - 4), ye + tongue_l - 4]) circle(r = 4);
  }
}

// ---- Fan lever, pivot at the origin, arm along x ----
// One layer of the arm. Its top edge is level with the top of the eye, so at rest every
// card stands on the same line. The tip of each layer is what lifts its card.
module slab2d(len) {
  hull() {
    circle(r = eye_r);
    translate([len - 1.5, eye_r - 1.5]) circle(r = 1.5);
    translate([len - 1.5, -0.5]) circle(r = 1.5);
  }
}

module lever3d() {
  difference() {
    union() {
      // layers get shorter toward the front, so they print without overhang
      for (k = [1 : cards])
        translate([0, 0, (k - 1) * slab])
          linear_extrude(height = slab) slab2d(k == 1 ? btn_x0 + 2 : slab_len(k));
      // button outside the pocket, full height for the thumb
      linear_extrude(height = lever_t)
        translate([btn_x0, -2]) rounded(1.5) square([btn_w, 6]);
    }
    translate([0, 0, -1]) cylinder(d = post_d + 0.5, h = lever_t + 2);
  }
}

// Cards, preview only.
module cards3d() {
  for (k = [1 : cards])
    color(k % 2 == 1 ? "WhiteSmoke" : "Silver")
      translate([-card_w / 2, lever_zone + card_lift(k), t + (k - 1) * slab + 0.02])
        linear_extrude(height = card_t) rounded(3) square([card_w, card_h]);
}

// ---- Folding ----
module ext(h) { linear_extrude(height = h) children(); }
// Turn the children around a fold line on the bed: along x at height y, or along y at x.
module hinge_x(y, a) { translate([0, y, 0]) rotate(a = a, v = [1, 0, 0]) translate([0, -y, 0]) children(); }
module hinge_y(x, a) { translate([x, 0, 0]) rotate(a = a, v = [0, 1, 0]) translate([-x, 0, 0]) children(); }

module side(y0, y1) {
  hinge_y(W / 2, -A) {
    ext(ft) band_side2d(y0, y1);
    hinge_y(W / 2 + s_side, -A) {
      ext(t) flap2d(y0, y1);
      hinge_y(W / 2 + s_side + flap_w, -D) ext(t) tab2d((y0 + y1) / 2);
    }
  }
}

module wallet() {
  ext(t) back2d();
  // pivot post, through the lever and into the slot in the front panel
  if (fan_lever) translate([xp, yp, 0]) cylinder(d = post_d, h = inner + 2 * t);
  hinge_x(0, -A) {
    ext(ft) band_front2d();
    hinge_x(-s_front, -A) ext(t) front2d();
  }
  side(y0_right, H - edge);
  mirror([1, 0, 0]) side(edge, H - edge);
  if (closing_flap)
    hinge_x(H, A_lid) {
      ext(ft) band_lid2d();
      hinge_x(H + s_lid, A_lid) {
        ext(t) lid2d();
        hinge_x(H + s_lid + lid_h, D) ext(t) tongue2d();
      }
    }
}

color(color_wallet) wallet();

if (fan_lever) {
  if (fold == 0)
    // print layout: beside the front panel, under the short side flap
    color(color_wallet) translate([W / 2 + 3 + eye_r, y0_right - 3 - eye_r, 0]) rotate(-90) lever3d();
  else {
    color("Goldenrod") translate([xp, yp, t]) rotate(th) lever3d();
    if (push > 0) cards3d();
  }
}

Comments

Context, not a score. Comments never move a model up or down the results.

No comments yet

Printed it? A note about your material and the clearance you landed on saves the next person a failed print.

Sign in to comment