{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"project","url":"https://ejfox.com/projects/paperclip","json_url":"https://ejfox.com/projects/paperclip.json","generator":"ejfox.com/json-twin@1","data":{"cacheVersion":"2026-05-13-gear-cards","html":"<p class=\"\">No chat. Just vibes.</p>\n<p class=\"\">paperclip is a friends-only presence app: you broadcast your vibe with a single emoji and that's the whole thing. There's no feed to scroll, no chat thread, no likes or follower counts or read receipts — none of the machinery that turns \"how are my friends doing\" into a job. You pick an emoji, your friends see it, and when theirs changes you can get a quiet notification. That's it. I wanted the ambient warmth of knowing what your people are feeling without any of the pressure to perform or respond.</p>\n<p class=\"\">It's built native on both platforms — SwiftUI on iOS, Jetpack Compose on Android — over a shared Supabase backend that syncs in real time, so an emoji you set on your iPhone shows up on your friend's Android in seconds. It's monochrome on purpose: the only color on the screen is the emoji itself, which is exactly where I want your eye to go. Friends join by invite code, there's no public anything, and I built the boring-but-real parts too — push notifications with mute and quiet hours, block/report and account deletion for the App Store, a Cloudflare Worker proxy, even a Discord bot that mirrors your friends' emoji board into a server and Siri Shortcuts so you can set your vibe by voice.</p>\n<p class=\"\">I built it with AI help (Claude), which is how one person ships two native apps and a backend at all — but the shape of it, the ruthless subtraction, the decision that the anti-social-network should feel like a piece of paper and not a dashboard, that's mine. Deliberately styled to lean Apple, not startup. Just pushing it steadily forward like a boss.</p>\n<figure role=\"figure\" aria-label=\"paperclip — one-emoji friends-only presence\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1780065877/projects/paperclip/promo.png\" alt=\"paperclip — one-emoji friends-only presence\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1780065877/projects/paperclip/promo.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1780065877/projects/paperclip/promo.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1780065877/projects/paperclip/promo.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1780065877/projects/paperclip/promo.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"paperclip — one-emoji friends-only presence\" width=\"1230\" height=\"760\" style=\"--splay-rot:2.61deg;\" data-dimensions=\"1230×760\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">paperclip — one-emoji friends-only presence</figcaption>\n</figure>\n<figure role=\"figure\" aria-label=\"A friend&#x27;s contact card — pinned emoji, notifications, and a scrolling emoji history\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/paperclip/contact.png\" alt=\"A friend&#x27;s contact card — pinned emoji, notifications, and a scrolling emoji history\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/paperclip/contact.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/paperclip/contact.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/paperclip/contact.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/paperclip/contact.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"A friend&#x27;s contact card — pinned emoji, notifications, and a scrolling emoji history\" width=\"902\" height=\"1924\" style=\"--splay-rot:2.99deg;\" data-dimensions=\"902×1924\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">A friend's contact card — pinned emoji, notifications, and a scrolling emoji history</figcaption>\n</figure>","title":"paperclip","metadata":{"title":"paperclip","date":"2025-11-01T05:00:00.000Z","category":"Apps","featured":false,"tech":["Swift","SwiftUI","Kotlin","Jetpack Compose","Supabase"],"state":"deployed","ai-involvement":"ai-assisted","tags":["ios","android","app","social"],"words":301,"images":2,"imageDetails":{"total":2,"cloudinary":2,"withDimensions":0},"links":0,"codeBlocks":0,"headers":{},"toc":[],"type":"post"}},"_links":{"self":"https://ejfox.com/projects/paperclip.json","html":"https://ejfox.com/projects/paperclip","index":"/projects.json"}}