This guide explains how to deploy Fluent Jot to Azure Static Web Apps using GitHub Actions.
- Azure subscription
- GitHub repository with admin access
- Azure CLI installed (optional, for command-line setup)
-
Navigate to Azure Portal
-
Create a new resource → Static Web App
-
Configure the basic settings:
- Subscription: Your Azure subscription
- Resource Group: Create new or use existing
- Name:
fluent-jot(or your preferred name) - Plan type: Free (sufficient for this project)
- Region: Choose closest to your users
- Source: GitHub
- GitHub account: Connect your account
- Organization:
wictorwilen - Repository:
fluentui-icons-to-excalidraw - Branch:
main - Build presets: React
- App location:
/web - Output location:
build
-
Click "Review + create" then "Create"
# Login to Azure
az login
# Create resource group (if needed)
az group create --name rg-fluent-jot --location "East US"
# Create Static Web App
az staticwebapp create \
--name fluent-jot \
--resource-group rg-fluent-jot \
--source https://github.com/wictorwilen/fluentui-icons-to-excalidraw \
--location "East US" \
--branch main \
--app-location "/web" \
--output-location "build" \
--login-with-githubAfter creating the Static Web App, Azure will automatically:
- Create a GitHub Actions workflow file
- Add the
AZURE_STATIC_WEB_APPS_API_TOKENsecret to your repository
If you need to manually add the secret:
- Go to your repository on GitHub
- Settings → Secrets and variables → Actions
- Add new repository secret:
- Name:
AZURE_STATIC_WEB_APPS_API_TOKEN - Value: [Get from Azure Portal → Static Web App → Manage deployment token]
- Name:
To use the fluentjot.design domain:
- In Azure Portal → Static Web App → Custom domains
- Click "Add custom domain"
- Enter
fluentjot.design - Follow DNS configuration instructions
- Add CNAME record pointing to your Azure Static Web App URL
Example DNS configuration:
Type: CNAME
Name: @
Value: [your-static-web-app].azurestaticapps.net
The workflow automatically handles:
- ✅ Node.js 18 setup
- ✅ Python 3.9 for data processing
- ✅ Dependency caching
- ✅ Artifact caching for faster builds
- ✅ Code quality checks (linting, type checking)
- ✅ Build optimization
The deployment triggers automatically when:
- Pushing to
mainbranch - Creating/updating pull requests
- Changes are made to:
web/**(React application)scripts/**(Python processing scripts)metadata/**(Icon/emoji data)config/**(Configuration files)
-
Setup Environment
- Node.js 18 with npm caching
- Python 3.9 with pip caching
- Artifact caching for faster builds
-
Data Processing
- Generate Excalidraw files from SVG sources
- Cache artifacts to avoid regeneration
- Process 5,980 icons + 1,595 emojis
-
Quality Assurance
- ESLint code quality checks
- TypeScript type checking
- Build optimization
-
Deployment
- Deploy to Azure Static Web Apps
- Preview deployments for pull requests
- Automatic cleanup of closed PRs
The workflow includes several optimizations:
- Caching: Dependencies and generated files cached between builds
- Conditional Generation: Only regenerate Excalidraw files when source data changes
- Memory Optimization: Increased Node.js memory limit for large builds
- Source Maps: Disabled in production for smaller bundle size
The workflow provides detailed logging:
- File counts and sizes
- Build performance metrics
- Deployment status and URLs
- Error details for troubleshooting
- Create Application Insights resource in Azure
- Copy the Instrumentation Key
- Add to Static Web App configuration:
- Azure Portal → Static Web App → Configuration
- Add application setting:
- Name:
APPLICATIONINSIGHTS_CONNECTION_STRING - Value: Your connection string
- Name:
The app includes staticwebapp.config.json with:
- Security headers (CSP, HSTS, etc.)
- Caching rules for static assets
- Routing configuration for SPA
- Mime type configurations
Azure Static Web Apps automatically provides:
- ✅ Free SSL certificates
- ✅ Global CDN distribution
- ✅ DDoS protection
- ✅ Custom domain support
Build Failures:
- Check that all required directories exist in the repository
- Verify Python dependencies are correctly installed
- Check Node.js memory limits for large builds
Deployment Failures:
- Verify
AZURE_STATIC_WEB_APPS_API_TOKENsecret is correct - Check app and output locations match workflow configuration
- Review Azure Static Web Apps logs in Azure Portal
Performance Issues:
- Monitor bundle size (currently ~711KB, needs optimization)
- Check Azure Static Web Apps quotas and limits
- Review Application Insights performance data
Azure Static Web Apps (Free Tier):
- ✅ 100GB bandwidth per month
- ✅ 0.5GB storage
- ✅ Custom domains with SSL
- ✅ Global CDN distribution
- ✅ Staging environments
Expected Usage:
- Bundle size: ~711KB (needs optimization)
- Static assets: ~2GB (Excalidraw files)
- Monthly bandwidth: <10GB (estimated)
The Free tier should be sufficient for most usage patterns. Monitor usage in Azure Portal and upgrade to Standard tier if needed.