惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
NISL@THU
NISL@THU
T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
L
Lohrmann on Cybersecurity
V
Visual Studio Blog
Cyberwarzone
Cyberwarzone
D
Docker
The Hacker News
The Hacker News
C
CERT Recently Published Vulnerability Notes
Vercel News
Vercel News
Project Zero
Project Zero
S
Schneier on Security
aimingoo的专栏
aimingoo的专栏
I
Intezer
腾讯CDC
M
MIT News - Artificial intelligence
Hugging Face - Blog
Hugging Face - Blog
P
Palo Alto Networks Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
AWS News Blog
AWS News Blog
GbyAI
GbyAI
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
Vulnerabilities – Threatpost
G
Google Developers Blog
N
Netflix TechBlog - Medium
The Cloudflare Blog
Microsoft Security Blog
Microsoft Security Blog
Y
Y Combinator Blog
A
Arctic Wolf
S
Securelist
酷 壳 – CoolShell
酷 壳 – CoolShell
Cisco Talos Blog
Cisco Talos Blog
Recent Announcements
Recent Announcements
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 热门话题
T
Threatpost
Latest news
Latest news
Blog — PlanetScale
Blog — PlanetScale
Security Latest
Security Latest
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
H
Help Net Security
The GitHub Blog
The GitHub Blog
T
Tor Project blog
P
Proofpoint News Feed

Codrops

The Art of Continuous Transformation: How Garden Eight Blends Integrity with Play | Codrops Building Cerebrium: Making Serverless Infrastructure Tangible | Codrops Building Ridgeline: Engineering a Real-Time 3D Experience in Webflow | Codrops Magnetic Commerce: Building the Dash Creative Website | Codrops The Craft Behind Memorable Digital Experiences: Inside Unseen Studio | Codrops ZERO: The Engineering Behind a Defiant Interactive Narrative | Codrops Meet the Speakers of the First Three.js Conference | Codrops The Architecture Behind Trionn: Coordinating GSAP, Three.js, Lenis, and Web Audio | Codrops Where Stories Become Interactive Worlds: How makemepulse Brings Ideas to Life Across Web, XR, and Beyond | Codrops The Sleepers: Creating an Atmospheric WebGL Experience with Lightweight Techniques | Codrops Building an Interactive Wave Propagation Cube Grid with Three.js | Codrops Ten Years Away: Designing an Interactive Comic for Studio375’s Tenth Anniversary | Codrops Building a Scroll-Driven 3D Gallery Using a Blender Camera Path with Three.js and GSAP | Codrops From Years of Client Work to a Next.js + Sanity Starter Kit | Codrops Sculpting a Digital Athlete: Capturing Stefanos Tsitsipas Beyond the Court | Codrops Building Persistent Page Transitions with WebGPU and Vanilla JavaScript | Codrops Inside Bisous: Designing an Editorial Experience for Cinematic CGI | Codrops Engineering the Web Experience Behind Shopify’s Spring ’26 Edition: Everywhere | Codrops Shaping Stories into Experience: The Work of Kevin Lam | Codrops Testing What Users Actually See with Vitest and Chromatic | Codrops Podium: Building a Website Where Running Becomes Storytelling | Codrops Designing Beyond the Surface: How DashDigital Turns Complexity into Clarity | Codrops Creative Entrepreneurship: Designing the Machine | Codrops Exploring 3D Image Rotations on Scroll | Codrops Always Building, Always Learning: Cyd Stumpel’s Journey Through the Modern Web | Codrops Designing A Better Lou: Reducing Cognitive Load Through Design, Content, and Systems | Codrops Sketching the Impossible: A 3D Portfolio Built Without a Single 3D Model | Codrops Building Horeca: Advanced Motion Design in Webflow Without the Performance Trade-Offs | Codrops No Two Paths Alike: Inside San Rita’s Approach to Digital Experiences | Codrops The Making of the New Lesse Studio Website: Clarity, Performance, and Intentionality | Codrops Creating a Thumbnail Flow Animation with GSAP MotionPath | Codrops Forging Her Own Path: Houmahani Kane’s Journey in Creative Development | Codrops Beaucoup and the Pursuit of Memorable Experiences | Codrops The Future of Emotional Technology: Comfort Websites for Growth and Self-Awareness | Codrops The Never Ending Story: Building a Seamless Infinite Scroll Experience with GSAP & Lenis | Codrops Whooshes, Snaps and Shaders: Adrien Vanderpotte and the Feeling of the Interface | Codrops Building a Scroll-Driven 3D Cube Gallery in Webflow with GSAP | Codrops Creating Scroll-Driven SVG Map Animations with GSAP | Codrops Made With Gsap: Building a Fun Gravity-Based Mouse Trail | Codrops 80s Business Tech and Seamless Scene Transitions: Inside Shader.se’s Scroll-Driven WebGPU Pipeline | Codrops Merlin: The Code Boutique Turning Motion Into Digital Magic | Codrops Designing Ourselves: The New Obys Identity and Website | Codrops Exploring the HTML-in-Canvas Proposal | Codrops Le:mma Studio: Building the Feeling Behind the Screen | Codrops From Shader Uniforms to Clip-Path Wipes: How GSAP Drives My Portfolio | Codrops Reverse-Engineering Claude AI’s Mascot Animations with SVG and GSAP | Codrops Akaru: Crafting Precision-Driven Digital Experiences | Codrops Designing Against the Gallery: A Two-Year Journey to a Layered Portfolio Experience | Codrops Between Human and Machine: Sofia Papadopoulou’s Approach to Augmented Creativity | Codrops More Than a Portfolio: Building a Scroll-Driven 3D World with Something to Say | Codrops Rhumb Studio: Small but Mighty, Shaped by Curiosity | Codrops Susurrus: Crafting a Cozy Watercolor World with Three.js and Shaders | Codrops Building 4WIDE: Turning Distortion, Blur, and Motion into a Coherent Experience | Codrops A Playful Clip Menu with GSAP’s easeReverse | Codrops False Earth: From WebGL Limits to a WebGPU-Driven World | Codrops Interactive Storytelling for the Web: Building Immersive Stories with Timelines, 3D, and Layered Scenes | Codrops The Art of Complex Motion: Corentin Bernadou’s World of Shaders and Experimentation | Codrops They Call Me Giulio: The Making of a Cinematic Cyberpunk Portfolio | Codrops Lusion: Where Digital Craft Meets Ambitious Experimentation | Codrops The Exat Microsite: Pushing a Typography Showcase to New Creative Extremes | Codrops A Single DM, a First SOTD, and the Start of Chanh M. Ho’s Creative Journey | Codrops Creating Custom Page Transitions in Astro with Barba.js and GSAP | Codrops R—K ’26: The Thinking and Code Behind a Portfolio Led by Presence | Codrops Building the Maxima Therapy Website: React, GSAP, and Dabbling with AI | Codrops Where Engineering Meets Craft: Edoardo Lunardi’s Obsession with the Details | Codrops Animating 160,000 Cubes in Three.js to Visualize Dithering | Codrops Arnaud Rocca’s Portfolio: From a GSAP-Powered Motion System to Fluid WebGL | Codrops Where Confidence Needs No Decoration: The Malvah.Studio Story | Codrops Motion Highlights #17 | Codrops
Building an Interactive Digital Stamp Collection with Shaders, Postcards, and Playful Inspection | Codrops
By Robert Pavlinić and Marijana Pavlinić · 2026-06-09 · via Codrops

Stamps are miniature art pieces that tell stories; they showcase places, people, and moments through the meticulous assembly of typography, illustration, and photography, all within a tightly constrained format. We wanted to pay homage to the craft of designing and collecting stamps (philately) by bringing stamps online for a new audience to enjoy.

When we started building the site, we knew we did not want a regular image gallery. The project was inspired by a real stamp album, so the website needed to retain some of that feeling too: calm, tactile, and made for inspection.

The main flow is simple. Browse through a loose field of stamps, select one to bring it into focus, and inspect it with a loupe. You can also learn more about each stamp, and when you’re done, you can even send us a message in the form of a postcard.

This article is a case study of how we made it: the story behind the project, the design process, the technical choices, and a few of the interactions that give the site its character.

How the collection started

by Marijana Pavlinić 

The collection started before there was any website at all. During the lockdowns, I was searching for a convenient personal side project to help me practice digital drawing. I wanted a project with a clear idea, but enough room to explore different styles.

At the time, I found a stamp album that had been passed down through my family from my grandpa, and the stamps inside it felt like the perfect source of inspiration. His collection was full of unexpected compositions, patterns, and typography, so I started inspecting and recreating them as vector drawings, not as exact copies, but as reinterpretations. The early ones were monoline, and over time I introduced texture and more complex typographic layouts as I learned new software.

Set of monoline stamps.
Set of monoline stamps

As the collection grew, I learned a lot about digital drawing and philately. I had an idea of turning it into something more, but it stayed that way for a while.

Almost five years later, I came back to it with my partner, and we started building the full experience. The challenge was not how to show the recreated stamps, but how to preserve the feeling of the original album.

  • How do we show the relationship between the original stamps and the recreations?
  • How do we make sure we are highlighting the original stamp as well?
  • How do we make it feel archival, fun, and exploratory?

That became our filter: does this feel like part of a stamp album, or just a website showing images?

A moodboard screenshot from Figma. The original red album from my grandpa is in the top right corner.

The main interactions

Most of our time was spent on two particular interactions: the glass loupe and the feedback postcard. The whole portfolio is open source on GitHub, so we’ll keep this focused just on the main ideas.

Building the loupe

Once a stamp is selected, the loupe becomes available. This is where the experience shifts from browsing to inspection.

A normal zoom effect would have worked, but it felt too flat for this project. We wanted it to feel more like a real object sitting on top of the stamp: a small glass tool with a frame, edge distortion, and a zoom control.

The loupe is composed roughly as follows:

<Loupe>
  <Lens>
    <Canvas>
      <LensScene>
        <ScreenQuad>
          <lensMaterial />
        </ScreenQuad>
      </LensScene>
    </Canvas>
  </Lens>
  <Dial>
    <input type="range" />
    <svg />
  </Dial>
</Loupe>

Reconstructing the scene

The loupe does not zoom the original image directly, and it does not capture the live DOM.

Instead, it reconstructs the focused scene in an offscreen canvas. It draws the same background grid, loads the larger stamp image when available, adds the shadow, and renders the focused stamp in the center. Using smaller images for the draggable stamps improved performance, while using the larger image only for the loupe allowed us to add more detail to the zoomed view, such as the paper grain texture.

That canvas is then passed to the lens shader as a texture. This way, the loupe magnifies the composed stamp scene rather than just the original image file.

Creating the glass effect

The shader samples the texture differently across the lens.

The center remains clearer, while the edges warp more. The red, green, and blue channels are sampled with slightly different offsets, which creates a subtle chromatic aberration effect around the rim.

That color separation, together with rim shading and highlights, makes the loupe feel more like glass and less like a circular crop.

The shader is not trying to be physically accurate. It just needs to feel believable in motion, especially around the edge of the lens.

Interaction and accessibility

Dragging is handled with a motion drag controller. As the loupe moves, its center position is converted into local coordinates and passed to the shader as uniforms. The shader uses that position to determine which part of the canvas texture should appear under the lens. It can also be moved with the keyboard. The arrow keys move it around the selected stamp, and holding Shift moves it faster.

The visual frame is an SVG. It gives the loupe its shape, edge marks, highlights, inscription, and small dial details.

The zoom knob is backed by an element, giving it native keyboard behavior.

Accessibility was important to us because the loupe is not just a visual effect; it is part of the way you inspect the stamp.

Turning feedback into a postcard

The feedback dialog started with a simple idea: if the project is about stamps, feedback should feel like something you send back.

The postcard has two sides. The front features a custom illustration, and the back contains the form. You flip it over to write feedback, just like turning over a real postcard. One early idea was to use the currently selected stamp on the form, but later Marijana created a separate stamp for the postcard, featuring the two of us and inspired by the first stamp ever, the Penny Black.

We imagined the person writing the feedback and tried to capture them in the moment of writing it. This is why the illustration changes based on screen size: on mobile, the person is holding a phone; on desktop, they are typing on a keyboard.

Our cat Dora also found her way into the postcards.

The postcard is built as an accessible Radix dialog. The custom illustration, flip animation, and shader transition sit on top of that foundation. The component is composed roughly as follows:

<GenieDialog>
  <GenieDialogOverlay>
    <GenieBackdrop />
  </GenieDialogOverlay>
  <GenieDialogContent>
    <FlipCard>
      <FlipCardFront>
        <Image />
      </FlipCardFront>
      <FlipCardBack>
        <FeedbackForm/>
      </FlipCardBack>
    </FlipCard>
      {...}
  </GenieDialogContent>
  <GenieDialogTrigger />
</GenieDialog>

This way, the dialog still retains the expected accessibility features: focus management, keyboard support, and escape to close. The visual layer can be playful, but the underlying interaction remains familiar.

Building the genie effect

We did not choose the genie effect because it was directly related to stamps. We mostly wanted to try it because it felt fun. But it ended up fitting the project nicely: the postcard feels like a small paper object being pulled out of the page, filled in, and sent back.

The important technical detail is that the real dialog is not being bent in the DOM. Instead, the animation uses a temporary shader layer.

When the dialog opens, the real postcard is mounted but kept hidden. We capture the visible side of the postcard with snapDOM, draw that capture into an overlay canvas, turn it into a WebGL texture, and animate that texture with the shader. When the animation finishes, we hide the shader layer and reveal the real dialog.

When closing, we do the reverse. We capture the current side of the postcard, hide the real dialog, animate the shader texture back out, and then unmount the dialog.

That also means the close animation always uses the current state. If the visitor is viewing the illustration side, that side gets captured. If they have flipped to the form side, the form side gets captured.

Details that made it feel like an album

Once the main interactions worked, it was time to sweat the details.

The collection tabs look like binder dividers. The metadata is treated like a catalog card, listing the country, issue date, catalog codes, original stamp designer, and reference stamp. It uses a monospaced font and a typewriter-style text animation, which gives it an archival feel.

There are small collector references throughout. The elements on the right side resemble a Leuchtturm album used by stamp and coin collectors. Most of the grid controls and empty states use Marijana’s handwriting, which makes them feel more like annotations in an album than standard UI controls.

The feedback postcard features a stamp inspired by the Penny Black. The loupe has small edge marks, highlights, and an inscription, so it feels more like an object from the same world than a generic zoom control. The color palette and grain texture work together to mimic the look of real paper.

All these details help make the album concept feel more complete.

Messages sent back

One of the nicest parts of launching the site was reading the messages people sent through the postcard dialog.

A few of the 100+ messages people have sent through the postcard.

That was a sweet reminder of why we enjoy sharing our work online. You put something personal out there, and sometimes it reaches people in ways you did not expect. It can lead to kind messages, conversations, new connections, and even opportunities.

For a project about stamps and postcards, that felt especially fitting. We made a small digital experience about collecting and sending, and people sent something back.

Reflecting back

The project became a good example of why we enjoy making side projects together.

Because we sit next to each other, the loop (pun intended) between design and development is very short. A visual idea can become a prototype quickly. A technical limitation can become a new design direction. A small interaction can be tested, changed, and polished without turning it into a major handoff.

The most enjoyable part was finding places where the theme could shape the interaction without becoming too literal. Some ideas start as experiments, but they still need to earn their place. The loupe belonged right away because it matched the act of inspection. The genie animation started as something fun to try, but once it was tied to the postcard, it felt much more at home.

In the end, the illustration, interaction, accessibility, and shaders all had to work together. None of them could carry the experience alone.