Skip to main content

Deploying your add-on

Congratulations! You've built a fully functional EMET Surf add-on. Now it's time to make it available to users worldwide by deploying it to the internet.

Why deployment matters

Your add-on needs to be hosted online so users can install it by URL. Local development is great for testing, but for real users, you need a public server.

Hosting options

There are many ways to host your add-on. Choose what works best for your needs and budget:

Perfect for: Decentralized, censorship-resistant hosting

  • IPFS + IPNS: Decentralized storage with updateable manifests
  • Pinata: Easy IPFS pinning service
  • Infura IPFS: Enterprise IPFS hosting
  • Fleek: Automated IPFS deployments
  • Web3.Storage: Free IPFS storage

Static hosting (traditional)

Perfect for: Simple add-ons with static JSON files

  • GitHub Pages: Free, easy to set up
  • Netlify: Free tier, automatic deployments
  • Vercel: Free tier, great performance
  • Firebase Hosting: Google's hosting service
  • AWS S3 + CloudFront: Scalable but more complex

Dynamic hosting

Perfect for: Add-ons with dynamic content or large catalogs

  • Heroku: Easy deployment, free tier available
  • DigitalOcean: Affordable VPS hosting
  • AWS EC2: Scalable cloud hosting
  • Google Cloud Platform: Similar to AWS
  • Railway: Simple deployment platform

IPFS (InterPlanetary File System) is ideal for EMET Surf add-ons because it provides decentralized, censorship-resistant hosting with the ability to update your manifest using IPNS.

Why IPFS for add-ons?

  • Decentralized: No single point of failure
  • Censorship-resistant: Content can't be easily taken down
  • Updateable: Use IPNS to update your manifest without changing the URL
  • Global: Content is distributed worldwide
  • Free: Many IPFS services offer free hosting

Basic IPFS deployment

1. Prepare your add-on folder

Your deployment folder must contain at least your manifest.json file:

my-addon/
├── manifest.json
├── catalog/
│ ├── movie/
│ │ └── movieCatalog.json
│ └── series/
│ └── seriesCatalog.json
├── meta/
│ ├── movie/
│ │ └── hiwrld_jellyfish.json
│ └── series/
│ └── hiwrld_tt0147753.json
└── stream/
├── movie/
│ ├── tt0032138.json
│ ├── tt0017136.json
│ └── hiwrld_jellyfish.json
└── series/
├── hiwrld_tt0147753:1:1.json
└── hiwrld_tt0147753:1:2.json

2. Upload to IPFS

Using IPFS CLI:

# Install IPFS Desktop or IPFS CLI
ipfs add -r my-addon/

This will output a CID (Content Identifier) like:

added QmX... my-addon/manifest.json
added QmY... my-addon/catalog/movie/movieCatalog.json
...

3. Pin your content

To keep your content available:

ipfs pin add QmX...  # Your root folder CID

Using IPNS for updateable manifests

IPNS (InterPlanetary Name System) allows you to update your manifest without changing the installation URL.

1. Create an IPNS key

ipfs key gen my-addon-key

This creates a key pair for your add-on.

2. Publish your manifest to IPNS

# First, add your manifest to IPFS
ipfs add manifest.json

# Then publish it to IPNS using your key
ipfs name publish --key=my-addon-key QmX... # Your manifest CID

This gives you an IPNS address like:

Published to k51qzi5uqu5d...: /ipfs/QmX...

3. Users install using IPNS

Users can install your add-on using:

ipns://k51qzi5uqu5d.../manifest.json

IPFS hosting services

  1. Sign up at pinata.cloud
  2. Upload your folder through the web interface
  3. Get your CID from the dashboard
  4. Use IPNS for updateable manifests

Fleek (automated deployments)

  1. Connect your GitHub repository to Fleek
  2. Configure build settings (static site)
  3. Deploy automatically on every commit
  4. Get IPFS CID and IPNS address

Web3.Storage (free)

  1. Sign up at web3.storage
  2. Upload via API or web interface
  3. Get CID and pin automatically
  4. Use with IPNS for updates

Updating your add-on

When you need to update your add-on:

  1. Modify your files locally
  2. Add the updated folder to IPFS:
    ipfs add -r my-addon/
  3. Publish the new CID to IPNS:
    ipfs name publish --key=my-addon-key QmNewCID...

Users don't need to reinstall - the IPNS address stays the same!

IPFS gateway considerations

Users can access your add-on through various IPFS gateways:

  • ipfs.io: https://ipfs.io/ipns/k51qzi5uqu5d.../manifest.json
  • Cloudflare: https://cloudflare-ipfs.com/ipns/k51qzi5uqu5d.../manifest.json
  • dweb.link: https://dweb.link/ipns/k51qzi5uqu5d.../manifest.json

Recommendation: Use the ipns:// protocol directly in EMET Surf for the best experience.

Preparing for deployment

Before deploying, make sure your add-on is ready:

1. Test everything locally

  • All catalogs load correctly
  • Search and filters work
  • Streams play properly
  • No JSON syntax errors

2. Optimize your files

  • Compress images (use WebP format when possible)
  • Minimize JSON files (remove unnecessary whitespace)
  • Use efficient image sizes (posters around 300×450px)

3. Set up CORS headers

Your hosting must include CORS headers:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type

Note: IPFS gateways typically handle CORS automatically.

4. Choose your manifest URL

Decide on your public manifest URL. Examples:

  • IPFS: ipns://k51qzi5uqu5d.../manifest.json
  • Traditional: https://myaddon.com/manifest.json
  • GitHub Pages: https://username.github.io/my-addon/manifest.json

Deployment example: IPFS with Pinata

Let's walk through deploying to IPFS using Pinata:

1. Prepare your files

Ensure your add-on folder contains all necessary files:

my-addon/
├── manifest.json
├── catalog/
├── meta/
└── stream/

2. Upload to Pinata

  1. Go to pinata.cloud and create an account
  2. Click "Upload" → "Folder"
  3. Select your add-on folder
  4. Upload and get your CID
  1. Use IPFS CLI or a service like Fleek to create an IPNS key
  2. Publish your CID to IPNS
  3. Get your IPNS address

4. Your add-on is live!

Your manifest will be available at:

  • Direct IPFS: ipfs://QmX.../manifest.json
  • IPNS (recommended): ipns://k51qzi5uqu5d.../manifest.json

Using redirectable manifests

EMET Surf supports redirectable manifests, which works great with IPFS:

{
"id": "my.addon",
"version": "1.0.0",
"name": "My Add-on",
"description": "My awesome add-on",
"location": [
"ipns://k51qzi5uqu5d.../manifest.json",
"https://backup-server.com/manifest.json"
],
"resources": ["catalog", "meta", "stream"],
"types": ["movie", "series"]
}

Benefits with IPFS:

  • Primary manifest on IPNS (decentralized)
  • Backup on traditional hosting
  • Automatic failover if IPFS is slow
  • Update IPNS without changing location URLs

Production best practices

1. Use IPNS for updateable manifests

  • Always use IPNS for your main manifest
  • Keep your IPNS key secure
  • Test updates before publishing

2. Pin your content

  • Use multiple pinning services for redundancy
  • Pinata, Infura, and Web3.Storage are good options
  • Consider running your own IPFS node

3. Monitor your add-on

  • Check IPFS gateway availability
  • Monitor IPNS resolution
  • Watch for user reports

4. Version your add-on properly

  • Use semantic versioning (1.0.0, 1.1.0, etc.)
  • Update version when you make changes
  • Test new versions before releasing

5. Provide fallbacks

  • Always return valid JSON (even if empty)
  • Handle missing content gracefully
  • Use redirectable manifests for reliability

Testing your deployed add-on

1. Test the manifest URL

Visit your manifest URL through an IPFS gateway:

https://ipfs.io/ipns/k51qzi5uqu5d.../manifest.json

You should see your JSON manifest.

2. Test in EMET Surf

  • Install your add-on using the IPNS URL
  • Test all features: browsing, search, streaming
  • Check that everything works as expected

3. Test IPNS updates

  • Make a small change to your manifest
  • Update the IPNS record
  • Verify the change appears in EMET Surf

Sharing your add-on

Once deployed, you can share your add-on with users:

1. Share the IPNS URL

Users can install by pasting your IPNS URL in EMET Surf:

ipns://k51qzi5uqu5d.../manifest.json

2. Create a simple website

Build a basic website explaining your add-on:

  • What content it provides
  • How to install it (IPNS URL)
  • Contact information for support

3. Community sharing

  • Share in EMET Surf communities
  • Create documentation
  • Provide support for users

Troubleshooting deployment

Common IPFS issues:

IPNS resolution slow:

  • IPNS can take time to propagate
  • Use multiple IPFS gateways
  • Consider using direct IPFS CIDs for testing

Content not available:

  • Ensure your content is pinned
  • Use multiple pinning services
  • Check IPFS gateway status

CORS errors:

  • IPFS gateways handle CORS automatically
  • Test through different gateways
  • Check gateway-specific issues

404 errors:

  • Verify your file paths are correct
  • Check that all files are uploaded
  • Ensure your CID is correct

Traditional hosting issues:

CORS errors:

  • Ensure your hosting provides CORS headers
  • Test with a CORS checker tool

JSON errors:

  • Validate your JSON files
  • Check for syntax errors

Performance issues:

  • Optimize image sizes
  • Use CDN for static assets
  • Consider caching strategies

What you've accomplished

  • Built a complete EMET Surf add-on
  • Added all major features: catalogs, metadata, streams, search, filters
  • Deployed it to IPFS with updateable manifests
  • Made it available to users worldwide via IPNS

Next steps

Your add-on is now live on IPFS! Consider these enhancements:

  • Add more content to your catalogs
  • Implement dynamic search and filtering
  • Add more content types (channels, live TV)
  • Optimize performance and user experience
  • Gather user feedback and improve
  • Set up automated IPFS deployments

Summary

  • IPFS provides decentralized, censorship-resistant hosting
  • Use IPNS for updateable manifests without changing URLs
  • Pin your content on multiple services for redundancy
  • Test thoroughly through IPFS gateways
  • Share your IPNS URL with users
  • Your add-on is now ready for the decentralized world!

Congratulations on building and deploying your first EMET Surf add-on on IPFS! 🎉