Skip to content
Documentation

    Embed the Portal in a Forge App

    Released.so is a changelog and release notes platform that provides embeddable widgets to display product updates. This documentation covers the complete setup process for integrating Released.so embeds in Forge apps while handling Content Security Policy (CSP) requirements.

    • A Forge app with UI components
    • A Released.so account with an embed widget configured
    • Access to your Released.so embed script URL

    The Released.so embed requires multiple types of external resources:

    Permission Type Address Pattern Purpose
    scripts *.released.so Main embed script and dynamically loaded modules
    styles *.released.so CSS files including fonts (Inter font family)
    fonts *.released.so Web font files
    images *.released.so Post images and other visual assets
    fetch.client *.released.so API calls for loading content

    Add the necessary external permissions to your manifest.yml file to allow Released.so resources:

    permissions:
    external:
    fetch:
    client:
    - address: "*.released.so"
    scripts:
    - address: "*.released.so"
    styles:
    - address: "*.released.so"
    fonts:
    - address: "*.released.so"
    images:
    - address: "*.released.so"
    import React, { useEffect } from 'react';
    interface ReleasedEmbedProps {
    embedId: string;
    className?: string;
    }
    export const ReleasedEmbed: React.FC<ReleasedEmbedProps> = ({
    embedId,
    className = ''
    }) => {
    useEffect(() => {
    // Create script element
    const script = document.createElement('script');
    script.src = 'https://embed.released.so/1/embed.js';
    script.async = true;
    script.setAttribute('data-embed-id', embedId);
    // Add to document head
    document.head.appendChild(script);
    // Cleanup function
    return () => {
    document.head.removeChild(script);
    };
    }, [embedId]);
    return (
    <div
    className={`released-embed ${className}`}
    id={`released-embed-${embedId}`}
    >
    {/* Released.so content will be injected here */}
    </div>
    );
    };
    <!DOCTYPE html>
    <html>
    <head>
    <script
    src="https://embed.released.so/1/embed.js"
    data-embed-id="YOUR_EMBED_ID"
    async>
    </script>
    </head>
    <body>
    <div id="released-embed">
    <!-- Released.so content will be injected here -->
    </div>
    </body>
    </html>

    If you encounter Content Security Policy violations, verify these configurations:

    Error: Loading the script 'https://embed.released.so/...' violates CSP directive

    Solution: Ensure scripts: - address: "*.released.so" is in external permissions.

    Error: Loading stylesheet 'https://embed.released.so/fonts/inter/inter.css' blocked by CSP

    Solution: Add styles: - address: "*.released.so" to external permissions.

    Error: Loading image from 'https://cdn.released.so/...' blocked by CSP

    Solution: Add images: - address: "*.released.so" to external permissions.

    1. Check Browser DevTools

      Look for CSP violation errors in the console

    2. Verify Manifest

      Ensure all required external permissions are present

    3. Test Deploy

      Run forge deploy after manifest changes

    4. Clear Cache

      Browser cache might retain old CSP policies

    1. Use Specific Domains: We use *.released.so to allow subdomains but limit to Released.so only
    2. Avoid Wildcards: Don’t use * for all domains - be specific to Released.so
    1. Lazy Loading: Load the embed script only when needed
    2. Async Loading: Always use async attribute on script tags