When a user pastes a URL into the article body editor, an inline popover appears near the cursor offering to convert it into an {% embed url %} tag. The popover:
Uses Forem's existing getCursorXY utility and c-autocomplete__popover styles
Auto-dismisses after 5 seconds or on keypress
Works for any URL (not limited to the 5 new services)
Architecture
All embeds use UnifiedEmbed only — no standalone {% tagname %} liquid tag registration. Each tag class:
Defines REGISTRY_REGEXP for URL matching
Implements parse_input to normalize URLs for iframe src
Registers via UnifiedEmbed.register(TagClass, regexp: ...)
Renders through a shared partial pattern (liquids/_tagname.html.erb)
Services Evaluated but Not Included
Claudebin — embed API requires undocumented query params
Full-stack dev sharing practical guides on WordPress, n8n automation, AI tools, Docker & self-hosting. Always experimenting with new tech to make life easier.
It's great to have these new features, and thanks to the team (especially @jonmarkgo). But tell me, @ben, can't you fix this ugly Github embed?
I would really like to use it in my articles, just like I use other embeds, but honestly, it's too ugly!
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
In case anyone wants to peruse the PR where this landed in Forem
What type of PR is this? (check all applicable)
Description
Adds embed support for 5 AI development tools via Forem's existing
{% embed url %}liquid tag system, plus a paste-to-embed UX in the article editor.New Embeds
*.hf.space,huggingface.co/spaces/*,huggingface.co/datasets/*bolt.new/~/*,*.bolt.host*.lovable.appv0.dev/chat/*,*.vusercontent.netapp.warp.dev/block/*/block/embed/URL)Editor Paste-to-Embed
When a user pastes a URL into the article body editor, an inline popover appears near the cursor offering to convert it into an
{% embed url %}tag. The popover:getCursorXYutility andc-autocomplete__popoverstylesArchitecture
All embeds use UnifiedEmbed only — no standalone
{% tagname %}liquid tag registration. Each tag class:REGISTRY_REGEXPfor URL matchingparse_inputto normalize URLs for iframesrcUnifiedEmbed.register(TagClass, regexp: ...)liquids/_tagname.html.erb)Services Evaluated but Not Included
SameSite=LaxcookiesRelated Tickets & Documents
QA Instructions, Screenshots, Recordings
Testing embeds
Testing paste-to-embed
{% embed <url> %}UI accessibility checklist
CriticalandSeriousissues?Added/updated tests?
Ruby (44 examples, 0 failures):
spec/liquid_tags/huggingface_tag_spec.rb— 10 examples (Spaces, Datasets, embed viewer)spec/liquid_tags/bolt_tag_spec.rb— 7 examples (bolt.host, bolt.new)spec/liquid_tags/lovable_tag_spec.rb— 6 examplesspec/liquid_tags/v0_tag_spec.rb— 9 examples (vusercontent.net, v0.dev/chat)spec/liquid_tags/warp_tag_spec.rb— 6 examples (block URL → embed URL conversion)spec/liquid_tags/ai_embeds_integration_spec.rb— 6 routing + 5 rendering examplesJavaScript (7 tests passing):
app/javascript/article-form/components/__tests__/pasteURLHelpers.test.js— popover display, embed replacement, dismiss, fallback positioning[optional] Are there any post deployment tasks we need to perform?
No. All embeds register automatically on app boot via
UnifiedEmbed.register. No migrations or ENV changes needed.It's great to have these new features, and thanks to the team (especially @jonmarkgo). But tell me, @ben, can't you fix this ugly Github embed?
I would really like to use it in my articles, just like I use other embeds, but honestly, it's too ugly!