[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"navigation":3,"url-settings":86,"blog-\u002Fblog\u002Fconverting-a-dart-google-chrome-extension-to-a-safari-extension":671,"blog-author-\u002Fblog\u002Fconverting-a-dart-google-chrome-extension-to-a-safari-extension":1188,"i-material-symbols:arrow-back-rounded":1203},{"id":4,"extension":5,"footer":6,"header":73,"meta":83,"stem":84,"__hash__":85},"navigation\u002Fdata\u002Fshared\u002Fnavigation.yml","yml",{"brand":7,"columns":13,"legal":63},{"name":8,"tagline":9,"downloadCta":10},"Pieces","The memory layer for modern work.",{"label":11,"href":12},"All downloads","\u002Fdownloads",[14,26,39,51],{"title":15,"links":16},"Product",[17,20,23],{"label":18,"href":19},"Pieces Desktop","\u002F",{"label":21,"href":22},"Pieces Enterprise","\u002Fenterprise",{"label":24,"href":25},"Pieces MCP","\u002Fmcp",{"title":27,"links":28},"Resources",[29,33,36],{"label":30,"href":31,"external":32},"Documentation","url:docs.home",true,{"label":34,"href":35},"Blog","\u002Fblog",{"label":37,"href":38,"external":32},"GitHub","url:github.org",{"title":40,"links":41},"Community",[42,45,48],{"label":43,"href":44,"external":32},"Discord","url:social.discord",{"label":46,"href":47,"external":32},"X \u002F Twitter","url:social.x",{"label":49,"href":50,"external":32},"LinkedIn","url:social.linkedin",{"title":52,"links":53},"Company",[54,57,60],{"label":55,"href":56},"About","\u002Fabout",{"label":58,"href":59},"Updates","\u002Fupdates",{"label":61,"href":62},"Contact","\u002Fcontact",[64,67,70],{"label":65,"href":66},"Privacy Policy","\u002Flegal\u002Fprivacy",{"label":68,"href":69},"Refund Policy","\u002Flegal\u002Frefund",{"label":71,"href":72},"Terms of Service","\u002Flegal\u002Fterms",{"links":74,"signIn":75,"contact":78,"cta":80},[],{"label":76,"href":77},"Manage account","url:portal.home",{"label":79,"href":62},"Get in touch",{"label":81,"href":82},"Download","url:routes.downloads",{},"data\u002Fshared\u002Fnavigation","XlSALC7vYCXHcmcXnjJViwIZKsqnQWF4bn4o9RrcSBE",{"id":87,"extension":5,"links":88,"meta":668,"stem":669,"__hash__":670},"urlSettings\u002Fdata\u002Fshared\u002Furls.yml",[89,93,97,101,105,109,113,117,121,125,129,133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,256,260,264,268,272,276,280,284,288,292,296,300,303,307,311,314,318,322,326,330,334,338,342,346,350,354,358,362,366,370,374,378,382,386,390,394,398,402,406,410,414,418,422,426,430,434,438,442,446,450,454,458,461,465,469,473,477,481,485,488,491,494,497,501,505,508,512,516,520,524,528,532,536,540,544,548,552,556,559,563,567,571,575,579,582,585,588,592,595,599,603,607,611,614,618,622,625,628,631,635,639,643,646,649,652,656,660,664],{"key":90,"label":91,"href":92},"downloads.desktop","Desktop download page","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fdownload",{"key":94,"label":95,"href":96},"downloads.macOS.dmgArm64","macOS DMG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fdmg-arm64\u002Fdownload",{"key":98,"label":99,"href":100},"downloads.macOS.dmgIntel","macOS DMG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fdmg\u002Fdownload",{"key":102,"label":103,"href":104},"downloads.macOS.pkg","macOS PKG","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg\u002Fdownload",{"key":106,"label":107,"href":108},"downloads.macOS.universal","Desktop macOS Universal","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fmacos-universal\u002Fdownload",{"key":110,"label":111,"href":112},"downloads.macOS.pkgArm64","Desktop macOS PKG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pfd-arm64\u002Fdownload",{"key":114,"label":115,"href":116},"downloads.macOS.pkgIntel","Desktop macOS PKG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pfd\u002Fdownload",{"key":118,"label":119,"href":120},"downloads.windows.appinstaller","Windows App Installer","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fappinstaller\u002Fpieces_for_x.appinstaller",{"key":122,"label":123,"href":124},"downloads.windows.exe","Windows EXE","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fwindows-exe\u002Fdownload",{"key":126,"label":127,"href":128},"downloads.windows.msix","Windows MSIX","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fwindows-msix\u002Fdownload",{"key":130,"label":131,"href":132},"downloads.windows.suiteManager","Windows Suite Manager","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_suite_windows\u002Fappinstaller\u002Fdownload",{"key":134,"label":135,"href":136},"downloads.linux.flatpakRepo","Linux Flatpak repository","https:\u002F\u002Fbuilds.pieces.app\u002Fpieces-flatpak-repo\u002Fpieces-flatpak.flatpakrepo",{"key":138,"label":139,"href":140},"downloads.linux.snapDesktop","Linux Snap Desktop","https:\u002F\u002Fsnapcraft.io\u002Fpieces-for-developers",{"key":142,"label":143,"href":144},"downloads.linux.snapPiecesOS","Linux Snap PiecesOS","https:\u002F\u002Fsnapcraft.io\u002Fpieces-os",{"key":146,"label":147,"href":148},"downloads.linux.snap","Desktop Linux Snap package","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fpieces_for_x\u002Fsnap\u002Fdownload",{"key":150,"label":151,"href":152},"downloads.piecesOS.macOS.dmgArm64","PiecesOS macOS DMG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fdmg-arm64\u002Fdownload",{"key":154,"label":155,"href":156},"downloads.piecesOS.macOS.dmgIntel","PiecesOS macOS DMG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fdmg\u002Fdownload",{"key":158,"label":159,"href":160},"downloads.piecesOS.macOS.universal","PiecesOS macOS Universal","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fmacos-universal\u002Fdownload",{"key":162,"label":163,"href":164},"downloads.piecesOS.macOS.pkgArm64","PiecesOS macOS PKG Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pos-launch-only-arm64\u002Fdownload",{"key":166,"label":167,"href":168},"downloads.piecesOS.macOS.pkgIntel","PiecesOS macOS PKG Intel","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-pos-launch-only\u002Fdownload",{"key":170,"label":171,"href":172},"downloads.piecesOS.windows.appinstaller","PiecesOS Windows App Installer","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fappinstaller\u002Fos_server.appinstaller",{"key":174,"label":175,"href":176},"downloads.piecesOS.windows.exe","PiecesOS Windows EXE","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fwindows-exe\u002Fdownload",{"key":178,"label":179,"href":180},"downloads.piecesOS.windows.msix","PiecesOS Windows MSIX","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fwindows-msix\u002Fdownload",{"key":182,"label":183,"href":184},"downloads.piecesOS.linux.snap","PiecesOS Linux Snap package","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fos_server\u002Fsnap\u002Fdownload",{"key":186,"label":187,"href":188},"downloads.combined.macOS.appleSilicon","Combined macOS installer Apple Silicon","https:\u002F\u002Fbuilds.pieces.app\u002Fstages\u002Fproduction\u002Fmacos_packaging\u002Fpkg-arm64\u002Fdownload",{"key":190,"label":191,"href":104},"downloads.combined.macOS.intel","Combined macOS installer Intel",{"key":193,"label":194,"href":195},"downloads.guides.macOS","macOS installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Fmacos-installation-guide",{"key":197,"label":198,"href":199},"downloads.guides.windows","Windows installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Fwindows-installation-guide",{"key":201,"label":202,"href":203},"downloads.guides.linux","Linux installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Flinux-installation-guide",{"key":205,"label":206,"href":207},"downloads.guides.linuxFlatpak","Linux Flatpak installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Flinux-installation-guide\u002Fflatpak",{"key":209,"label":210,"href":211},"downloads.guides.linuxSnap","Linux Snap installation guide","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Flinux-installation-guide\u002Fsnap",{"key":213,"label":214,"href":215},"downloads.guides.piecesOS","PiecesOS manual installation","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Fmanual-installation",{"key":217,"label":218,"href":219},"extensions.chrome","Chrome extension","https:\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Fpieces-save-code-snippets\u002Figbgibhbfonhmjlechmeefimncpekepm",{"key":221,"label":222,"href":223},"extensions.firefox","Firefox add-on","https:\u002F\u002Faddons.mozilla.org\u002Fen-US\u002Ffirefox\u002Faddon\u002Fpieces-save-code-from-the-web\u002F",{"key":225,"label":226,"href":227},"extensions.edge","Edge add-on","https:\u002F\u002Fmicrosoftedge.microsoft.com\u002Faddons\u002Fdetail\u002Fpieces-save-code-snippet\u002Fhglfimcdgonaeeobjckfdabcldfidmim",{"key":229,"label":230,"href":231},"extensions.vscode","VS Code extension","https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=MeshIntelligentTechnologiesInc.pieces-vscode",{"key":233,"label":234,"href":235},"extensions.visualStudio","Visual Studio extension","https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=MeshIntelligentTechnologiesInc.PiecesVisualStudio",{"key":237,"label":238,"href":239},"extensions.jetbrains","JetBrains plugin","https:\u002F\u002Fplugins.jetbrains.com\u002Fplugin\u002F17328-pieces--save-search-share--reuse-code-snippets",{"key":241,"label":242,"href":243},"extensions.obsidian","Obsidian plugin","https:\u002F\u002Fobsidian.md\u002Fplugins?id=pieces-for-developers",{"key":245,"label":246,"href":247},"extensions.sublime","Sublime package","https:\u002F\u002Fpackagecontrol.io\u002Fpackages\u002FPieces",{"key":249,"label":250,"href":251},"extensions.neovim","Neovim plugin","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_neo_vim",{"key":253,"label":254,"href":255},"extensions.jupyterlab","JupyterLab plugin","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fjupyterlab-pieces",{"key":257,"label":258,"href":259},"extensions.cli","Pieces CLI","https:\u002F\u002Fpypi.org\u002Fproject\u002Fpieces-cli\u002F",{"key":261,"label":262,"href":263},"docs.home","Documentation home","https:\u002F\u002Fdocs.pieces.app",{"key":265,"label":266,"href":267},"docs.getStarted","Get started docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces",{"key":269,"label":270,"href":271},"docs.api","API docs","https:\u002F\u002Fdocs.pieces.app\u002Fapi",{"key":273,"label":274,"href":275},"docs.desktop.overview","Desktop overview","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop",{"key":277,"label":278,"href":279},"docs.desktop.onboarding","Desktop onboarding","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fonboarding",{"key":281,"label":282,"href":283},"docs.desktop.timeline","Desktop timeline docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Ftimeline",{"key":285,"label":286,"href":287},"docs.desktop.summaries","Desktop summaries docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fsingle-click-summaries",{"key":289,"label":290,"href":291},"docs.desktop.search","Desktop conversational search docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fconversational-search",{"key":293,"label":294,"href":295},"docs.desktop.drive","Desktop drive docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fdrive",{"key":297,"label":298,"href":299},"docs.desktop.account","Desktop account settings docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fdesktop\u002Fconfiguration\u002Faccount",{"key":301,"label":302,"href":92},"docs.desktop.download","Desktop download docs",{"key":304,"label":305,"href":306},"docs.piecesOS.overview","PiecesOS overview docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies",{"key":308,"label":309,"href":310},"docs.piecesOS.details","PiecesOS details docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os",{"key":312,"label":313,"href":215},"docs.piecesOS.install","PiecesOS install docs",{"key":315,"label":316,"href":317},"docs.piecesOS.quickMenu","PiecesOS quick menu docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Fquick-menu",{"key":319,"label":320,"href":321},"docs.piecesOS.storage","On-device storage docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fon-device-storage",{"key":323,"label":324,"href":325},"docs.piecesOS.troubleshooting","PiecesOS troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fcore-dependencies\u002Fpieces-os\u002Ftroubleshooting",{"key":327,"label":328,"href":329},"docs.mcp.overview","MCP overview docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp",{"key":331,"label":332,"href":333},"docs.mcp.cursor","MCP Cursor docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcursor",{"key":335,"label":336,"href":337},"docs.mcp.vscode","MCP VS Code docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fvs-code",{"key":339,"label":340,"href":341},"docs.mcp.claudeDesktop","MCP Claude Desktop docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-desktop",{"key":343,"label":344,"href":345},"docs.mcp.claudeCode","MCP Claude Code docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-code",{"key":347,"label":348,"href":349},"docs.mcp.claudeCowork","MCP Claude Cowork docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fclaude-cowork",{"key":351,"label":352,"href":353},"docs.mcp.githubCopilot","MCP GitHub Copilot docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgithub-copilot",{"key":355,"label":356,"href":357},"docs.mcp.goose","MCP Goose docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgoose",{"key":359,"label":360,"href":361},"docs.mcp.windsurf","MCP Windsurf docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fwindsurf",{"key":363,"label":364,"href":365},"docs.mcp.zed","MCP Zed docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fzed",{"key":367,"label":368,"href":369},"docs.mcp.jetbrains","MCP JetBrains docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fjetbrains-ides",{"key":371,"label":372,"href":373},"docs.mcp.continueDev","MCP Continue docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcontinue-dev",{"key":375,"label":376,"href":377},"docs.mcp.cline","MCP Cline docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fcline",{"key":379,"label":380,"href":381},"docs.mcp.raycast","MCP Raycast docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fraycast",{"key":383,"label":384,"href":385},"docs.mcp.rovoDevCli","MCP Rovo Dev CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Frovo-dev-cli",{"key":387,"label":388,"href":389},"docs.mcp.openaiCodexCli","MCP OpenAI Codex CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fopenai-codex-cli",{"key":391,"label":392,"href":393},"docs.mcp.googleGeminiCli","MCP Google Gemini CLI docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fgoogle-gemini-cli",{"key":395,"label":396,"href":397},"docs.mcp.amazonQ","MCP Amazon Q docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Famazon-q-developer",{"key":399,"label":400,"href":401},"docs.mcp.chatgptDev","MCP ChatGPT Developer Mode docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fchatgpt-developer-mode",{"key":403,"label":404,"href":405},"docs.mcp.openclaw","MCP OpenClaw docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fopenclaw",{"key":407,"label":408,"href":409},"docs.mcp.mcpRemote","MCP Remote docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fmcp-remote",{"key":411,"label":412,"href":413},"docs.mcp.ngrok","MCP ngrok docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmcp\u002Fngrok-setup",{"key":415,"label":416,"href":417},"docs.troubleshooting.macOS","macOS troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Fmacos",{"key":419,"label":420,"href":421},"docs.troubleshooting.windows","Windows troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Fwindows",{"key":423,"label":424,"href":425},"docs.troubleshooting.linux","Linux troubleshooting docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fmeet-pieces\u002Ftroubleshooting\u002Flinux",{"key":427,"label":428,"href":429},"docs.privacy","Privacy and security docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fprivacy-security-your-data",{"key":431,"label":432,"href":433},"docs.support","Support docs","https:\u002F\u002Fdocs.pieces.app\u002Fproducts\u002Fsupport",{"key":435,"label":436,"href":437},"portal.home","Pieces portal","https:\u002F\u002Fportal.pieces.app",{"key":439,"label":440,"href":441},"site.home","Website home","https:\u002F\u002Fpieces.app",{"key":443,"label":444,"href":445},"site.about","About page","https:\u002F\u002Fpieces.app\u002Fabout",{"key":447,"label":448,"href":449},"site.features","Features page","https:\u002F\u002Fpieces.app\u002Ffeatures",{"key":451,"label":452,"href":453},"site.plugins","Plugins page","https:\u002F\u002Fpieces.app\u002Fplugins",{"key":455,"label":456,"href":457},"site.contact","Contact page","https:\u002F\u002Fpieces.app\u002Fcontact",{"key":459,"label":58,"href":460},"site.updates","https:\u002F\u002Fpieces.app\u002Fupdates",{"key":462,"label":463,"href":464},"site.news","News","https:\u002F\u002Fpieces.app\u002Fnews",{"key":466,"label":467,"href":468},"site.events","Community events","https:\u002F\u002Fpieces.app\u002Fcommunity\u002Fevents",{"key":470,"label":471,"href":472},"site.userStories","User stories","https:\u002F\u002Fpieces.app\u002Fuser-stories",{"key":474,"label":475,"href":476},"site.academy","Academy","https:\u002F\u002Fpieces.app\u002Flearn\u002Facademy",{"key":478,"label":479,"href":480},"site.support","Website support","https:\u002F\u002Fpieces.app\u002Fsupport",{"key":482,"label":483,"href":484},"site.standup","Standup","https:\u002F\u002Fpieces.app\u002Fstandup",{"key":486,"label":34,"href":487},"site.blog","https:\u002F\u002Fcode.pieces.app\u002Fblog",{"key":489,"label":43,"href":490},"social.discord","https:\u002F\u002Fdiscord.gg\u002Fgetpieces",{"key":492,"label":46,"href":493},"social.x","https:\u002F\u002Fx.com\u002Fgetpieces",{"key":495,"label":496,"href":493},"social.twitter","Twitter",{"key":498,"label":499,"href":500},"social.instagram","Instagram","https:\u002F\u002Fwww.instagram.com\u002Fgetpieces\u002F",{"key":502,"label":503,"href":504},"social.tiktok","TikTok","https:\u002F\u002Fwww.tiktok.com\u002F@getpieces",{"key":506,"label":49,"href":507},"social.linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Fgetpieces\u002F",{"key":509,"label":510,"href":511},"social.youtube","YouTube","https:\u002F\u002Fyoutube.com\u002F@getpieces",{"key":513,"label":514,"href":515},"github.org","GitHub organization","https:\u002F\u002Fgithub.com\u002Fpieces-app",{"key":517,"label":518,"href":519},"github.support","GitHub support","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport",{"key":521,"label":522,"href":523},"github.issues","GitHub issues","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport\u002Fissues",{"key":525,"label":526,"href":527},"github.discussions","GitHub discussions","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fsupport\u002Fdiscussions",{"key":529,"label":530,"href":531},"github.documentation","GitHub documentation","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fdocumentation",{"key":533,"label":534,"href":535},"github.opensource","GitHub open source","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fopensource",{"key":537,"label":538,"href":539},"github.sdks.python","Python SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-python",{"key":541,"label":542,"href":543},"github.sdks.typescript","TypeScript SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-typescript",{"key":545,"label":546,"href":547},"github.sdks.dart","Dart SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-dart",{"key":549,"label":550,"href":551},"github.sdks.kotlin","Kotlin SDK","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fpieces-os-client-sdk-for-kotlin",{"key":553,"label":554,"href":555},"github.plugins.obsidian","Obsidian plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fobsidian-pieces",{"key":557,"label":558,"href":255},"github.plugins.jupyterlab","JupyterLab plugin repository",{"key":560,"label":561,"href":562},"github.plugins.sublime","Sublime plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_sublime",{"key":564,"label":565,"href":566},"github.plugins.neovim","Neovim plugin repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fplugin_neovim",{"key":568,"label":569,"href":570},"github.cliAgent","CLI agent repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fcli-agent",{"key":572,"label":573,"href":574},"github.mcpDart","MCP Dart repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fmcp_dart",{"key":576,"label":577,"href":578},"github.awesomePieces","Awesome Pieces repository","https:\u002F\u002Fgithub.com\u002Fpieces-app\u002Fawesome-pieces",{"key":580,"label":581,"href":66},"legal.privacyPolicy","Privacy policy",{"key":583,"label":584,"href":69},"legal.refundPolicy","Refund policy",{"key":586,"label":587,"href":72},"legal.terms","Terms",{"key":589,"label":590,"href":591},"legal.security","Legal security","https:\u002F\u002Fpieces.app\u002Flegal\u002Fsecurity",{"key":593,"label":594,"href":511},"videos.youtubeChannel","YouTube channel",{"key":596,"label":597,"href":598},"videos.gettingStartedDesktop","Getting started desktop video","https:\u002F\u002Fyoutu.be\u002FdUr1lRM_TYk",{"key":600,"label":601,"href":602},"videos.snippetDiscoveryxR","Snippet discovery video","https:\u002F\u002Fyoutu.be\u002FG6vb1USw-30",{"key":604,"label":605,"href":606},"sales.bookACall","Book a sales call","https:\u002F\u002Fcalendar.app.google\u002FWVUDtUfNy5Vst3sH7",{"key":608,"label":609,"href":610},"sales.enterprise","Enterprise form","https:\u002F\u002Fgetpieces.typeform.com\u002Fto\u002FaVQFTvpE",{"key":612,"label":613,"href":527},"sales.feedback","Feedback discussions",{"key":615,"label":616,"href":617},"sales.earlyAccess","Early access form","https:\u002F\u002Fgetpieces.typeform.com\u002Fearlyaccess",{"key":619,"label":620,"href":621},"sales.supportEmail","Support email","mailto:support@pieces.app",{"key":623,"label":624,"href":19},"routes.home","Home route",{"key":626,"label":627,"href":56},"routes.about","About route",{"key":629,"label":630,"href":12},"routes.downloads","Downloads route",{"key":632,"label":633,"href":634},"routes.thanks","Post-install thanks route","\u002Finstall\u002Fthanks",{"key":636,"label":637,"href":638},"routes.pricing","Pricing route","\u002Fpricing",{"key":640,"label":641,"href":642},"cta.freeTrial","Start free trial CTA (Pieces Pro) — used by \u002Fcampaigns\u002F* landing pages","https:\u002F\u002Fcampaigns.pieces.app\u002F",{"key":644,"label":645,"href":22},"routes.enterprise","Enterprise route",{"key":647,"label":648,"href":62},"routes.contact","Contact route",{"key":650,"label":651,"href":59},"routes.updates","Updates route",{"key":653,"label":654,"href":655},"routes.migrationError","Migration error route","\u002Fmigration\u002Ferror",{"key":657,"label":658,"href":659},"routes.authenticated","Post-login authenticated route","\u002Fauth\u002Fsigned-in",{"key":661,"label":662,"href":663},"routes.signed-out","Signed out route","\u002Fauth\u002Fsigned-out",{"key":665,"label":666,"href":667},"routes.authentication-error","Authentication error route","\u002Fauth\u002Ferror",{},"data\u002Fshared\u002Furls","2AvfSWI6bZACH5Kr1ZS3txMLjteRjCjbDR_ul1uRZ9Q",{"id":672,"title":673,"author":674,"authorPhoto":675,"authorPhotoAlt":676,"authorSlug":677,"body":678,"buttonText":676,"buttonUrl":676,"category":1177,"date":1178,"description":1179,"draft":1180,"editorsPick":1180,"extension":1181,"featured":1180,"image":1182,"imageAlt":676,"meta":1183,"navigation":32,"ogImage":676,"ogImageAlt":676,"path":1184,"seo":1185,"stem":1186,"tags":676,"__hash__":1187},"blog\u002Fblog\u002Fconverting-a-dart-google-chrome-extension-to-a-safari-extension.md","Converting a Dart Google Chrome extension to a Safari extension","Mason Williams","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fconverting-a-dart-google-chrome-extension-to-a-safari-extension\u002Fauthor.jpeg",null,"mason-williams",{"type":679,"value":680,"toc":1142},"minimark",[681,685,689,693,696,719,722,726,729,739,742,745,749,752,757,760,766,770,784,790,793,797,800,804,807,813,818,841,844,848,851,855,873,876,879,883,886,890,961,965,991,994,997,1001,1004,1023,1026,1030,1033,1037,1048,1052,1055,1106,1109,1113,1122,1125,1137],[682,683,684],"p",{},"Hello! I'm Mason Williams, a software engineer specializing in developing both internal and external tools and extensions. If you've developed a Google Chrome extension using Flutter and Dart, you might be considering bringing it over to Safari to cater to a broader audience. This guide will walk you through the step-by-step process of converting your existing Chrome extension into a Safari extension using Xcode.",[686,687],"h2",{"id":688},"",[686,690,692],{"id":691},"prerequisites","Prerequisites",[682,694,695],{},"Before you begin, ensure you have the following:",[697,698,699,707,713],"ul",{},[700,701,702,706],"li",{},[703,704,705],"strong",{},"Xcode Installed",": You need Xcode to build and manage the Safari extension project.",[700,708,709,712],{},[703,710,711],{},"Flutter\u002FDart Chrome Extension",": Your existing extension, ready to be converted.",[700,714,715,718],{},[703,716,717],{},"Basic Knowledge of Terminal Commands",": You'll be using the command line for some steps.",[686,720],{"id":721},"_1",[686,723,725],{"id":724},"_1-compile-your-chrome-extension","1. Compile Your Chrome Extension",[682,727,728],{},"First, you need to compile your existing Chrome extension to generate the build\u002Fweb folder, which contains the compiled version of your extension.",[730,731,736],"pre",{"className":732,"code":734,"language":735},[733],"language-text","flutter build web\n","text",[737,738,734],"code",{"__ignoreMap":688},[682,740,741],{},"This command will compile your Flutter web app and place the output in the build\u002Fweb directory.",[686,743],{"id":744},"_2",[686,746,748],{"id":747},"_2-ensure-manifest-compatibility","2. Ensure manifest compatibility",[682,750,751],{},"Safari extensions use a manifest.json file similar to Chrome, but there are some differences. You'll need to adjust your manifest file to be compatible with Safari.",[753,754,756],"h3",{"id":755},"create-a-safari-specific-manifest","Create a Safari-specific manifest",[682,758,759],{},"If you ship your extension to multiple browsers, you might already have separate manifest files. Create a manifest_safari.json for Safari:",[730,761,764],{"className":762,"code":763,"language":735},[733],"cp manifest_regular.json manifest_safari.json\n",[737,765,763],{"__ignoreMap":688},[753,767,769],{"id":768},"update-permissions-and-features","Update permissions and features",[697,771,772,778],{},[700,773,774,777],{},[703,775,776],{},"Permissions",": Safari may not support all the permissions that Chrome does. Review the permissions in your manifest_safari.json and remove any that are not supported.",[700,779,780,783],{},[703,781,782],{},"Remove Unsupported Features",": Safari doesn't support side panels like Chrome. Remove any \"side_panel\" entries from your manifest and permissions array.",[682,785,786,789],{},[703,787,788],{},"Note",": When you run the converter command later, it will log any potential issues with your manifest.",[686,791],{"id":792},"_3",[686,794,796],{"id":795},"_3-run-the-safari-web-extension-converter","3. Run the Safari web extension converter",[682,798,799],{},"Apple provides a command-line tool to help convert your web extension to a Safari extension.",[753,801,803],{"id":802},"command-to-generate-the-xcode-project","Command to generate the Xcode project",[682,805,806],{},"Run the following command in your terminal:",[730,808,811],{"className":809,"code":810,"language":735},[733],"xcrun safari-web-extension-converter \u002Fpath\u002Fto\u002Fbuild\u002Fweb \\\n\n--project-location .. \\\n\n--bundle-identifier com.yourcompany.YourExtension \\\n\n--swift \\\n\n--macos-only \\\n\n--copy-resources \\\n\n--force\n",[737,812,810],{"__ignoreMap":688},[682,814,815],{},[703,816,817],{},"Flags explained:",[697,819,820,823,826,829,832,835,838],{},[700,821,822],{},"\u002Fpath\u002Fto\u002Fbuild\u002Fweb: Replace with the actual path to your build\u002Fweb folder.",[700,824,825],{},"--project-location ..: Places the Xcode project one directory up from the current location.",[700,827,828],{},"--bundle-identifier: A unique identifier for your extension (e.g., com.pieces.PiecesForSafari.Extension).",[700,830,831],{},"--swift: Generates the extension using Swift.",[700,833,834],{},"--macos-only: Targets macOS only.",[700,836,837],{},"--copy-resources: Copies the resources into the Xcode project.",[700,839,840],{},"--force: Overwrites existing files if necessary.",[686,842],{"id":843},"_4",[686,845,847],{"id":846},"_4-build-the-xcode-project","4. Build the Xcode project",[682,849,850],{},"After running the converter, Xcode should automatically open with your new project.",[753,852,854],{"id":853},"building-the-project","Building the project",[697,856,857,863],{},[700,858,859,862],{},[703,860,861],{},"Using Keyboard Shortcut",": Press Command + B to build the project.",[700,864,865,868,869,872],{},[703,866,867],{},"Using Menu Bar",": Navigate to ",[703,870,871],{},"Product > Build"," in the top menu bar.",[682,874,875],{},"Wait for the build to complete. Fix any build errors that may occur.",[686,877],{"id":878},"_5",[686,880,882],{"id":881},"_5-enable-the-extension-in-safari","5. Enable the extension in Safari",[682,884,885],{},"Now that your extension is built, you need to enable it in Safari for testing.",[753,887,889],{"id":888},"steps-to-enable-unsigned-extensions","Steps to enable unsigned extensions",[891,892,893,899,917,937],"ol",{},[700,894,895,898],{},[703,896,897],{},"Open Safari",".",[700,900,901,904,905],{},[703,902,903],{},"Access Safari Settings",":",[891,906,907,914],{},[700,908,909,910,913],{},"Click on ",[703,911,912],{},"Safari > Settings"," in the menu bar.",[700,915,916],{},"Or press Command + ,.",[700,918,919,904,922],{},[703,920,921],{},"Enable Developer Features",[891,923,924,931],{},[700,925,926,927,930],{},"Go to the ",[703,928,929],{},"Advanced"," tab.",[700,932,933,934,898],{},"Check ",[703,935,936],{},"\"Show Develop menu in menu bar\"",[700,938,939,904,942],{},[703,940,941],{},"Allow Unsigned Extensions",[891,943,944,947,954],{},[700,945,946],{},"Close the settings window.",[700,948,949,950,953],{},"Click on the new ",[703,951,952],{},"Develop"," menu in the menu bar.",[700,955,956,957,960],{},"Ensure ",[703,958,959],{},"\"Allow Unsigned Extensions\""," is checked.",[753,962,964],{"id":963},"enable-your-extension","Enable your extension",[891,966,967,979,985],{},[700,968,969,972,973,975,976,930],{},[703,970,971],{},"Open Safari Settings Again",": Click on ",[703,974,912],{},". Navigate to the ",[703,977,978],{},"Extensions",[700,980,981,984],{},[703,982,983],{},"Activate Your Extension",": Find your extension in the list. Check the box next to it to enable it.",[700,986,987,990],{},[703,988,989],{},"Confirm Activation",": A prompt may appear asking for confirmation. Accept it.",[682,992,993],{},"Your extension should now be active and visible in Safari!",[686,995],{"id":996},"_6",[686,998,1000],{"id":999},"_6-test-your-extension","6. Test your extension",[682,1002,1003],{},"It's crucial to thoroughly test your extension to ensure all features work as expected in Safari.",[697,1005,1006,1012,1017],{},[700,1007,1008,1011],{},[703,1009,1010],{},"Functionality",": Check all the features and interactions.",[700,1013,1014,1016],{},[703,1015,776],{},": Ensure the extension has the necessary permissions.",[700,1018,1019,1022],{},[703,1020,1021],{},"UI\u002FUX",": Verify that the user interface elements display correctly.",[686,1024],{"id":1025},"_7",[686,1027,1029],{"id":1028},"_7-publishing-your-extension","7. Publishing your extension",[682,1031,1032],{},"Once you're satisfied with your extension's performance, you can proceed to publish it.",[753,1034,1036],{"id":1035},"apple-developer-program","Apple developer program",[682,1038,1039,1040,1047],{},"You need to be enrolled in the ",[1041,1042,1046],"a",{"href":1043,"rel":1044},"https:\u002F\u002Fdeveloper.apple.com\u002Fprograms\u002F",[1045],"nofollow","Apple Developer Program"," to distribute your extension.",[753,1049,1051],{"id":1050},"distribute-your-app","Distribute your app",[682,1053,1054],{},"Safari extensions are distributed as part of a macOS app. Follow these steps:",[891,1056,1057,1068,1079,1088,1094],{},[700,1058,1059,1062,1063,898],{},[703,1060,1061],{},"Select a Distribution Method",": Refer to Apple's documentation on ",[1041,1064,1067],{"href":1065,"rel":1066},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002FXcode\u002Fdistributing-your-app-for-beta-testing-and-releases#Select-a-method-for-distribution",[1045],"Distributing Your App for Beta Testing and Releases",[700,1069,1070,1073,1074,898],{},[703,1071,1072],{},"Prepare for Submission",": Ensure your app meets all the ",[1041,1075,1078],{"href":1076,"rel":1077},"https:\u002F\u002Fdeveloper.apple.com\u002Fapp-store\u002Freview\u002Fguidelines\u002F",[1045],"App Store Review Guidelines",[700,1080,1081,1084,1085,898],{},[703,1082,1083],{},"Archive Your App",": In Xcode, select ",[703,1086,1087],{},"Product > Archive",[700,1089,1090,1093],{},[703,1091,1092],{},"Upload to App Store Connect",": Use the Organizer window to upload your app.",[700,1095,1096,1099,1100,1105],{},[703,1097,1098],{},"Submit for Review",": In ",[1041,1101,1104],{"href":1102,"rel":1103},"https:\u002F\u002Fappstoreconnect.apple.com\u002F",[1045],"App Store Connect",", create a new app listing and submit your extension for review.",[753,1107],{"id":1108},"_8",[686,1110,1112],{"id":1111},"additional-resources","Additional resources",[697,1114,1115],{},[700,1116,1117],{},[1041,1118,1121],{"href":1119,"rel":1120},"https:\u002F\u002Fdeveloper.apple.com\u002Flibrary\u002Farchive\u002Fdocumentation\u002FNetworkingInternetWeb\u002FConceptual\u002FSafariAppExtension_PG\u002Findex.html",[1045],"Safari App Extension Programming Guide",[682,1123,1124],{},"Converting your Flutter\u002FDart Chrome extension to a Safari extension may seem daunting at first, but by following these steps, you can seamlessly bring your extension to a new audience. Remember to test thoroughly and adhere to Apple's guidelines to ensure a smooth review process.",[682,1126,1127,1130,1131,1136],{},[703,1128,1129],{},"Have questions or need further assistance?"," Feel free to join our ",[1041,1132,1135],{"href":1133,"rel":1134},"https:\u002F\u002Fdiscord.com\u002Finvite\u002Fgetpieces",[1045],"Discord Server","!",[682,1138,1139],{},[703,1140,1141],{},"Happy Coding!",{"title":688,"searchDepth":1143,"depth":1143,"links":1144},2,[1145,1146,1147,1148,1149,1150,1155,1156,1159,1160,1163,1164,1168,1169,1170,1171,1176],{"id":688,"depth":1143,"text":688},{"id":691,"depth":1143,"text":692},{"id":721,"depth":1143,"text":688},{"id":724,"depth":1143,"text":725},{"id":744,"depth":1143,"text":688},{"id":747,"depth":1143,"text":748,"children":1151},[1152,1154],{"id":755,"depth":1153,"text":756},3,{"id":768,"depth":1153,"text":769},{"id":792,"depth":1143,"text":688},{"id":795,"depth":1143,"text":796,"children":1157},[1158],{"id":802,"depth":1153,"text":803},{"id":843,"depth":1143,"text":688},{"id":846,"depth":1143,"text":847,"children":1161},[1162],{"id":853,"depth":1153,"text":854},{"id":878,"depth":1143,"text":688},{"id":881,"depth":1143,"text":882,"children":1165},[1166,1167],{"id":888,"depth":1153,"text":889},{"id":963,"depth":1153,"text":964},{"id":996,"depth":1143,"text":688},{"id":999,"depth":1143,"text":1000},{"id":1025,"depth":1143,"text":688},{"id":1028,"depth":1143,"text":1029,"children":1172},[1173,1174,1175],{"id":1035,"depth":1153,"text":1036},{"id":1050,"depth":1153,"text":1051},{"id":1108,"depth":1153,"text":688},{"id":1111,"depth":1143,"text":1112},"Software Development","2024-11-15T00:00:00.000Z","Convert your Flutter\u002FDart Chrome extension to Safari with this step-by-step guide using Xcode for broader reach.",false,"md","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fblog\u002Fconverting-a-dart-google-chrome-extension-to-a-safari-extension\u002Fhero.png",{},"\u002Fblog\u002Fconverting-a-dart-google-chrome-extension-to-a-safari-extension",{"title":673,"description":1179},"blog\u002Fconverting-a-dart-google-chrome-extension-to-a-safari-extension","RuOSQwgYUOqK343TlShF2K-trsIU01pZoITc6EN4P7U",{"id":1189,"title":674,"body":1190,"description":1194,"draft":1180,"extension":1181,"meta":1197,"navigation":32,"path":1198,"photo":1199,"photoAlt":676,"seo":1200,"stem":1201,"__hash__":1202},"authors\u002Fauthors\u002Fmason-williams.md",{"type":679,"value":1191,"toc":1195},[1192],[682,1193,1194],{},"Mason Williams began coding in high school, a passion that laid the groundwork for his path into the world of tech startups. He founded two startups in college, both in the gaming space, one of which was acquired his senior year. Now at Pieces, Mason applies his entrepreneurial and technical experience to building world-class products for our community of amazing developers. Outside of Pieces, Mason loves spending time with family and friends, building the occasional side project, and hosting events in the StartupCincy community.",{"title":688,"searchDepth":1143,"depth":1143,"links":1196},[],{},"\u002Fauthors\u002Fmason-williams","https:\u002F\u002Fstorage.googleapis.com\u002Fpieces-marketing-website\u002Fimages\u002Fauthors\u002Fmason-williams.png",{"title":674,"description":1194},"authors\u002Fmason-williams","SAu48uhUYNVqrBvgmjzDl6aiuYGufXtdiVpqwC38U_o",{"left":1204,"top":1204,"width":1205,"height":1205,"rotate":1204,"vFlip":1180,"hFlip":1180,"body":1206},0,24,"\u003Cpath fill=\"currentColor\" d=\"m7.825 13l4.9 4.9q.3.3.288.7t-.313.7q-.3.275-.7.288t-.7-.288l-6.6-6.6q-.15-.15-.213-.325T4.426 12t.063-.375t.212-.325l6.6-6.6q.275-.275.688-.275t.712.275q.3.3.3.713t-.3.712L7.825 11H19q.425 0 .713.288T20 12t-.288.713T19 13z\"\u002F>"]