# Configuration > **Preview ecosystem guide:** Asset Pipeline is not part of the Amber 2.0.0-beta.2 > core web-app release gate. Its package version, API, and platform support may > change independently. Do not add a personal fork as a default dependency. This guide covers Asset Pipeline configuration options, environment setup, and deployment best practices. ## FrontLoader Options ### Basic Configuration ```crystal front_loader = AssetPipeline::FrontLoader.new( js_source_path: Path["src/javascript"], js_output_path: Path["public/javascript"] ) do |import_maps| # Import map configuration end ``` ### Configuration Options | Option | Type | Default | Description | |--------|------|---------|-------------| | `js_source_path` | Path | - | Source directory for JavaScript files | | `js_output_path` | Path | - | Output directory for processed files | | `clear_cache_upon_change` | Bool | `true` | Auto-clear cache when files change | ### Cache Clearing ```crystal # Automatic cache clearing (default) front_loader = AssetPipeline::FrontLoader.new( js_source_path: Path["src/javascript"], js_output_path: Path["public/javascript"] ) # Disable for debugging front_loader = AssetPipeline::FrontLoader.new( js_source_path: Path["src/javascript"], js_output_path: Path["public/javascript"], clear_cache_upon_change: false ) ``` ## Directory Structure ### Recommended Layout ``` my_app/ ├── src/ │ └── javascript/ │ ├── controllers/ │ │ ├── application_controller.js │ │ ├── dropdown_controller.js │ │ └── modal_controller.js │ ├── services/ │ │ └── api_service.js │ └── utils/ │ └── helpers.js ├── public/ │ └── javascript/ │ └── (generated files) └── config/ └── initializers/ └── assets.cr ``` ### Initializer Setup ```crystal # config/initializers/assets.cr require "asset_pipeline" JS_SOURCE_PATH = Path["src/javascript"] JS_OUTPUT_PATH = Path["public/javascript"] FRONT_LOADER = AssetPipeline::FrontLoader.new( js_source_path: JS_SOURCE_PATH, js_output_path: JS_OUTPUT_PATH ) do |import_maps| import_map = AssetPipeline::ImportMap.new("application", Path["/javascript"]) # Stimulus import_map.add_import( "@hotwired/stimulus", "https://cdn.jsdelivr.net/npm/@hotwired/stimulus@3.2.2/+esm", preload: true ) # Controllers Dir.glob("#{JS_SOURCE_PATH}/controllers/*_controller.js").each do |file| name = File.basename(file, ".js").split("_").map(&.capitalize).join import_map.add_import(name, "controllers/#{File.basename(file)}") end import_maps << import_map end ``` ## Environment Configuration ### Development vs Production ```crystal ENVIRONMENT = ENV["AMBER_ENV"]? || "development" FRONT_LOADER = AssetPipeline::FrontLoader.new( js_source_path: Path["src/javascript"], js_output_path: Path["public/javascript"], clear_cache_upon_change: ENVIRONMENT == "development" ) do |import_maps| import_map = AssetPipeline::ImportMap.new("application", Path["/javascript"]) # Always include Stimulus import_map.add_import( "@hotwired/stimulus", "https://cdn.jsdelivr.net/npm/@hotwired/stimulus@3.2.2/+esm", preload: true ) # Environment-specific configuration case ENVIRONMENT when "development" # Development tools import_map.add_import("DebugController", "controllers/debug_controller.js") when "production" # Production analytics import_map.add_import("AnalyticsController", "controllers/analytics_controller.js") end import_maps << import_map end ``` ### Feature Flags ```crystal FEATURES = { "new_checkout" => ENV["FEATURE_NEW_CHECKOUT"]? == "true", "advanced_analytics" => ENV["FEATURE_ANALYTICS"]? == "true" } FRONT_LOADER = AssetPipeline::FrontLoader.new(...) do |import_maps| import_map = AssetPipeline::ImportMap.new("application", Path["/javascript"]) # Base imports import_map.add_import("@hotwired/stimulus", "...", preload: true) # Feature-flagged imports if FEATURES["new_checkout"] import_map.add_import("NewCheckoutController", "controllers/new_checkout_controller.js") import_map.add_import("stripe", "https://js.stripe.com/v3/") else import_map.add_import("LegacyCheckoutController", "controllers/legacy_checkout_controller.js") end if FEATURES["advanced_analytics"] import_map.add_import("chart.js", "https://cdn.jsdelivr.net/npm/chart.js@4.4.0/+esm", preload: true) import_map.add_import("AnalyticsController", "controllers/analytics_controller.js") end import_maps << import_map end ``` ## CDN Configuration ### Using Subresource Integrity (SRI) For production, consider using SRI hashes: ```crystal # Add integrity checks for CDN resources import_map.add_import( "@hotwired/stimulus", "https://cdn.jsdelivr.net/npm/@hotwired/stimulus@3.2.2/+esm" ) # In your layout, add integrity attribute manually if needed #