✨️Stay cozy under the moonlight✨️

Story

Born beneath the stars, Chiisai Tsukiko is a quiet angel cat who awakens in an unfamiliar world with only fragments of her memories. Guided by moonlight and hope, she sets out on a journey to discover who she truly is and where she belongs.Along the way, she learns that even the smallest light can brighten the darkest night. Through friendship, loss, love, and self-discovery, Chiisai's tale is a gentle fantasy about healing, finding purpose, and creating a place to call home.Read my blog Chiisai Dreams Cats

Profile

· ─ ·✶· ─ · 
Name:Tiny Moon
Species:Angel Cat
Gender:Female
Birthday:July 19
Age:Immortal (appears 18)

Appearance

· ─ ·✶· ─ · 
Skin:Warm Beige
Height:4’11
Weight:100
Blood Type:O+
Hair Color:White
Hair length:Long
Eye color:Left White, Right Purple
Scars:Small ones on legs
Tattoos:None
Piercing:None

Skills | Talents

· ─ ·✶· ─ ·
Martial Arts
Archery
Sword Play
Mage
Musical Knowledge
Sacred Arts
Shape Shift

Likes

  • Cats

  • Dogs

  • The moon

  • Tamagotchi

  • Pastel colors

  • Birds

  • Sweets

  • Rainy days

  • Animals

Interests

  • Digital illustration

  • VTubing

  • Cozy & indie games

  • Storytelling $ OC lore

  • Sticker design

  • Graphic design

  • Community building (Discord)

Connect with me

If you'd like to follow my other socials, or support me in any way, you can find my etsy shop or ko-fi here:

✨ Chiisai's Stream Schedule ✨
cozy, spooky, & friendly streams ♡
🎂 Family birthdays are cozy days off ♡ If a birthday lands on a stream day, the schedule will automatically skip it 💟
⭐ Times automatically display in your local timezone ⭐
Loading schedule...
Please wait just a moment ♡
(function() { var scheduleRoot = document.querySelector('.moonchild-schedule'); var themeToggle = document.getElementById('themeToggle'); var themeDivider = document.getElementById('themeDivider'); var storageKey = 'chiisaiScheduleTheme'; function applyTheme(theme) { var isMoonlight = theme === 'moonlight'; if (!scheduleRoot) return; scheduleRoot.classList.toggle('moonlight', isMoonlight); if (themeToggle) { themeToggle.textContent = isMoonlight ? '🌙 Dark Mode' : '☀️ Light Mode'; themeToggle.setAttribute('aria-pressed', isMoonlight ? 'true' : 'false'); themeToggle.setAttribute('aria-label', isMoonlight ? 'Switch to Morning theme' : 'Switch to Moonlight theme'); } if (themeDivider) { themeDivider.textContent = isMoonlight ? '⭐☁️✨☾✨☁️⭐' : '☁️🌸☁️✨☁️☀️☁️✨☁️🌸☁️'; } } var savedTheme = null; try { savedTheme = localStorage.getItem(storageKey); } catch (e) {} applyTheme(savedTheme === 'moonlight' ? 'moonlight' : 'morning'); if (themeToggle) { themeToggle.addEventListener('click', function() { var nextTheme = scheduleRoot.classList.contains('moonlight') ? 'morning' : 'moonlight'; applyTheme(nextTheme); try { localStorage.setItem(storageKey, nextTheme); } catch (e) {} }); } function startSchedule() { var scheduleGrid = document.getElementById('scheduleGrid'); if (!scheduleGrid) return; scheduleGrid.innerHTML = ''; var STREAMS = [ { dayName: 'Tuesday', dayOfWeek: 2, header: '⭐ Tuesday Stream ⭐', game: '🌾 Stardew Valley ', desc: '🌸 cozy farming, moonlit relaxation, and sweet little adventures' }, { dayName: 'Wednesday', dayOfWeek: 3, header: '🌙 Wednesday Stream 🌙', game: '🪄 Little Witch in the Woods', desc: '✨ potion vibes, soft magic, and witchy woodland wonder' }, { dayName: 'Thursday', dayOfWeek: 4, header: '⭐ Thursday Stream ⭐', game: '🎀 Little Goody Two Shoes ', desc: '🖤 spooky-cute chaos, eerie fun, and moonlit screams' }, { dayName: 'Friday', dayOfWeek: 5, header: '🌙 Friday Stream 🌙', game: '🐲 Palworld', desc: 'Game night of your choice ♡.' } ]; var CENTRAL_TIMEZONE = 'America/Chicago'; var NO_STREAM_DATES = { '2026-04-01': true }; var YEARLY_NO_STREAM_DATES = { '08-12': true, '09-28': true, '10-06': true }; function isNoStreamDate(dateKey) { var monthDay = dateKey.substring(5); return !!NO_STREAM_DATES[dateKey] || !!YEARLY_NO_STREAM_DATES[monthDay]; } function pad(n) { return String(n).padStart(2, '0'); } function formatLocalTime(tsSeconds) { var date = new Date(tsSeconds * 1000); return date.toLocaleString([], { weekday: 'long', month: 'long', day: 'numeric', hour: 'numeric', minute: '2-digit' }); } function formatICSDate(date) { return ( date.getUTCFullYear() + pad(date.getUTCMonth() + 1) + pad(date.getUTCDate()) + 'T' + pad(date.getUTCHours()) + pad(date.getUTCMinutes()) + pad(date.getUTCSeconds()) + 'Z' ); } function getCentralParts(date) { var parts = new Intl.DateTimeFormat('en-CA', { timeZone: CENTRAL_TIMEZONE, year: 'numeric', month: '2-digit', day: '2-digit', weekday: 'short' }).formatToParts(date); var map = {}; for (var i = 0; i < parts.length; i++) { if (parts[i].type !== 'literal') map[parts[i].type] = parts[i].value; } return { year: Number(map.year), month: Number(map.month), day: Number(map.day), weekdayShort: map.weekday }; } function getCentralWeekday(date) { var short = getCentralParts(date).weekdayShort; return ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'].indexOf(short); } function getCentralDateKey(date) { var p = getCentralParts(date); return p.year + '-' + pad(p.month) + '-' + pad(p.day); } function getOffsetMinutesForZone(date, timeZone) { var dtf = new Intl.DateTimeFormat('en-US', { timeZone: timeZone, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hourCycle: 'h23' }); var parts = dtf.formatToParts(date); var map = {}; for (var i = 0; i < parts.length; i++) { if (parts[i].type !== 'literal') map[parts[i].type] = parts[i].value; } var asUTC = Date.UTC( Number(map.year), Number(map.month) - 1, Number(map.day), Number(map.hour), Number(map.minute), Number(map.second) ); return (asUTC - date.getTime()) / 60000; } function zonedTimeToUtc(year, month, day, hour, minute, timeZone) { var utcGuess = new Date(Date.UTC(year, month - 1, day, hour, minute, 0)); var offset = getOffsetMinutesForZone(utcGuess, timeZone); return new Date(utcGuess.getTime() - offset * 60000); } function getNextStreamDate(targetDow) { var now = new Date(); var probe = new Date(now); for (var i = 0; i < 35; i++) { var dow = getCentralWeekday(probe); var key = getCentralDateKey(probe); if (dow === targetDow && !isNoStreamDate(key)) { var p = getCentralParts(probe); return { year: p.year, month: p.month, day: p.day }; } probe.setUTCDate(probe.getUTCDate() + 1); } return null; } function buildGoogleUrl(title, startUtc, endUtc, description) { var dates = formatICSDate(startUtc) + '/' + formatICSDate(endUtc); var url = 'https://calendar.google.com/calendar/render?action=TEMPLATE'; url += '&text=' + encodeURIComponent(title); url += '&dates=' + encodeURIComponent(dates); url += '&details=' + encodeURIComponent(description); return url; } function makeEl(tag, className, text) { var el = document.createElement(tag); if (className) el.className = className; if (text !== undefined) el.textContent = text; return el; } function makeTimeRow(labelText, valueText) { var row = makeEl('div', 'card-time'); var label = makeEl('span', 'label', labelText); var value = makeEl('span', 'local-time', valueText); row.appendChild(label); row.appendChild(value); return row; } function createCard(stream) { var nextDate = getNextStreamDate(stream.dayOfWeek); if (!nextDate) return; var startUtc = zonedTimeToUtc(nextDate.year, nextDate.month, nextDate.day, 19, 0, CENTRAL_TIMEZONE); var endUtc = zonedTimeToUtc(nextDate.year, nextDate.month, nextDate.day, 21, 0, CENTRAL_TIMEZONE); var startTs = Math.floor(startUtc.getTime() / 1000); var endTs = Math.floor(endUtc.getTime() / 1000); var title = 'Chiisai Tsukiko Stream - ' + stream.dayName; var description = 'Come join my ' + stream.dayName.toLowerCase() + ' stream ♡'; var card = makeEl('div', 'schedule-card'); card.appendChild(makeEl('div', 'card-top', stream.header)); card.appendChild(makeEl('div', 'card-game', stream.game)); card.appendChild(makeTimeRow('Starts:', formatLocalTime(startTs))); card.appendChild(makeTimeRow('Ends:', formatLocalTime(endTs))); card.appendChild(makeEl('div', 'card-desc', stream.desc)); var buttons = makeEl('div', 'card-buttons'); var googleBtn = makeEl('a', 'schedule-btn google-btn', '🌙 Add to Google'); googleBtn.href = buildGoogleUrl(title, startUtc, endUtc, description); googleBtn.target = '_blank'; googleBtn.rel = 'noopener noreferrer'; var icsBtn = makeEl('button', 'schedule-btn ics-btn', '⭐ Add to Calendar'); icsBtn.type = 'button'; icsBtn.addEventListener('click', function() { var ics = 'BEGIN:VCALENDAR\n' + 'VERSION:2.0\n' + 'PRODID:-//Moonchild Schedule//EN\n' + 'BEGIN:VEVENT\n' + 'UID:' + Date.now() + '@moonchildschedule\n' + 'DTSTAMP:' + formatICSDate(new Date()) + '\n' + 'DTSTART:' + formatICSDate(startUtc) + '\n' + 'DTEND:' + formatICSDate(endUtc) + '\n' + 'SUMMARY:' + title + '\n' + 'DESCRIPTION:' + description + '\n' + 'END:VEVENT\n' + 'END:VCALENDAR'; var blob = new Blob([ics], { type: 'text/calendar;charset=utf-8' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = title.replace(/[^a-z0-9]/gi, '_').toLowerCase() + '.ics'; document.body.appendChild(a); a.click(); document.body.removeChild(a); setTimeout(function() { URL.revokeObjectURL(url); }, 1000); }); buttons.appendChild(googleBtn); buttons.appendChild(icsBtn); card.appendChild(buttons); scheduleGrid.appendChild(card); } for (var i = 0; i < STREAMS.length; i++) { createCard(STREAMS[i]); } } try { startSchedule(); } catch (err) { console.error('Chiisai schedule error:', err); var fallbackGrid = document.getElementById('scheduleGrid'); if (fallbackGrid) { fallbackGrid.innerHTML = '
' + '
🌙 Schedule unavailable
' + '
Please refresh the page and try again ♡
' + '
'; } } })();

Model Art
• VTuber Models (Chibi, Teen, and Adult) by Miikutea
• Wings by Little Mewn
• Cat Tail by MarinkiArt
• Sandwich Hands by MomoMizu
• Headpat, Bonk, & Boop/Poke by Lilu
• Cat Stream Pet by JP Wonderland
• Custom gun animation for calico pet by JP Wonderland
Twitch Template Designs
• Twitch Stinger Transition by GloryStream
• Alert Bubbles by CheeryID
• Twitch Gaming/Just Talking Backgrounds & Overlays, Panels, & Chiisai emote designs by me Chiisai Tsukiko
Twitch Bagdes
• Ariixiu
• PookieChips
Twitch Cat Emotes
• Spinning Cat by MainDesignCenter
• Calico Emote Pack by KarubSDesignShop
• DJ Calico Animated Emote by MJCartoon
All assets were respectfully purchased on Etsy and are used with permission.