• Updated 30 Oct, 21:11 UTC
  • Next run 31 Oct, 05:17 UTCNext 31 Oct 05:17
  • Last 7 days: 4 new models · 475 runs7 d: 4 models · 475 runs
Chore chart for two kids

GLM 5.3 PrimeZ.ai

Chat

make a chore chart for my kids, Ava (7) and Leo (10). 2 chores each a day, mon to fri. something i can print and put on the fridge

Here's a printable chore chart built for the fridge — warm, hand-drawn feel, Ava gets coral, Leo gets teal, and everything on it is editable before you print.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Chore Chart — Ava &amp; Leo</title>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Baloo+2:wght@400;500;600;700;800&family=Caveat:wght@500;600;700&display=swap" rel="stylesheet">
<style>
  :root{
    --ink:#2c2620;
    --paper:#fffcf4;
    --desk:#e9e1d1;
    --ava:#e4572e;
    --leo:#0f766e;
    --ava-tint:rgba(228,87,46,.08);
    --leo-tint:rgba(15,118,110,.08);
    --line:#ddd2bc;
    --muted:#8a7f6d;
  }
  *{box-sizing:border-box;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  html,body{margin:0}
  ::selection{background:var(--ink);color:var(--paper)}
  body{
    font-family:'Baloo 2','Trebuchet MS',sans-serif;
    background:var(--desk);
    color:var(--ink);
    padding:26px 14px 60px;
    overflow-x:auto;
    min-height:100vh;
  }

  /* ---------- screen-only controls ---------- */
  .toolbar{display:flex;justify-content:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
  .tb{
    display:inline-flex;align-items:center;gap:8px;
    font:600 14px/1 'Baloo 2';padding:11px 17px;border-radius:999px;
    border:1.75px solid var(--ink);background:var(--paper);color:var(--ink);
    cursor:pointer;box-shadow:0 3px 0 rgba(44,38,32,.85);
    transition:transform .12s,box-shadow .12s;
  }
  .tb:hover{transform:translateY(-2px);box-shadow:0 5px 0 rgba(44,38,32,.85)}
  .tb:active{transform:translateY(1px);box-shadow:0 2px 0 rgba(44,38,32,.85)}
  .tb svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2.1;stroke-linecap:round;stroke-linejoin:round}
  .tb.primary{background:var(--ink);color:var(--paper);box-shadow:0 3px 0 rgba(44,38,32,.35)}
  .tb.primary:hover{box-shadow:0 5px 0 rgba(44,38,32,.35)}
  .tb.primary:active{box-shadow:0 2px 0 rgba(44,38,32,.35)}
  .hint{text-align:center;font:600 18px/1.3 'Caveat',cursive;color:#7c7161;margin:0 0 20px}
  .hint b{color:var(--ink)}

  /* ---------- the sheet ---------- */
  .sheet{
    position:relative;width:9.4in;min-width:780px;margin:0 auto;
    background:var(--paper);border:1px solid #e3dbc8;border-radius:14px;
    box-shadow:0 20px 45px rgba(60,50,30,.22);
    padding:38px 42px 26px;
  }
  .tape{position:absolute;width:86px;height:24px;top:-11px;opacity:.85}
  .tape.l{left:40px;transform:rotate(-5deg);background:rgba(228,87,46,.32)}
  .tape.r{right:40px;transform:rotate(4deg);background:rgba(15,118,110,.32)}

  /* header */
  .head{display:flex;justify-content:space-between;align-items:flex-start;gap:20px}
  h1{margin:0;font:700 50px/0.95 'Caveat',cursive;letter-spacing:.01em}
  .squig{display:block;margin:3px 0 0}
  .sub{margin:5px 0 0;font:600 22px/1.1 'Caveat',cursive}
  .sub .n-ava{color:var(--ava)}
  .sub .n-leo{color:var(--leo)}
  .sub .amp,.sub .muted{color:var(--muted)}
  .week{display:flex;align-items:center;gap:9px;font:600 24px/1 'Caveat',cursive;border-bottom:2px dashed var(--line);padding:6px 8px 4px;margin-top:6px;white-space:nowrap}
  .week svg{width:17px;height:17px;stroke:var(--muted);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none}
  .week [contenteditable],.reward [contenteditable]{display:inline-block;outline:none}
  .week [contenteditable]{min-width:120px}
  [contenteditable]:empty::before{content:attr(data-ph);color:#c4b8a0}

  /* shared grid geometry: day rail + 4 chore columns */
  .heads,.grid,.stars{display:grid;grid-template-columns:1.05in repeat(4,1fr);column-gap:10px}

  /* kid name banners */
  .heads{margin-top:18px;row-gap:4px}
  .kid-head{grid-column:span 2;display:flex;flex-direction:column;align-items:center}
  .kid-head.ava{--kid:var(--ava)}
  .kid-head.leo{--kid:var(--leo)}
  .kh-name{font:700 33px/1 'Caveat',cursive;color:var(--kid)}
  .kh-squig{margin:1px 0 2px}
  .kh-meta{font:700 10.5px/1 'Baloo 2';letter-spacing:.14em;text-transform:uppercase;color:var(--muted)}

  /* day rows */
  .grid{margin-top:12px;row-gap:9px}
  .day{display:flex;flex-direction:column;justify-content:center;padding-right:6px;border-right:2px dashed var(--line)}
  .day-name{font:800 16px/1 'Baloo 2';letter-spacing:.09em}
  .day-date{margin-top:3px;font:600 17px/1 'Caveat',cursive;color:var(--muted);outline:none;caret-color:var(--muted)}

  /* chore groups */
  .group{grid-column:span 2;display:grid;grid-template-columns:1fr 1fr;gap:8px;padding:8px 11px;border-radius:12px;background:var(--tint);border-left:4px solid var(--kid);min-height:66px}
  .group.ava{--kid:var(--ava);--tint:var(--ava-tint)}
  .group.leo{--kid:var(--leo);--tint:var(--leo-tint)}
  .group.ava:hover{background:rgba(228,87,46,.13)}
  .group.leo:hover{background:rgba(15,118,110,.13)}
  .chore{display:flex;align-items:center;gap:9px;min-height:48px}
  .chore + .chore{border-left:1.5px dashed rgba(44,38,32,.15);padding-left:10px}

  /* checkboxes */
  .chk{
    flex:none;width:23px;height:23px;padding:0;
    border:2.5px solid var(--kid);border-radius:7px;background:#fff;cursor:pointer;
    display:grid;place-items:center;
    box-shadow:0 1.5px 0 rgba(44,38,32,.22);
    transition:transform .15s,background .2s;
  }
  .chk svg{width:14px;height:14px;display:block}
  .chk svg path{fill:none;stroke:#fff;stroke-width:3.4;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:26;stroke-dashoffset:26;transition:stroke-dashoffset .28s ease .04s}
  .chore.done .chk{background:var(--kid);animation:pop .35s ease}
  .chore.done .chk svg path{stroke-dashoffset:0}
  @keyframes pop{0%{transform:scale(1)}45%{transform:scale(1.22) rotate(5deg)}100%{transform:scale(1)}}
  .chk:hover{transform:scale(1.1) rotate(-4deg)}
  .chk:focus-visible{outline:3px solid var(--kid);outline-offset:2px}

  /* chore text */
  .txt{
    flex:1;min-height:1.3em;margin:0;
    font:500 15.5px/1.22 'Baloo 2';
    outline:none;border-bottom:2px solid transparent;padding-bottom:1px;
    transition:border-color .15s;overflow-wrap:break-word;caret-color:var(--kid);
  }
  .txt:focus{border-bottom-color:var(--kid)}
  .chore.done .txt{color:#a19681;text-decoration:line-through;text-decoration-color:var(--kid);text-decoration-thickness:2px}

  /* star tracker */
  .stars{margin-top:18px;padding-top:10px;border-top:2px dashed var(--line);row-gap:10px;align-items:center}
  .stars-label{display:flex;align-items:center;align-self:stretch;padding-right:6px;border-right:2px dashed var(--line);font:800 12px/1.35 'Baloo 2';letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
  .star-set{grid-column:span 2;display:flex;gap:5px;flex-wrap:wrap;min-height:21px}
  .star-set.ava{--kid:var(--ava)}
  .star-set.leo{--kid:var(--leo)}
  .star{width:21px;height:21px;color:var(--kid)}
  .star path{fill:none;stroke:currentColor;stroke-width:1.7;stroke-linejoin:round}
  .star.filled path{fill:currentColor}
  .star.pop{animation:starpop .45s ease}
  @keyframes starpop{0%{transform:scale(.2) rotate(-25deg)}60%{transform:scale(1.3) rotate(10deg)}100%{transform:scale(1)}}
  .reward{grid-column:2/-1;display:flex;align-items:center;justify-content:center;gap:9px;font:700 23px/1 'Caveat',cursive;padding-top:2px}
  .reward svg{width:18px;height:18px;color:var(--muted);flex:none}
  .reward [contenteditable]{border-bottom:2px dashed var(--line);padding:0 10px 3px;min-width:2.5in;max-width:100%;text-align:center}

  /* footer */
  .foot{display:flex;justify-content:space-between;align-items:baseline;gap:20px;margin-top:16px;font:600 12px/1.4 'Baloo 2';color:var(--muted)}
  .foot p{margin:0}
  .initials{white-space:nowrap}
  .blank{display:inline-block;width:88px;border-bottom:2px solid #b9ae97;height:12px;vertical-align:baseline}

  /* toast */
  .toast{
    position:fixed;left:50%;bottom:28px;transform:translate(-50%,16px);
    background:var(--ink);color:var(--paper);font:600 14px/1 'Baloo 2';
    padding:12px 20px;border-radius:999px;opacity:0;pointer-events:none;
    transition:opacity .25s,transform .25s;z-index:60;
    box-shadow:0 10px 26px rgba(44,38,32,.35);
  }
  .toast.show{opacity:1;transform:translate(-50%,0)}

  /* ---------- print ---------- */
  @page{size:letter landscape;margin:0.35in}
  @media print{
    body{background:#fff;padding:0;overflow:visible}
    .toolbar,.hint,.toast,.tape{display:none!important}
    .sheet{width:100%;min-width:0;margin:0;border:none;border-radius:0;box-shadow:none;padding:0}
    .chk:hover{transform:none}
  }
</style>
</head>
<body>

  <div class="toolbar">
    <button class="tb primary" id="printBtn" type="button">
      <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 9V3h12v6"/><path d="M6 18H4.5A2.5 2.5 0 0 1 2 15.5v-5A2.5 2.5 0 0 1 4.5 8h15A2.5 2.5 0 0 1 22 10.5v5a2.5 2.5 0 0 1-2.5 2.5H18"/><rect x="6" y="14" width="12" height="7" rx="1.5"/></svg>
      Print
    </button>
    <button class="tb" id="shuffleBtn" type="button">
      <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M16 3h5v5"/><path d="M4 20 21 3"/><path d="M21 16v5h-5"/><path d="m15 15 6 6"/><path d="m4 4 5 5"/></svg>
      Shuffle chores
    </button>
    <button class="tb" id="resetBtn" type="button">
      <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M3 4v6h6"/><path d="M3.5 15a9 9 0 1 0 2.1-9.4L3 10"/></svg>
      Clear ticks
    </button>
  </div>
  <p class="hint">Everything on the chart is editable — click any text to tweak it. Print in <b>Landscape</b>, pop it on the fridge, tick with a pen.</p>

  <main class="sheet" id="sheet">
    <div class="tape l" aria-hidden="true"></div>
    <div class="tape r" aria-hidden="true"></div>

    <header class="head">
      <div class="title-wrap">
        <h1>Chore Chart</h1>
        <svg class="squig" width="252" height="10" viewBox="0 0 252 10" fill="none" aria-hidden="true">
          <path d="M2 7 C 22 2 40 10 62 6 S 96 2 126 6" stroke="#e4572e" stroke-width="3.4" stroke-linecap="round"/>
          <path d="M126 6 C 148 10 168 2 190 6 S 228 10 250 5" stroke="#0f766e" stroke-width="3.4" stroke-linecap="round"/>
        </svg>
        <p class="sub"><span class="n-ava">Ava</span><span class="amp"> &amp; </span><span class="n-leo">Leo</span><span class="muted"> · Monday to Friday</span></p>
      </div>
      <div class="week">
        <svg viewBox="0 0 24 24" aria-hidden="true"><rect x="3" y="4.5" width="18" height="17" rx="2.5"/><line x1="8" y1="2.5" x2="8" y2="6.5"/><line x1="16" y1="2.5" x2="16" y2="6.5"/><line x1="3" y1="10" x2="21" y2="10"/></svg>
        <span id="weekOf" contenteditable="true" spellcheck="false" data-ph="add the week"></span>
      </div>
    </header>

    <section class="heads">
      <div></div>
      <div class="kid-head ava">
        <span class="kh-name">Ava</span>
        <svg class="kh-squig" width="72" height="8" viewBox="0 0 72 8" fill="none" aria-hidden="true"><path d="M2 5 Q 10 1 18 5 T 34 5 T 50 5 T 66 5" stroke="currentColor" stroke-width="2.6" stroke-linecap="round"/></svg>
        <span class="kh-meta">age 7 · two chores a day</span>
      </div>
      <div class="kid-head leo">
        <span class="kh-name">Leo</span>
        <svg class="kh-squig" width="66" height="8" viewBox="0 0 66 8" fill="none" aria-hidden="true"><path d="M2 5 Q 10 1 18 5 T 34 5 T 50 5 T 64 5" stroke="currentColor" stroke-width="2.6" stroke-linecap="round"/></svg>
        <span class="kh-meta">age 10 · two chores a day</span>
      </div>
    </section>

    <section class="grid" id="grid"></section>

    <section class="stars">
      <div class="stars-label">Stars earned</div>
      <div class="star-set ava" id="starsAva"></div>
      <div class="star-set leo" id="starsLeo"></div>
      <div class="reward">
        <svg viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01z" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/></svg>
        <span id="rewardTxt" contenteditable="true" spellcheck="false" data-ph="set a reward…"></span>
      </div>
    </section>

    <footer class="foot">
      <p class="tip">Tick a box when a chore is done — every tick earns a star to color in.</p>
      <p class="initials">Parent’s initials <span class="blank"></span></p>
    </footer>
  </main>

  <div class="toast" id="toast" role="status"></div>

<script>
  const KEY = 'ava-leo-chores-v1';
  const DAYS = ['MON','TUE','WED','THU','FRI'];
  const DAY_FULL = ['Monday','Tuesday','Wednesday','Thursday','Friday'];
  const NAME = { ava: 'Ava', leo: 'Leo' };

  /* age-appropriate defaults, one pair per day */
  const DEFAULTS = {
    ava: [
      ['Make your bed', 'Feed the cat'],
      ['Water the plants', 'Tidy the toy bin'],
      ['Set the table', 'Clear your plate'],
      ['Wipe the kitchen table', 'Match socks into pairs'],
      ['Toys back on the shelf', 'Dirty clothes in the hamper']
    ],
    leo: [
      ['Take out the recycling', 'Load the dishwasher'],
      ['Walk the dog', 'Fold the towels'],
      ['Empty the dishwasher', 'Practice 20 minutes'],
      ['Take out the trash', 'Vacuum the living room'],
      ['Help make dinner', 'Clean your room']
    ]
  };

  /* pools the shuffle button draws from (no repeats within a week) */
  const POOLS = {
    ava: ['Make your bed','Feed the cat','Water the plants','Tidy the toy bin','Set the table','Clear your plate','Wipe the kitchen table','Match socks into pairs','Toys back on the shelf','Dirty clothes in the hamper','Bring in the mail','Dust the bookshelf','Straighten the shoes','Water the garden','Put away clean silverware'],
    leo: ['Take out the recycling','Load the dishwasher','Walk the dog','Fold the towels','Empty the dishwasher','Practice 20 minutes','Take out the trash','Vacuum the living room','Help make dinner','Clean your room','Feed the fish','Fold your laundry','Wipe the counters','Sweep the porch','Collect trash from the rooms']
  };

  const sheet = document.getElementById('sheet');
  const grid  = document.getElementById('grid');

  /* ---------- state ---------- */
  function nextMonday(){
    const d = new Date();
    const diff = (d.getDay() === 1) ? 0 : (8 - d.getDay()) % 7;
    d.setDate(d.getDate() + diff);
    return d;
  }
  const fmt = d => d.toLocaleDateString('en-US', { month:'short', day:'numeric' });

  function buildDefault(){
    const mon = nextMonday();
    const days = DAY_FULL.map((_, i) => {
      const d = new Date(mon); d.setDate(mon.getDate() + i);
      return {
        date: fmt(d),
        ava: DEFAULTS.ava[i].slice(),
        leo: DEFAULTS.leo[i].slice(),
        done: { ava:[false,false], leo:[false,false] }
      };
    });
    return {
      week: 'Week of ' + fmt(mon),
      reward: '10 stars = Friday pizza night and you pick the movie',
      days
    };
  }

  function load(){
    try{
      const s = JSON.parse(localStorage.getItem(KEY));
      if (s && Array.isArray(s.days) && s.days.length === 5) return s;
    }catch(e){}
    return buildDefault();
  }

  /* ---------- rendering ---------- */
  const esc = s => String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');

  function render(s){
    document.getElementById('weekOf').textContent   = s.week   || '';
    document.getElementById('rewardTxt').textContent = s.reward || '';
    let html = '';
    s.days.forEach((day, i) => {
      html += `
        <div class="day">
          <span class="day-name">${DAYS[i]}</span>
          <span class="day-date" contenteditable="true" spellcheck="false" data-ph="add date">${esc(day.date)}</span>
        </div>`;
      ['ava','leo'].forEach(kid => {
        html += `<div class="group ${kid}">`;
        for (let c = 0; c < 2; c++){
          const done = day.done && day.done[kid] && day.done[kid][c] ? ' done' : '';
          html += `
            <div class="chore${done}">
              <button class="chk" type="button" aria-pressed="${done ? 'true' : 'false'}" aria-label="Mark ${NAME[kid]}'s ${DAY_FULL[i]} chore as done">
                <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12.5 10 17 19 6.5"/></svg>
              </button>
              <p class="txt" contenteditable="true" spellcheck="false" data-ph="write a chore…">${esc(day[kid][c] || '')}</p>
            </div>`;
        }
        html += `</div>`;
      });
    });
    grid.innerHTML = html;
  }

  /* ten star slots per kid in the tracker */
  const STAR_PATH = 'M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01z';
  ['starsAva','starsLeo'].forEach(id => {
    let h = '';
    for (let i = 0; i < 10; i++) h += `<svg class="star" viewBox="0 0 24 24" aria-hidden="true"><path d="${STAR_PATH}"/></svg>`;
    document.getElementById(id).innerHTML = h;
  });

  function syncStars(animate = true){
    ['ava','leo'].forEach(kid => {
      const n = grid.querySelectorAll(`.group.${kid} .chore.done`).length;
      document.querySelectorAll(`#stars${kid === 'ava' ? 'Ava' : 'Leo'} .star`).forEach((st, i) => {
        const on = i < n;
        if (on && !st.classList.contains('filled')){
          st.classList.add('filled');
          if (animate){ st.classList.remove('pop'); void st.offsetWidth; st.classList.add('pop'); }
        } else if (!on){
          st.classList.remove('filled','pop');
        }
      });
    });
  }

  /* ---------- persist edits locally ---------- */
  let saveTimer;
  function save(){
    clearTimeout(saveTimer);
    saveTimer = setTimeout(() => {
      const dayEls = [...grid.querySelectorAll('.day')];
      const gs = {
        ava: [...grid.querySelectorAll('.group.ava')],
        leo: [...grid.querySelectorAll('.group.leo')]
      };
      const state = {
        week:   document.getElementById('weekOf').textContent.trim(),
        reward: document.getElementById('rewardTxt').textContent.trim(),
        days: dayEls.map((dEl, i) => ({
          date: dEl.querySelector('.day-date').textContent.trim(),
          ava:  [...gs.ava[i].querySelectorAll('.txt')].map(t => t.textContent.trim()),
          leo:  [...gs.leo[i].querySelectorAll('.txt')].map(t => t.textContent.trim()),
          done: {
            ava: [...gs.ava[i].querySelectorAll('.chore')].map(c => c.classList.contains('done')),
            leo: [...gs.leo[i].querySelectorAll('.chore')].map(c => c.classList.contains('done'))
          }
        }))
      };
      localStorage.setItem(KEY, JSON.stringify(state));
    }, 350);
  }

  /* ---------- interactions ---------- */
  sheet.addEventListener('click', e => {
    const chk = e.target.closest('.chk');
    if (!chk) return;
    const done = chk.closest('.chore').classList.toggle('done');
    chk.setAttribute('aria-pressed', done);
    syncStars();
    save();
  });

  sheet.addEventListener('input', save);

  sheet.addEventListener('keydown', e => {
    if (e.key === 'Enter' && e.target.isContentEditable){
      e.preventDefault();
      e.target.blur(); /* keep each field a single line */
    }
  });

  /* paste as plain text, on one line */
  sheet.addEventListener('paste', e => {
    if (!e.target.isContentEditable) return;
    e.preventDefault();
    const t = (e.clipboardData || window.clipboardData).getData('text/plain').replace(/\s*\n\s*/g, ' ');
    document.execCommand('insertText', false, t);
  });

  sheet.addEventListener('focusout', e => {
    if (e.target.isContentEditable && !e.target.textContent.trim()) e.target.textContent = '';
  });

  /* ---------- toolbar ---------- */
  function sample(arr, n){
    const a = arr.slice();
    for (let i = a.length - 1; i > 0; i--){
      const j = Math.floor(Math.random() * (i + 1));
      [a[i], a[j]] = [a[j], a[i]];
    }
    return a.slice(0, n);
  }

  document.getElementById('shuffleBtn').addEventListener('click', () => {
    ['ava','leo'].forEach(kid => {
      const picks = sample(POOLS[kid], 10);
      [...grid.querySelectorAll(`.group.${kid}`)].forEach((g, gi) => {
        [...g.querySelectorAll('.txt')].forEach((t, i) => { t.textContent = picks[gi * 2 + i]; });
        [...g.querySelectorAll('.chore')].forEach(c => {
          c.classList.remove('done');
          c.querySelector('.chk').setAttribute('aria-pressed', 'false');
        });
      });
    });
    syncStars(false);
    save();
    toast('Fresh chores dealt for the week!');
  });

  document.getElementById('resetBtn').addEventListener('click', () => {
    grid.querySelectorAll('.chore.done').forEach(c => {
      c.classList.remove('done');
      c.querySelector('.chk').setAttribute('aria-pressed', 'false');
    });
    syncStars(false);
    save();
    toast('All ticks cleared — ready for a new week!');
  });

  document.getElementById('printBtn').addEventListener('click', () => window.print());

  let toastTimer;
  function toast(msg){
    const t = document.getElementById('toast');
    t.textContent = msg;
    t.classList.add('show');
    clearTimeout(toastTimer);
    toastTimer = setTimeout(() => t.classList.remove('show'), 2400);
  }

  /* ---------- boot ---------- */
  render(load());
  syncStars(false);
</script>
</body>
</html>

How it works

  • The layout: a one-page landscape sheet (letter, ready to print) — Monday–Friday down the left rail with editable dates, Ava's two chores and Leo's two chores per day in color-coded columns, and a star tracker along the bottom where each ticked box earns a star. The reward line ("10 stars = Friday pizza night…") is editable too.
  • Design choices: I gave it a warm paper-and-marker feel — Caveat for the handwritten headings, Baloo 2 for chore text — and used just two identity colors: coral for Ava, teal for Leo, which carry through the name banners, checkboxes, stars, and the two "washi tape" strips at the top. It prints light on ink; even if a printer strips background tints, the borders keep everything legible.
  • Before printing: click any text (chores, dates, week, reward) to edit it. Dates auto-fill for next week. "Shuffle chores" deals a fresh, duplicate-free set from age-appropriate pools; "Clear ticks" resets for a new week. All your edits are remembered in the browser, so refreshing won't lose them.
  • Printing: hit Print (or Ctrl/Cmd+P) and choose Landscape — the toolbar hides itself automatically and it fits on a single page. Then tick boxes and color in stars with a pen on the fridge.

The catch: 2 kids × 2 chores × 5 days is 20 chores, and they have to fit on one page for the fridge.

Run details

Model
z-ai/glm-5.3-prime
Route
OpenRouter API, one user message
Served by
Alibaba
Effort
max, OpenRouter's default for this model
Limits
60 min · 131,072 output tokens (the model's limit)
Date
24 Oct 2026
Time
6 min 3 s
Words
1,906
Tokens
49 in, 36,946 out (30,030 of them thinking)
List price
$0.33 at today's price ($2.8 in / $8.8 out per M)
Paid
$0.33

Raw files: output · meta.json

Exact prompt

make a chore chart for my kids, Ava (7) and Leo (10). 2 chores each a day, mon to fri. something i can print and put on the fridge

GLM 5.3 Prime: other Everyday prompts