All Work Exhibition Design · Curation

My Famicase
Exhibition Seoul.

Bringing a beloved Tokyo institution to Korea — 250 artists, 30+ countries, one pegboard wall, and a mascot designed from scratch.

Seoul Edition · Feb 2025 · Mouse Potato

Role

Curator & Creative Director

Artists

250 from 30+ Countries

Venue

Mouse Potato, Jongno Seoul

Sector

Arts & Culture

The Story

Tokyo to Seoul,
20 years in
the making.

My Famicase Exhibition has been running every May at METEOR gallery in Tokyo since 2005 — a global celebration of fictional Famicom cartridge art, where artists from around the world design labels for games that never existed. After two decades it had only ever travelled internationally three times: Hong Kong (2021), Los Angeles (2022), and LA again in 2024.

I'd been entering the exhibition as an artist for years, so I knew the community well. In 2024 I approached Satoshi Sakagami, the founder and curator at METEOR, to propose bringing the show to Seoul. Once he approved it, I reached out to Mouse Potato — a retro gaming culture space in Jongno — who were immediately on board as the host venue.

From there I produced the Seoul edition — handling exhibition design, the cartridge wall build, creative direction, branding, promotional materials, a Seoul-exclusive mascot, and a 3D animated logo for the show's visual identity.

Exhibition Curation Spatial Design Illustration 3D Animation Large-Format Print Event Production
My Famicase Exhibition Seoul — full exhibition view

Exhibition floor — Mouse Potato, Jongno, Seoul

Famicase Seoul — exhibition intro board
Famicase Seoul — cartridge wall detail

250 cartridges on the pegboard wall

Famicase Seoul — cartridge detail
Famicase Seoul — detail
Famicase Seoul — close-up
Eoin Stanley at the exhibition
Eoin with Sho from Mouse Potato

Opening week — with Sho from Mouse Potato, who co-ordinated the venue and approvals

Famicase Seoul — exhibition space during build
Eoin starting the pegboard wall build
Famicase build — cartridges going up

Building the pegboard cartridge wall — metal shards, band-aids and all

8m wraparound LCD screen — I produced the 3D animation and motion design

Animated exhibition logo — designed for social media promotion

Seoul Mascot

Designed for
the Seoul edition.

Every international edition of My Famicase develops its own visual identity. For the Seoul exhibition, I created an original mascot designed to feel playful, nostalgic, and rooted in retro game culture.

The character is a girl wearing a Mouse Potato beanie, sitting on a Famicom placed on top of a CRT television while holding a cartridge. Visitors are encouraged to pick up the cartridges during the exhibition, as the back of each label contains the game concept and artist information. Showing the mascot holding a cart was a small way to echo that hands-on part of the experience.

Designing a mascot for the exhibition was also one of the most rewarding parts of the project. Being able to put my own stamp on the Seoul edition meant a lot, and having the character approved by the original curator, Satoshi Sakagami, was especially satisfying. He's known for his meticulous standards, which made the approval feel like a real milestone.

The mascot appears across the exhibition's visual system, including promotional materials, the event flyer, stickers, and the animated logo. The small "eoin" signature in the corner is a quiet nod to the artist-led spirit that defines the exhibition.

My Famicase Exhibition Seoul — mascot sticker design
Famicase Seoul — event flyer

Event flyer

Famicase Seoul — t-shirt front
Famicase Seoul — t-shirt back

T-shirt — only available at the Seoul exhibition

Annual Entries

My submissions
to the exhibition.

2023
2024
2025
2026
Coming soon
// CURSOR const cursor = document.getElementById('cursor'); document.addEventListener('mousemove', e => { cursor.style.left = e.clientX + 'px'; cursor.style.top = e.clientY + 'px'; }); document.querySelectorAll('a,button,[data-hover]').forEach(el => { const dark = el.closest('.case-hero, footer, .case-nav'); el.addEventListener('mouseenter', () => cursor.classList.add(dark ? 'hover-dark' : 'hover')); el.addEventListener('mouseleave', () => cursor.classList.remove('hover','hover-dark')); }); // LOGO ROTATION const navLogo = document.getElementById('nav-logo'); window.addEventListener('scroll', () => { if (navLogo) navLogo.style.transform = 'rotate(' + (window.scrollY * 0.06) + 'deg)'; }, {passive:true}); // SCROLL REVEAL const revealEls = document.querySelectorAll('.reveal'); const revealObs = new IntersectionObserver(entries => { entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('in'); revealObs.unobserve(e.target); }}); }, {threshold:0.12}); revealEls.forEach(el => revealObs.observe(el)); // SLIDE FROM SIDES const slideEls = document.querySelectorAll('.slide-from-left, .slide-from-right'); const slideObs = new IntersectionObserver(entries => { entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add('in'); slideObs.unobserve(e.target); }}); }, {threshold:0.15}); slideEls.forEach(el => slideObs.observe(el)); // LOGO VIDEO — autoplay loop (it is a looping logo, so loop is fine) const logoVideo = document.getElementById('logo-video'); if (logoVideo) { const logoObs = new IntersectionObserver(entries => { entries.forEach(e => { if (e.isIntersecting) { logoVideo.play(); } else { logoVideo.pause(); } }); }, {threshold:0.3}); logoObs.observe(logoVideo); } // VIDEO WALL — restart on enter viewport const videowall = document.getElementById('videowall'); if (videowall) { const vwObs = new IntersectionObserver(entries => { entries.forEach(e => { if (e.isIntersecting) { videowall.currentTime = 0; videowall.play(); } else { videowall.pause(); } }); }, {threshold:0.5}); vwObs.observe(videowall); } // FOOTER SCRAMBLE const FOOTER_EMAIL = 'eoin@eoinstanley.com'; const FOOTER_LABEL = 'Get In Touch'; const FOOTER_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; function scrambleTo(el, target, onDone) { if (el._scrambleTimer) clearInterval(el._scrambleTimer); let frame = 0; const totalFrames = 20; el._scrambleTimer = setInterval(() => { el.textContent = target.split('').map((char, i) => { if (char === ' ') return ' '; if (i < Math.floor((frame / totalFrames) * target.length)) return char; return FOOTER_CHARS[Math.floor(Math.random() * FOOTER_CHARS.length)]; }).join(''); frame++; if (frame > totalFrames) { clearInterval(el._scrambleTimer); el.textContent = target; if (target !== FOOTER_EMAIL) el.style.color = ''; if (onDone) onDone(); } }, 40); } const footerHeadline = document.getElementById('footer-headline'); const footerCopied = document.getElementById('footer-copied'); if (footerHeadline) { let footerState = 'label'; const footerObs = new IntersectionObserver((entries) => { entries.forEach(e => { if (e.isIntersecting) scrambleTo(footerHeadline, FOOTER_LABEL); }); }, { threshold: 0.3 }); footerObs.observe(footerHeadline); footerHeadline.addEventListener('mouseenter', () => { scrambleTo(footerHeadline, footerState === 'label' ? FOOTER_LABEL : FOOTER_EMAIL); }); footerHeadline.addEventListener('click', () => { if (footerState === 'label') { footerState = 'email'; footerHeadline.style.color = 'var(--green)'; scrambleTo(footerHeadline, FOOTER_EMAIL); } else { navigator.clipboard.writeText(FOOTER_EMAIL).then(() => { footerCopied.classList.add('show'); setTimeout(() => footerCopied.classList.remove('show'), 2500); }); footerState = 'label'; footerHeadline.style.color = ''; scrambleTo(footerHeadline, FOOTER_LABEL); } }); } // TIME & WEATHER document.getElementById('footer-year').textContent = new Date().getFullYear(); function updateTime() { const kr = new Date(new Date().toLocaleString('en-US',{timeZone:'Asia/Seoul'})); const h = kr.getHours(), m = kr.getMinutes(); const period = h >= 12 ? 'PM' : 'AM'; const el = document.getElementById('kr-time'); if (el) el.textContent = (h%12||12) + ':' + String(m).padStart(2,'0') + ' ' + period; } updateTime(); setInterval(updateTime, 30000); (async () => { try { const r = await fetch('https://api.open-meteo.com/v1/forecast?latitude=37.5665&longitude=126.9780¤t=temperature_2m,weather_code&timezone=Asia%2FSeoul'); const d = await r.json(); const t = Math.round(d.current.temperature_2m); const c = d.current.weather_code; const icon = c===0?'☀️':c<=3?'🌤️':c<=48?'🌫️':c<=67?'🌧️':c<=77?'❄️':c<=82?'🌦️':'⛈️'; const el = document.getElementById('kr-weather'); if (el) el.innerHTML = '' + icon + ' ' + t + '°C'; } catch(e) {} })();