<!-- mobian-agent-page publisher="dailydev" canonical="https://daily.dev/posts/how-i-built-a-chrome-extension-wrapper-and-everything-that-tried-to-stop-me--zn0uywaqq" -->

---
title: How I Built a Chrome Extension Wrapper (and Everything...
description: A developer shares hard-won lessons from building a Chrome extension wrapper around an existing Rails app. The post covers the decision to use an iframe...
canonical: https://daily.dev/posts/how-i-built-a-chrome-extension-wrapper-and-everything-that-tried-to-stop-me--zn0uywaqq
twitter:card: summary_large_image
twitter:site: @dailydotdev
og:type: website
og:site_name: daily.dev
og:title: How I Built a Chrome Extension Wrapper (and Everything That Tried to Stop Me) | daily.dev
og:description: A developer shares hard-won lessons from building a Chrome extension wrapper around an existing Rails app. The post covers the decision to use an iframe...
og:url: https://daily.dev/posts/how-i-built-a-chrome-extension-wrapper-and-everything-that-tried-to-stop-me--zn0uywaqq
og:image: https://api.daily.dev/og/posts/zn0uywaqQ.png
og:image:alt: How I Built a Chrome Extension Wrapper (and Everything That Tried to Stop Me)
og:image:width: 1200
og:image:height: 630
og:locale: en
---

> ## Documentation Index
> Fetch the complete documentation index at: https://daily.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# How I Built a Chrome Extension Wrapper (and Everything That Tried to Stop Me)

**[thoughbot](https://daily.dev/sources/thoughbot)** · 5 min read · 1 upvotes · 0 comments

## Summary

A developer shares hard-won lessons from building a Chrome extension wrapper around an existing Rails app. The post covers the decision to use an iframe approach, the CORS nightmares of running two contexts from one Rails app, the chaos of cookie-based Devise sessions conflicting inside an extension iframe, asset pipeline issues in sandboxed Chrome contexts, and the Chrome Web Store deployment workflow. Key takeaways: separate the extension code into its own repo from day one, plan auth strategy before writing any extension code, test assets in the extension context early, and always ask the client for a reference implementation upfront.

## Full article

daily.dev links to this article rather than hosting it. Read it at the original source: <https://thoughtbot.com/blog/how-i-built-a-chrome-extension>

## Similar posts on daily.dev

- [I Shipped My First Chrome Extension](https://daily.dev/posts/i-shipped-my-first-chrome-extension-kqiqfemcp) · Alex CloudStar · 1 upvotes · 1 comments
- [How to Use Transformers.js in a Chrome Extension](https://daily.dev/posts/how-to-use-transformers-js-in-a-chrome-extension-cljxqw6u8) · Hugging Face · 1 upvotes · 0 comments

---

Tags: [#devtools](https://daily.dev/tags/devtools), [#authentication](https://daily.dev/tags/authentication), [#rails](https://daily.dev/tags/rails)

[View this post on daily.dev](https://daily.dev/posts/how-i-built-a-chrome-extension-wrapper-and-everything-that-tried-to-stop-me--zn0uywaqq)

```json
{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://daily.dev/#organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180},"sameAs":["https://twitter.com/dailydotdev","https://github.com/dailydotdev","https://www.linkedin.com/company/daily-dev-ltd"]},{"@type":"WebSite","@id":"https://daily.dev/#website","url":"https://daily.dev","name":"daily.dev","publisher":{"@id":"https://daily.dev/#organization"},"potentialAction":{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://daily.dev/search?q={search_term_string}"},"query-input":"required name=search_term_string"}}]}
{"@context":"https://schema.org","@type":"TechArticle","headline":"How I Built a Chrome Extension Wrapper (and Everything That Tried to Stop Me)","url":"https://daily.dev/posts/how-i-built-a-chrome-extension-wrapper-and-everything-that-tried-to-stop-me--zn0uywaqq","mainEntityOfPage":{"@type":"WebPage","@id":"https://daily.dev/posts/how-i-built-a-chrome-extension-wrapper-and-everything-that-tried-to-stop-me--zn0uywaqq"},"datePublished":"2026-06-09T00:03:39.401Z","dateModified":"2026-06-09T00:04:05.465Z","description":"A developer shares hard-won lessons from building a Chrome extension wrapper around an existing Rails app. The post covers the decision to use an iframe...","image":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/4eaeb833ca5d4e470990b13560fe9908?_a=AQAEuop","thumbnailUrl":"https://media.daily.dev/image/upload/f_auto,q_auto/v1/posts/4eaeb833ca5d4e470990b13560fe9908?_a=AQAEuop","isAccessibleForFree":true,"articleSection":"thoughbot","inLanguage":"en","publisher":{"@type":"Organization","name":"daily.dev","url":"https://daily.dev","logo":{"@type":"ImageObject","url":"https://daily.dev/apple-touch-icon.png","width":180,"height":180}},"author":{"@type":"Organization","name":"thoughbot","logo":"https://media.daily.dev/image/upload/t_logo,f_auto/v1/logos/9fe12feb57f944a29ff63a79e350081a","url":"https://daily.dev/sources/thoughbot"},"commentCount":0,"discussionUrl":"https://daily.dev/posts/how-i-built-a-chrome-extension-wrapper-and-everything-that-tried-to-stop-me--zn0uywaqq","interactionStatistic":[{"@type":"InteractionCounter","interactionType":{"@type":"LikeAction"},"userInteractionCount":1},{"@type":"InteractionCounter","interactionType":{"@type":"CommentAction"},"userInteractionCount":0}],"keywords":"devtools,authentication,rails","timeRequired":"PT5M"}
{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://daily.dev"},{"@type":"ListItem","position":2,"name":"thoughbot","item":"https://daily.dev/sources/thoughbot"},{"@type":"ListItem","position":3,"name":"How I Built a Chrome Extension Wrapper (and Everything That Tried to Stop Me)"}]}
```

