diff --git a/crates/openfang-api/static/i18n/en.json b/crates/openfang-api/static/i18n/en.json
new file mode 100644
index 0000000000..79c3bf4d26
--- /dev/null
+++ b/crates/openfang-api/static/i18n/en.json
@@ -0,0 +1,608 @@
+{
+ "app.name": "OpenFang",
+ "app.version": "v",
+
+ "nav.chat": "Chat",
+ "nav.monitor": "Monitor",
+ "nav.overview": "Overview",
+ "nav.analytics": "Analytics",
+ "nav.logs": "Logs",
+ "nav.agents": "Agents",
+ "nav.sessions": "Sessions",
+ "nav.approvals": "Approvals",
+ "nav.comms": "Comms",
+ "nav.automation": "Automation",
+ "nav.workflows": "Workflows",
+ "nav.scheduler": "Scheduler",
+ "nav.extensions": "Extensions",
+ "nav.channels": "Channels",
+ "nav.skills": "Skills",
+ "nav.hands": "Hands",
+ "nav.system": "System",
+ "nav.runtime": "Runtime",
+ "nav.settings": "Settings",
+
+ "auth.sign_in": "Sign In",
+ "auth.enter_credentials": "Enter your dashboard credentials.",
+ "auth.username": "Username",
+ "auth.password": "Password",
+ "auth.api_key_required": "API Key Required",
+ "auth.api_key_desc": "This instance requires an API key. Enter the key from your config.toml.",
+ "auth.api_key_hint": "Add api_key = \"your-key\" at the top of ~/.openfang/config.toml (not under any [section]).",
+ "auth.enter_api_key": "Enter API key...",
+ "auth.unlock_dashboard": "Unlock Dashboard",
+ "auth.login_failed": "Login failed",
+
+ "status.agents_running": "agent(s) running",
+ "status.connecting": "Connecting...",
+ "status.reconnecting": "Reconnecting...",
+ "status.disconnected": "disconnected",
+ "status.ws": "WS",
+ "status.http": "HTTP",
+ "status.ready": "Ready",
+ "status.loading": "Loading...",
+ "status.loading_workflows": "Loading workflows...",
+ "status.loading_channels": "Loading channels...",
+ "status.loading_skills": "Loading skills...",
+ "status.loading_jobs": "Loading scheduled jobs...",
+ "status.loading_triggers": "Loading triggers...",
+ "status.loading_history": "Loading run history...",
+ "status.loading_hands": "Loading hands...",
+ "status.loading_active_hands": "Loading active hands...",
+ "status.loading_mcp": "Loading MCP servers...",
+ "status.loading_files": "Loading files...",
+ "status.loading_skills_details": "Loading skills details...",
+ "status.no_channels_match": "No channels match your search",
+
+ "actions.logout": "Logout",
+ "actions.new_agent": "New Agent",
+ "actions.browse_skills": "Browse Skills",
+ "actions.add_channel": "Add Channel",
+ "actions.create_workflow": "Create Workflow",
+ "actions.settings": "Settings",
+ "actions.create_agent": "Create Agent",
+ "actions.configure_provider": "Configure Provider",
+ "actions.cancel": "Cancel",
+ "actions.confirm": "Confirm",
+ "actions.save": "Save",
+ "actions.delete": "Delete",
+ "actions.edit": "Edit",
+ "actions.clone": "Clone",
+ "actions.stop": "Stop",
+ "actions.run": "Run",
+ "actions.enable": "Enable",
+ "actions.disable": "Disable",
+ "actions.view_all": "View All",
+ "actions.retry": "Retry",
+ "actions.refresh": "Refresh",
+ "actions.approve": "Approve",
+ "actions.reject": "Reject",
+ "actions.update": "Update",
+ "actions.test_connection": "Test Connection",
+ "actions.remove": "Remove",
+ "actions.save_test": "Save & Test",
+ "actions.export_toml": "Export TOML",
+ "actions.save_workflow": "Save Workflow",
+ "actions.auto_layout": "Auto Layout",
+ "actions.clear": "Clear",
+ "actions.zoom_out": "Zoom out",
+ "actions.zoom_in": "Zoom in",
+ "actions.fit": "Fit",
+ "actions.duplicate": "Duplicate",
+ "actions.copy_clipboard": "Copy to Clipboard",
+ "actions.copied": "Copied!",
+ "actions.copy": "Copy",
+ "actions.hide_code": "Hide Code",
+ "actions.view_code": "View Code",
+ "actions.install": "Install",
+ "actions.installing": "Installing...",
+ "actions.installed": "Installed",
+ "actions.load_more": "Load More",
+ "actions.back_to_browse": "Back to browse",
+ "actions.activate": "Activate",
+ "actions.create_schedule": "Create Schedule",
+ "actions.submit": "Submit",
+ "actions.close": "Close",
+ "actions.next": "Next",
+ "actions.back": "Back",
+ "actions.spawn_agent": "Spawn Agent",
+ "actions.spawning": "Spawning...",
+ "actions.create_job": "Create Job",
+ "actions.spawn_wizard": "Wizard",
+ "actions.raw_toml": "Raw TOML",
+ "actions.setup_wizard": "Setup Wizard",
+ "actions.configure_manually": "Configure Manually",
+ "actions.dismiss": "Dismiss",
+ "actions.create_workflow_btn": "Create Workflow",
+ "actions.execute": "Execute",
+ "actions.executing": "Executing...",
+ "actions.generated_toml": "Generated TOML",
+ "actions.running": "Running...",
+
+ "footer.shortcuts": "Ctrl+K agents | Ctrl+N new",
+
+ "theme.light": "Light",
+ "theme.system": "System",
+ "theme.dark": "Dark",
+
+ "errors.connection_error": "Connection Error",
+ "errors.daemon_unreachable": "Cannot reach daemon — is openfang running?",
+ "errors.not_authorized": "Not authorized — check your API key",
+ "errors.permission_denied": "Permission denied",
+ "errors.resource_not_found": "Resource not found",
+ "errors.rate_limited": "Rate limited — slow down and try again",
+ "errors.request_too_large": "Request too large",
+ "errors.server_error": "Server error — check daemon logs",
+ "errors.daemon_unavailable": "Daemon unavailable — is it running?",
+ "errors.unexpected": "Unexpected error",
+ "errors.reconnected": "Reconnected",
+ "errors.connection_lost": "Connection lost, reconnecting...",
+ "errors.switched_http": "Connection lost — switched to HTTP mode",
+ "errors.connection_lost": "Connection lost, reconnecting...",
+ "errors.switched_http": "Connection lost — switched to HTTP mode",
+ "errors.reconnected": "Reconnected",
+
+ "toasts.approval_waiting": "An agent is waiting for approval. Open Approvals to review.",
+ "toasts.agent_created": "Agent Created",
+ "toasts.agent_stopped": "Agent Stopped",
+ "toasts.tool_used": "Tool Used",
+ "toasts.tool_completed": "Tool Completed",
+ "toasts.message_in": "Message In",
+ "toasts.response_sent": "Response Sent",
+ "toasts.session_reset": "Session Reset",
+ "toasts.compacted": "Compacted",
+ "toasts.model_changed": "Model Changed",
+ "toasts.login_attempt": "Login Attempt",
+ "toasts.login_ok": "Login OK",
+ "toasts.login_failed": "Login Failed",
+ "toasts.denied": "Denied",
+ "toasts.rate_limited": "Rate Limited",
+ "toasts.workflow_run": "Workflow Run",
+ "toasts.trigger_fired": "Trigger Fired",
+ "toasts.skill_installed": "Skill Installed",
+ "toasts.mcp_connected": "MCP Connected",
+ "toasts.session_deleted": "Session deleted",
+
+ "overview.welcome": "Welcome to OpenFang",
+ "overview.getting_started": "Getting Started",
+ "overview.setup_wizard": "Setup Wizard",
+ "overview.steps_completed": "of 5 steps completed",
+ "overview.agents_running": "Agents Running",
+ "overview.tokens_used": "Tokens Used",
+ "overview.total_cost": "Total Cost",
+ "overview.uptime": "Uptime",
+ "overview.channels": "Channels",
+ "overview.skills": "Skills",
+ "overview.mcp_servers": "MCP Servers",
+ "overview.tool_calls": "Tool Calls",
+ "overview.providers": "Providers",
+ "overview.recent_activity": "Recent Activity",
+ "overview.no_recent_activity": "No Recent Activity",
+ "overview.chat_with_agent": "Chat with an Agent",
+ "overview.system_health": "System Health",
+ "overview.healthy": "Healthy",
+ "overview.unreachable": "Unreachable",
+ "overview.security_systems": "Security Systems",
+ "overview.llm_providers": "LLM Providers",
+ "overview.defense_active": "9 defense-in-depth systems active",
+ "overview.quick_actions": "Quick Actions",
+
+ "setup.configure_provider": "Configure an LLM provider",
+ "setup.create_first_agent": "Create your first agent",
+ "setup.send_first_message": "Send your first message",
+ "setup.connect_channel": "Connect a messaging channel",
+ "setup.browse_install_skill": "Browse or install a skill",
+
+ "tooltips.cooling_down": "cooling down (rate limited)",
+ "tooltips.circuit_open": "circuit breaker open",
+ "tooltips.ready": "ready",
+ "tooltips.not_configured": "not configured",
+
+ "chat.placeholder": "Message OpenFang... (/ for commands)",
+ "chat.ready": "Ready",
+ "chat.generating": "Generating...",
+ "chat.queued": "queued",
+ "chat.sessions": "Sessions",
+ "chat.new_session": "+ New",
+ "chat.no_sessions": "No sessions",
+ "chat.search_messages": "Search messages...",
+ "chat.select_agent": "Select an agent to start chatting",
+ "chat.recording": "Recording... release to send",
+ "chat.drop_files": "Drop files here",
+ "chat.attach_file": "Attach file",
+ "chat.stop_generating": "Stop generating",
+ "chat.switch_model": "Switch model",
+ "chat.search_models": "Search models...",
+ "chat.no_models_found": "No models found",
+ "chat.available_models": "Available models — pick one or keep typing",
+ "chat.switching": "Switching...",
+ "chat.model_switched": "Switched to",
+ "chat.model_switch_failed": "Model switch failed",
+ "chat.using_http_mode": "Using HTTP mode (no streaming)",
+ "chat.session_name_prompt": "Session name (optional):",
+ "chat.session_created": "Session created",
+ "chat.session_create_failed": "Failed to create session",
+ "chat.stop_agent_title": "Stop Agent",
+ "chat.stop_agent_confirm": "Stop agent",
+ "chat.agent_stopped": "Agent stopped",
+ "chat.stop_agent_failed": "Failed to stop agent",
+ "chat.welcome_message": "**Welcome to OpenFang Chat!**\n\n- Type `/` to see available commands\n- `/help` shows all commands\n- `/think on` enables extended reasoning\n- `/context` shows context window usage\n- `/verbose off` hides tool details\n- `Ctrl+Shift+F` toggles focus mode\n- Drag & drop files to attach them\n- `Ctrl+/` opens the command palette",
+
+ "chat.slash.help": "Show available commands",
+ "chat.slash.agents": "Switch to Agents page",
+ "chat.slash.new": "New session (clear history)",
+ "chat.slash.compact": "Compact session context",
+ "chat.slash.model": "Show or switch model (/model [name])",
+ "chat.slash.stop": "Cancel current agent run",
+ "chat.slash.usage": "Show token usage",
+ "chat.slash.think": "Toggle reasoning (/think [on|off|stream])",
+ "chat.slash.context": "Show context window usage",
+ "chat.slash.verbose": "Toggle tool details (/verbose [off|on|full])",
+ "chat.slash.queue": "Check if agent is processing",
+ "chat.slash.status": "Show system status",
+ "chat.slash.clear": "Clear chat",
+ "chat.slash.exit": "Disconnect from agent",
+ "chat.slash.budget": "Show budget limits and costs",
+ "chat.slash.peers": "Show OFP network status",
+ "chat.slash.a2a": "List A2A agents",
+
+ "commands.help": "Show available commands",
+ "commands.agents": "Switch to Agents page",
+ "commands.new": "Reset session",
+ "commands.switch": "Switch agent",
+ "commands.clear": "Clear conversation",
+ "commands.model": "Switch model",
+ "commands.think": "Toggle reasoning mode",
+ "commands.focus": "Toggle focus mode",
+ "commands.theme": "Cycle theme",
+
+ "tips.commands": "Type / for commands",
+ "tips.think": "/think on for reasoning",
+ "tips.focus": "Ctrl+Shift+F for focus mode",
+
+ "agents.info": "Info",
+ "agents.files": "Files",
+ "agents.config": "Config",
+ "agents.chat": "Chat",
+ "agents.clone": "Clone",
+ "agents.clear_history": "Clear History",
+ "agents.change": "Change",
+ "agents.none_fallback": "None — add a fallback chain",
+ "agents.add": "+ Add",
+ "agents.loading_files": "Loading files...",
+ "agents.no_workspace_files": "No workspace files found",
+ "agents.save_config": "Save Config",
+ "agents.tool_filters": "Tool Filters",
+ "agents.allowlist": "Allowlist",
+ "agents.blocklist": "Blocklist",
+ "agents.agent_name": "Agent Name",
+ "agents.emoji": "Emoji",
+ "agents.color": "Color",
+ "agents.archetype": "Archetype",
+ "agents.provider": "Provider",
+ "agents.model": "Model",
+ "agents.system_prompt": "System Prompt",
+ "agents.soul_persona": "Soul / Persona",
+ "agents.tool_profile": "Tool Profile",
+ "agents.minimal_profile": "Minimal — Read-only file access",
+ "agents.coding_profile": "Coding — Files + shell + web fetch",
+ "agents.fullstack_profile": "Full-Stack — Files + shell + web fetch + search",
+ "agents.research_profile": "Research — Web + search + analysis",
+ "agents.admin_profile": "Admin — Full system access (dangerous)",
+ "agents.agent_created": "Agent Created",
+ "agents.agent_stopped": "Agent Stopped",
+ "agents.agent_deleted": "Agent Deleted",
+
+ "presets.professional": "Professional",
+ "presets.professional_desc": "Precise, business-oriented assistant focused on efficiency and clarity. Prioritizes actionable insights and structured communication.",
+ "presets.professional_soul": "Communicate in a clear, professional tone. Be direct and structured. Use formal language and data-driven reasoning. Prioritize accuracy over personality.",
+ "presets.friendly": "Friendly",
+ "presets.friendly_desc": "Warm and approachable assistant that builds rapport and uses conversational language. Great for brainstorming and exploration.",
+ "presets.friendly_soul": "Be warm, approachable, and conversational. Use casual language and show genuine interest in the user. Add personality to your responses while staying helpful.",
+ "presets.technical": "Technical",
+ "presets.technical_desc": "Expert developer companion optimized for code, architecture, and technical problem-solving. Precise terminology, deep dives, benchmarks.",
+ "presets.technical_soul": "Focus on technical accuracy and depth. Use precise terminology. Show your work and reasoning. Prefer code examples and structured explanations.",
+ "presets.creative": "Creative",
+ "presets.creative_desc": "Imaginative collaborator for content creation, design thinking, and unconventional solutions. Embraces ambiguity and explores possibilities.",
+ "presets.creative_soul": "Be imaginative and expressive. Use vivid language, analogies, and unexpected connections. Encourage creative thinking and explore multiple perspectives.",
+ "presets.concise": "Concise",
+ "presets.concise_desc": "Minimal and direct assistant that respects your time. Cuts through noise to deliver focused, actionable responses.",
+ "presets.concise_soul": "Be extremely brief and to the point. No filler, no pleasantries. Answer in the fewest words possible while remaining accurate and complete.",
+ "presets.mentor": "Mentor",
+ "presets.mentor_desc": "Patient educator that explains concepts thoroughly, provides context, and guides learning. Socratic method when appropriate.",
+ "presets.mentor_soul": "Be patient and encouraging like a great teacher. Break down complex topics step by step. Ask guiding questions. Celebrate progress and build confidence.",
+
+ "agents.profile.minimal": "Minimal",
+ "agents.profile.minimal_desc": "Read-only file access",
+ "agents.profile.coding": "Coding",
+ "agents.profile.coding_desc": "Files + shell + web fetch",
+ "agents.profile.research": "Research",
+ "agents.profile.research_desc": "Web search + file read/write",
+ "agents.profile.messaging": "Messaging",
+ "agents.profile.messaging_desc": "Agents + memory access",
+ "agents.profile.automation": "Automation",
+ "agents.profile.automation_desc": "All tools except custom",
+ "agents.profile.balanced": "Balanced",
+ "agents.profile.balanced_desc": "General-purpose tool set",
+ "agents.profile.precise": "Precise",
+ "agents.profile.precise_desc": "Focused tool set for accuracy",
+ "agents.profile.creative": "Creative",
+ "agents.profile.creative_desc": "Full tools with creative emphasis",
+ "agents.profile.full": "Full",
+ "agents.profile.full_desc": "All 35+ tools",
+
+ "wizard.general_assistant": "General Assistant",
+ "wizard.general_assistant_desc": "You are a versatile AI assistant that helps users with a wide range of tasks. You are knowledgeable, helpful, and able to adapt to the user's needs.",
+ "wizard.code_helper": "Code Helper",
+ "wizard.code_helper_desc": "You are an expert programming assistant specialized in software development. You help write, debug, and refactor code across multiple languages.",
+ "wizard.researcher": "Research Assistant",
+ "wizard.researcher_desc": "You are a research assistant that helps users find, analyze, and synthesize information from various sources.",
+ "wizard.writer": "Writer",
+ "wizard.writer_desc": "You are a skilled writer that helps with content creation, editing, and creative writing projects.",
+ "wizard.data_analyst": "Data Analyst",
+ "wizard.data_analyst_desc": "You are a data analyst that helps explore, analyze, and visualize data to extract insights.",
+ "wizard.devops": "DevOps Engineer",
+ "wizard.devops_desc": "You are a DevOps engineer that helps with infrastructure, deployment, CI/CD, and system administration.",
+ "wizard.support": "Customer Support",
+ "wizard.support_desc": "You are a customer support representative that helps resolve inquiries with patience and professionalism.",
+ "wizard.tutor": "Tutor",
+ "wizard.tutor_desc": "You are an educational tutor that explains concepts clearly and adapts teaching to the student's level.",
+ "wizard.api_designer": "API Designer",
+ "wizard.api_designer_desc": "You are an API designer that helps create well-structured, intuitive APIs following best practices.",
+ "wizard.meeting_notes": "Meeting Notes",
+ "wizard.meeting_notes_desc": "You are a meeting notes specialist that summarizes discussions, extracts action items, and tracks decisions.",
+
+ "wizard.step_welcome": "Welcome",
+ "wizard.step_provider": "Provider",
+ "wizard.step_agent": "Agent",
+ "wizard.step_try_it": "Try It",
+ "wizard.step_channel": "Channel",
+ "wizard.step_done": "Done",
+
+ "wizard.cat_general": "General",
+ "wizard.cat_development": "Development",
+ "wizard.cat_research": "Research",
+ "wizard.cat_writing": "Writing",
+ "wizard.cat_business": "Business",
+
+ "wizard.channel_telegram": "Telegram",
+ "wizard.channel_telegram_desc": "Connect your agent to a Telegram bot for messaging.",
+ "wizard.channel_telegram_token": "Bot Token",
+ "wizard.channel_telegram_help": "Create a bot via @BotFather on Telegram to get your token.",
+ "wizard.channel_discord": "Discord",
+ "wizard.channel_discord_desc": "Connect your agent to a Discord server via bot token.",
+ "wizard.channel_discord_token": "Bot Token",
+ "wizard.channel_discord_help": "Create a Discord application at discord.com/developers and add a bot.",
+ "wizard.channel_slack": "Slack",
+ "wizard.channel_slack_desc": "Connect your agent to a Slack workspace.",
+ "wizard.channel_slack_token": "Bot Token",
+ "wizard.channel_slack_help": "Create a Slack app at api.slack.com/apps and install it to your workspace.",
+
+ "wizard.profile_minimal": "Minimal",
+ "wizard.profile_minimal_desc": "Read-only file access",
+ "wizard.profile_coding": "Coding",
+ "wizard.profile_coding_desc": "Files + shell + web fetch",
+ "wizard.profile_research": "Research",
+ "wizard.profile_research_desc": "Web search + file read/write",
+ "wizard.profile_balanced": "Balanced",
+ "wizard.profile_balanced_desc": "General-purpose tool set",
+ "wizard.profile_precise": "Precise",
+ "wizard.profile_precise_desc": "Focused tool set for accuracy",
+ "wizard.profile_creative": "Creative",
+ "wizard.profile_creative_desc": "Full tools with creative emphasis",
+ "wizard.profile_full": "Full",
+ "wizard.profile_full_desc": "All 35+ tools",
+
+ "wizard.enter_api_key": "Please enter an API key",
+ "wizard.api_key_saved": "API key saved for",
+ "wizard.failed_save_key": "Failed to save key:",
+ "wizard.connected": "connected",
+ "wizard.connection_failed": "Connection failed",
+ "wizard.test_failed": "Test failed:",
+ "wizard.enter_agent_name": "Please enter a name for your agent",
+ "wizard.agent_created": "Agent created",
+ "wizard.failed_create_agent": "Failed to create agent:",
+ "wizard.enter_token": "Please enter the",
+ "wizard.channel_configured": "configured and activated.",
+ "wizard.failed_configure": "Failed:",
+
+ "wizard.suggestions.general.1": "What can you help me with?",
+ "wizard.suggestions.general.2": "Tell me a fun fact",
+ "wizard.suggestions.general.3": "Summarize the latest AI news",
+ "wizard.suggestions.development.1": "Write a Python hello world",
+ "wizard.suggestions.development.2": "Explain async/await",
+ "wizard.suggestions.development.3": "Review this code snippet",
+ "wizard.suggestions.research.1": "Explain quantum computing simply",
+ "wizard.suggestions.research.2": "Compare React vs Vue",
+ "wizard.suggestions.research.3": "What are the latest trends in AI?",
+ "wizard.suggestions.writing.1": "Help me write a professional email",
+ "wizard.suggestions.writing.2": "Improve this paragraph",
+ "wizard.suggestions.writing.3": "Write a blog intro about AI",
+ "wizard.suggestions.business.1": "Draft a meeting agenda",
+ "wizard.suggestions.business.2": "How do I handle a complaint?",
+ "wizard.suggestions.business.3": "Create a project status update",
+
+ "approvals.title": "Execution Approvals",
+ "approvals.pending": "pending",
+ "approvals.all": "All",
+ "approvals.pending_tab": "Pending",
+ "approvals.approved": "Approved",
+ "approvals.rejected": "Rejected",
+ "approvals.expired": "Expired",
+ "approvals.no_approvals": "No approvals",
+ "approvals.approve": "Approve",
+ "approvals.reject": "Reject",
+
+ "workflows.title": "Workflows",
+ "workflows.visual_builder": "Visual Builder",
+ "workflows.what_are": "What are Workflows?",
+ "workflows.no_workflows": "No workflows yet",
+ "workflows.sequential": "Sequential",
+ "workflows.fan_out": "Fan Out",
+ "workflows.conditional": "Conditional",
+ "workflows.loop": "Loop",
+ "workflows.add_step": "+ Add Step",
+ "workflows.execute": "Execute",
+ "workflows.result": "Result",
+ "workflows.node_palette": "Node Palette",
+ "workflows.drag_nodes": "Drag nodes onto the canvas",
+ "workflows.steps_connections": "steps, connections",
+ "workflows.agent": "Agent",
+ "workflows.prompt_template": "Prompt Template",
+ "workflows.expression": "Expression",
+ "workflows.top_port_true": "Top port = true, bottom port = false",
+ "workflows.max_iterations": "Max Iterations",
+ "workflows.until_stop": "Until (stop condition)",
+ "workflows.fan_out_count": "Fan-out Count",
+ "workflows.wait_all": "Wait for all",
+ "workflows.first_finish": "First to finish",
+ "workflows.majority_vote": "Majority vote",
+ "workflows.connection_selected": "Connection selected",
+ "workflows.delete_connection": "Delete Connection",
+
+ "scheduler.title": "Scheduler",
+ "scheduler.scheduled_jobs": "Scheduled Jobs",
+ "scheduler.event_triggers": "Event Triggers",
+ "scheduler.run_history": "Run History",
+ "scheduler.new_job": "+ New Job",
+ "scheduler.job_name": "Job Name",
+ "scheduler.cron_expression": "Cron Expression",
+ "scheduler.quick_presets": "Quick Presets",
+ "scheduler.target_agent": "Target Agent",
+ "scheduler.any_agent": "Any available agent",
+ "scheduler.message_send": "Message to Send",
+ "scheduler.enabled": "Enabled (will start running immediately)",
+ "scheduler.disabled": "Disabled (create paused)",
+ "scheduler.active": "Active",
+ "scheduler.paused": "Paused",
+ "scheduler.cron_job": "Cron Job",
+ "scheduler.trigger": "Trigger",
+ "scheduler.no_jobs": "No scheduled jobs",
+ "scheduler.no_triggers": "No event triggers",
+ "scheduler.no_history": "No run history yet",
+
+ "channels.title": "Channels",
+ "channels.configured": "configured",
+ "channels.search": "Search channels...",
+ "channels.setup": "Set up",
+ "channels.edit": "Edit",
+ "channels.configure": "Configure",
+ "channels.verify": "Verify",
+ "channels.ready": "Ready",
+ "channels.is_ready": "is ready!",
+ "channels.get_credentials": "How to get credentials",
+ "channels.show_advanced": "Show advanced",
+ "channels.hide_advanced": "Hide advanced",
+ "channels.connecting": "Connecting to WhatsApp Web gateway...",
+ "channels.linked_success": "WhatsApp linked successfully!",
+ "channels.business_api": "Business API",
+
+ "skills.title": "Skills & Ecosystem",
+ "skills.installed": "Installed",
+ "skills.clawhub": "ClawHub",
+ "skills.mcp_servers": "MCP Servers",
+ "skills.quick_start": "Quick Start",
+ "skills.no_installed": "No skills installed",
+ "skills.browse_clawhub": "Browse ClawHub",
+ "skills.search_clawhub": "Search ClawHub skills...",
+ "skills.trending": "Trending",
+ "skills.most_downloaded": "Most Downloaded",
+ "skills.most_starred": "Most Starred",
+ "skills.recently_updated": "Recently Updated",
+ "skills.categories": "CATEGORIES",
+ "skills.already_installed": "Already Installed",
+ "skills.no_skills_found": "No skills found",
+ "skills.security_warnings": "Security Warnings",
+ "skills.security_scan": "Skills are security-scanned before installation",
+ "skills.create": "Create Skill",
+ "skills.created": "Created",
+
+ "skills.cat_coding": "Coding & IDEs",
+ "skills.cat_git": "Git & GitHub",
+ "skills.cat_frontend": "Web & Frontend",
+ "skills.cat_devops": "DevOps & Cloud",
+ "skills.cat_database": "Database",
+ "skills.cat_security": "Security",
+ "skills.cat_ai": "AI & ML",
+ "skills.cat_data": "Data & Analytics",
+ "skills.cat_mobile": "Mobile",
+ "skills.cat_desktop": "Desktop Apps",
+ "skills.cat_api": "API & Integrations",
+ "skills.cat_testing": "Testing",
+ "skills.cat_docs": "Documentation",
+ "skills.cat_productivity": "Productivity",
+ "skills.cat_other": "Other",
+
+ "skills.cat_browser": "Browser & Automation",
+ "skills.cat_search": "Search & Research",
+ "skills.cat_communication": "Communication",
+ "skills.cat_media": "Media & Streaming",
+ "skills.cat_notes": "Notes & PKM",
+ "skills.cat_cli": "CLI Utilities",
+ "skills.cat_marketing": "Marketing & Sales",
+ "skills.cat_finance": "Finance",
+ "skills.cat_smarthome": "Smart Home & IoT",
+
+ "skills.uninstall_skill": "Uninstall Skill",
+ "skills.uninstall_confirm": "Uninstall skill",
+
+ "skills.source_clawhub": "ClawHub",
+ "skills.source_openclaw": "OpenClaw",
+ "skills.source_builtin": "Built-in",
+ "skills.source_local": "Local",
+
+ "hands.title": "Hands — Curated Autonomous Capability Packages",
+ "hands.available": "Available",
+ "hands.active": "Active",
+ "hands.ready": "Ready",
+ "hands.setup_needed": "Setup needed",
+ "hands.requirements": "REQUIREMENTS",
+ "hands.details": "Details",
+ "hands.no_hands": "No hands available",
+
+ "sessions.title": "Sessions",
+ "sessions.memory": "Memory",
+ "sessions.delete_session": "Delete Session",
+ "sessions.delete_confirm": "This will permanently remove the session and its messages.",
+ "sessions.delete_key": "Delete Key",
+ "sessions.delete_key_confirm": "Delete key",
+
+ "logs.title": "Logs",
+ "logs.live": "Live",
+ "logs.audit_trail": "Audit Trail",
+
+ "settings.title": "Settings",
+ "settings.providers": "Providers",
+ "settings.models": "Models",
+ "settings.config": "Config",
+ "settings.tools": "Tools",
+ "settings.migration": "Migration",
+ "settings.security": "Security",
+ "settings.network": "Network",
+ "settings.migration": "Migration",
+ "settings.language": "Language",
+
+ "settings.sec_path_traversal": "Path Traversal Prevention",
+ "settings.sec_path_traversal_desc": "Blocks attempts to access files outside the workspace directory using .. or absolute paths.",
+ "settings.sec_ssrf": "SSRF Protection",
+ "settings.sec_ssrf_desc": "Prevents agents from making requests to internal IP ranges (localhost, cloud metadata, private networks).",
+ "settings.sec_capability": "Capability-Based Access Control",
+ "settings.sec_capability_desc": "Agents can only access explicitly granted capabilities. No implicit access to tools or data.",
+ "settings.sec_taint": "Taint Tracking",
+ "settings.sec_taint_desc": "Tracks untrusted data (user input, file content) through agent reasoning to prevent prompt injection.",
+ "settings.sec_sandbox": "WASM Sandbox",
+ "settings.sec_sandbox_desc": "Executes untrusted code in isolated WebAssembly sandboxes with memory and syscall restrictions.",
+ "settings.sec_audit": "Merkle Audit",
+ "settings.sec_audit_desc": "Maintains a verifiable audit log of all agent actions using Merkle tree cryptography.",
+ "settings.sec_workspace": "Workspace Isolation",
+ "settings.sec_workspace_desc": "Each agent has an isolated workspace directory. No cross-agent file access unless explicitly granted.",
+ "settings.sec_rate_limit": "Rate Limiting",
+ "settings.sec_rate_limit_desc": "Enforces per-agent and global rate limits to prevent resource exhaustion and cost overruns.",
+ "settings.sec_approval": "Execution Approvals",
+ "settings.sec_approval_desc": "Requires human approval for high-risk actions (shell commands, file writes, external requests).",
+
+ "settings.sec_enabled": "Enabled",
+ "settings.sec_disabled": "Disabled",
+ "settings.sec_inherited": "Inherited",
+ "settings.sec_global": "Global"
+}
diff --git a/crates/openfang-api/static/i18n/i18n.js b/crates/openfang-api/static/i18n/i18n.js
new file mode 100644
index 0000000000..5ed1b2b4e8
--- /dev/null
+++ b/crates/openfang-api/static/i18n/i18n.js
@@ -0,0 +1,230 @@
+/**
+ * OpenFang i18n (Internationalization) Module
+ *
+ * Provides runtime language switching for the OpenFang dashboard UI.
+ * Supports English (default) and Russian.
+ *
+ * Usage:
+ * - HTML: Overview
+ * - JS: window.t('nav.overview')
+ * - Auto-applies translations on load based on stored/preferred language
+ */
+
+(function() {
+ 'use strict';
+
+ // Language store
+ let currentLang = 'en';
+ let translations = {};
+ let isInitialized = false;
+
+ /**
+ * Load translations from a JSON file
+ * @param {string} lang - Language code (en, ru)
+ * @returns {Promise