private beta·invite-only

Show off your open-source PRs anywhere

One <script> tag. Seven layouts. Fully themeable. Zero iframes, zero API keys, zero maintenance. Drop it on your blog, portfolio, or README and get a live widget of your merged contributions — styled to match your brand.

19 KB gzipped·Shadow-DOM isolated·built by @aggmoulik
1// drop this anywhere on your page
2<script src="https://embed.openembed.dev/v0/widget.js"
3 data-user="aggmoulik"
4 data-layout="list"
5 data-theme="auto"
6 defer></script>
7
8// 19 KB gzipped · Shadow DOM · zero deps

No spam. One email when invites open. Unsubscribe anytime.

Drops cleanly into →
<script>ReactAstroNext.jssoonHugosoonJekyllsoon11tysoonNotionsoonBear blogsoonplain HTMLsoonREADME.mdsoon
02 · live demo

This is the widget. Rendering right now.

Same React component, same data shape, same Shadow DOM as what you'd embed. Real DOM nodes, real CSS isolation, real <300ms first paint.

https://your-portfolio.dev/now

aggmoulik / recent merged PRs

▲ list · light
feat(widget): add masonry layout with container queries
aggmoulik/github-embed-ui · +287 14 · merged 2026-05-12
feat
fix(embed): enforce per-widget origin allowlist
aggmoulik/github-embed-ui · +94 23 · merged 2026-05-08
fix
perf(widget): shave 4 KB off gzipped bundle
aggmoulik/github-embed-ui · +31 72 · merged 2026-05-01
perf
refactor(core): split renderer from data adapter
aggmoulik/github-embed-ui · +412 388 · merged 2026-04-24
refactor
03 · 7 layouts in production

Pick the one that matches your site.

Content-first, screen-reader-friendly, and shipping in both light and dark out of the box. Switch with a single attribute change — no rebuild required.

Grid
01 · layouts/grid
feat
fix
perf
refactor
List
02 · layouts/list
Timeline
03 · layouts/timeline
feat
+287 −14
Single Card
04 · layouts/single-card
feat
fix
perf
→ scrolling
Marquee
05 · layouts/marquee
Masonry
06 · layouts/masonry
featured
Highlight
07 · layouts/highlight
04 · built for serious portfolios

A widget that respects your site, your visitors, and your bundle size.

01

Shadow DOM isolation

Widget ships its own styles inside a Shadow DOM. No CSS leaks in, no CSS leaks out — drop it into a Tailwind site, a Hugo blog, or a hand-written README without surprises.

02

Themes that match your brand

Pick any accent, background, border, or muted color. Per-token overrides mean the widget fits portfolios, docs sites, and dark-mode blogs alike — light, dark, or system mode follows your visitor's OS automatically.

03

Per-widget origin allowlist

Default-deny security. Declare exactly which domains can embed each widget — wildcards supported, leak alerts in your dashboard.

04

Live API or static export

Mode A: dynamic via the edge worker. Mode B: bake a JSON snapshot into your CI for zero-runtime, fully cacheable embeds.

05

Edge-deployed, <100 KB

Slim Cloudflare Worker (~96 KB gzipped) serves the live API. Widget itself stays under 19 KB gzipped on the wire.

06

No iframes, no tracking

Real DOM nodes you can style around. No third-party cookies, no analytics pings, no maintenance — and never any of your visitors' data.

05 · ship it

Stop screenshotting your PRs.
Embed them.

Private beta is open. We're sending 200 invites a week to people on the waitlist.

A solo project by @aggmoulik · closed beta