Export WordPress sites as static HTML or WordPress Playground blueprint bundles
Altolith Deploy enables you to export WordPress sites to static HTML files or create WordPress Playground blueprints, all stored locally on your server's filesystem.
- Convert dynamic WordPress to static HTML
- Export to local filesystem
- Complete site archiving with all assets
- Cache-optimized static pages
- Create Playground blueprint bundles
- Blueprint-based site export (98% storage reduction)
- SQLite database support
- No cloud hosting required
- Static HTML - Complete static website export
- Blueprint Bundle - WordPress Playground blueprint format
- Archive - ZIP files for easy transfer
- WordPress 6.4+
- PHP 7.4+ (PHP 8.1+ recommended)
- Writable
wp-content/altolith-exportsdirectory
-
Install the Plugin
cd wp-content/plugins git clone https://github.com/aristath/altolith-deploy.git -
Install Dependencies
cd altolith-deploy composer install npm install npm run build -
Activate the Plugin
- Go to WordPress Admin β Plugins
- Activate "Altolith Deploy"
-
Configure Export Settings
- Go to Settings β Altolith Export
- Configure export options as needed
- Navigate to Altolith Export in the WordPress admin
- Click Create New Export
- Select export type (Static HTML or Blueprint)
- Configure export options
- Click Start Export
Exports are stored in wp-content/altolith-exports/ directory. Each export is contained in its own subdirectory with:
- Static HTML files
- Assets (images, CSS, JS)
- Database exports (if applicable)
- Blueprint files (for Playground exports)
Exports can be downloaded as ZIP archives directly from the WordPress admin interface.
This plugin is designed to work universally across all WordPress environments, including WordPress Playground (browser-based WASM environment).
The plugin uses a universal implementation approach - no environment detection, no conditional code paths. All features work identically in traditional hosting and WordPress Playground.
- Universal Temp Directory: Uses
wp-content/uploads/altolith-tempinstead of system temp directory - Universal Path Validation: Works without
realpath()in WASM environments - Configurable Post Limits: Prevents timeouts on large sites (default: 10,000 posts)
- Browser-Based Generation: Static site generation runs in browser to avoid PHP timeouts
- WordPress.org API: Browser-based asset detection using CORS proxy
- Memory Protection: IndexedDB caching prevents browser memory exhaustion
- Temporary Storage: Files in
wp-content/uploads/altolith-tempare cleaned up after 1 hour - Post Limits: Default limit of 10,000 posts/pages for URL discovery
- WordPress.org API: Detection happens browser-side using CORS proxy or direct API calls
The following utilities ensure Playground compatibility:
- TempDirectoryManager (
includes/Utilities/TempDirectoryManager.php) - Universal temp file handling - PathValidator (
includes/Utilities/PathValidator.php) - WASM-compatible path validation - FileManager (
includes/Utilities/FileManager.php) - File operations with persistence tracking - IndexedDB Cache (
assets/src/utils/staticSiteCache.js) - Browser-side caching for static site generation
# Development build
npm run build:dev
# Production build
npm run build
# Watch mode
npm start
# Run tests
npm run test:js
composer test
# Linting
npm run lint:js
composer lintaltolith-deploy/
βββ assets/
β βββ src/ # Source JavaScript/React files
β β βββ export/ # Export workflow (step-based executor system)
β β βββ providers/# Provider implementations
β β βββ components/# Shared React components
β β βββ hooks/ # Custom React hooks
β β βββ utils/ # Utility functions
β βββ build/ # Compiled assets
βββ includes/
β βββ REST/ # REST API controllers
β βββ Services/ # Core services
β βββ Utilities/ # Helper utilities
βββ tests/ # PHP and JavaScript tests
βββ webpack.config.js # Build configuration
The plugin provides REST API endpoints (namespace: altolith/deploy):
GET /wp-json/altolith/deploy/settings- Get plugin settingsPOST /wp-json/altolith/deploy/settings- Update settings
POST /wp-json/altolith/deploy/export- Start export workflowGET /wp-json/altolith/deploy/export/status- Get export statusPOST /wp-json/altolith/deploy/export/steps/{stepId}- Execute workflow stepPOST /wp-json/altolith/deploy/export/cancel- Cancel running exportPOST /wp-json/altolith/deploy/export/createArchive- Create WordPress archivePOST /wp-json/altolith/deploy/export/generateBlueprintBundle- Generate blueprint bundle
GET/POST/DELETE /wp-json/altolith/deploy/providers/{providerId}/config- Manage provider configPOST /wp-json/altolith/deploy/providers/{providerId}/test- Test provider connection
POST /wp-json/altolith/deploy/url-discovery/discover- Discover site URLsGET /wp-json/altolith/deploy/url-discovery/posts- Get posts for URL discoveryGET /wp-json/altolith/deploy/url-discovery/terms- Get terms for URL discoveryGET /wp-json/altolith/deploy/url-discovery/authors- Get authors for URL discovery
GET /wp-json/altolith/deploy/assets/manifest- Get assets manifest
POST /wp-json/altolith/deploy/local-storage/upload- Upload file to local storageGET /wp-json/altolith/deploy/local-storage/download- Download file from local storageDELETE /wp-json/altolith/deploy/local-storage/delete- Delete file from local storageGET /wp-json/altolith/deploy/local-storage/list- List files in local storage
Note: The export workflow uses a step-based executor system with dependency resolution. Steps register themselves via WordPress hooks and declare their data dependencies. All workflow state is stored client-side in IndexedDB, not on the server.
composer testnpm run test:js
# With coverage
npm run test:js:coverage
# Watch mode
npm run test:js:watchEnsure the export directory has proper permissions:
chmod 755 wp-content/altolith-exportsFor large sites, increase PHP memory limit in wp-config.php:
define( 'WP_MEMORY_LIMIT', '512M' );Increase PHP max execution time in php.ini or .htaccess:
max_execution_time = 300Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the GPL-2.0+ License - see the LICENSE file for details.
Built with:
For issues and questions: