Skip to content

Implementation Reference

This document provides a detailed implementation reference for Forge contributors, with specific file paths and line numbers for all major components.

Note: Line numbers are approximate and may shift as the codebase evolves. Use them as starting points for exploration.


1. Runtime System

1.1 Entry Point & Event Loop

File: crates/forge-runtime/src/main.rs

FunctionLinesPurpose
main()413-422Entry point, creates tokio runtime
sync_main()424-962Main execution with event loop

sync_main() Execution Flow:

StageLinesPurpose
Tracing init425-432Logging setup (FORGE_LOG env)
Argument parsing434-450--app-dir, --dev flags
Bundle detection452-494macOS .app structure detection
Manifest loading496-500Parse manifest.app.toml
Crash reporting508-528Initialize crash reporting
Capabilities530-536Create from manifest permissions
Capability adapters538-539Create adapters for extensions
IPC channels541-549to_deno_tx, to_renderer_tx, window_cmd channels
JsRuntime creation551-564Deno runtime with all extensions
App info566-576Build app metadata
Extension states578-614Tiered initialization
Module loading616-632Load src/main.ts
Event loop643-960tao event loop

Event Loop Handlers (809-961):

EventLinesPurpose
MainEventsCleared817-855JS runtime polling
UserEvent::ToRenderer857-863IPC to renderer
WindowEvent::CloseRequested869-882Window close
WindowEvent::Focused885-900Focus/blur events
WindowEvent::Resized902-924Resize events
WindowEvent::Moved926-948Move events
WindowCmd953-956WindowManager delegation

1.2 Module Loader

File: crates/forge-runtime/src/main.rs

ComponentLinesPurpose
ForgeModuleLoader struct187-196Custom ES module loader
resolve()199-215Resolves runtime:*ext:runtime_*/init.js
load()217-300Loads and transpiles TS/JS modules

Module Resolution Pattern:

runtime:fs → ext:runtime_fs/init.js

1.3 HMR Server

File: crates/forge-runtime/src/main.rs

FunctionLinesPurpose
run_hmr_server()304-411Dev mode WebSocket server
  • Listens on ws://127.0.0.1:35729
  • Watches web/ directory
  • Broadcasts css: or reload: messages

1.4 Asset Provider & Helpers

File: crates/forge-runtime/src/main.rs

ComponentLinesPurpose
ForgeAssetProvider76-96Provides assets to WindowManager
ForgeChannelChecker99-109Channel permission enforcement
preload_js()63-66Returns transpiled preload script
warm_up_window_helpers()116-182Validates window setup

2. Capabilities & Permissions

File: crates/forge-runtime/src/capabilities.rs

2.1 Permission Structures

StructLinesPurpose
Permissions11-19Root permissions from manifest
FsPermissions21-25Read/write path globs
NetPermissions27-33Allow/deny hosts, listen ports
UiPermissions35-43Windows, menus, dialogs, tray, channels
SysPermissions45-51Clipboard, notify, power, env
EnvPermissions54-60Environment variable patterns
ProcessPermissions62-71Binary allowlist, max processes
WasmPermissions74-82WASM load/preopen, max instances

2.2 Capabilities Struct

MethodLinesPurpose
from_permissions()125-186Creates capabilities from manifest
compile_patterns()188-211Compiles filesystem glob patterns
compile_host_patterns()213-236Compiles hostname patterns
compile_simple_patterns()238-259Compiles env/process patterns

2.3 Permission Check Methods

MethodLinesPurpose
check_fs_read()261-284Filesystem read permission
check_fs_write()286-309Filesystem write permission
check_net()311-344Network access (deny precedence)
check_net_listen()346-369Network listening on ports
check_ui_windows()371-383Window creation permission
check_ui_menus()385-397Menu permission
check_ui_dialogs()399-411Dialog permission
check_ui_tray()413-417Tray permission
check_sys_clipboard()419-431Clipboard permission
check_sys_notify()433-445Notification permission
check_sys_power()447-453Power management permission
check_env_read()455-478Environment variable read
check_env_write()480-500Environment variable write
check_process_spawn()502-525Process spawning permission
check_process_env()527-549Process env inheritance
check_channel()551-591IPC channel permission
check_wasm_load()603-627WASM loading permission
check_wasm_preopen()629-651WASM preopen permission

2.4 Capability Adapters

AdapterLinesPurpose
CapabilityAdapters struct665-674Container for all adapters
FsCapabilityAdapter676-699ext_fs checker
NetCapabilityAdapter701-722ext_net checker
SysCapabilityAdapter724-771ext_sys checker
WindowCapabilityAdapter773-813ext_window checker
IpcCapabilityAdapter815-836ext_ipc checker
ProcessCapabilityAdapter838-861ext_process checker
WasmCapabilityAdapter863-886ext_wasm checker
create_capability_adapters()888-900Factory function

3. Extension Registry

File: crates/forge-runtime/src/ext_registry.rs

3.1 Core Types

TypeLinesPurpose
ExtensionTier enum26-36Initialization complexity levels
ExtensionDescriptor38-51Extension metadata + factory
IpcChannels53-59Channel containers for IPC
WindowChannels61-68Channel containers for window ops
ExtensionInitContext70-93Context for initialization
ExtensionRegistry113-116Central registry

3.2 Tier System

Tier 0 (ExtensionOnly): No state required

  • database, debugger, devtools, display, lock, log, monitor, os_compat, path, protocol, shortcuts, signals, updater, webview

Tier 1 (SimpleState): No dependencies

  • timers, trace, weld, bundler, etcher

Tier 2 (CapabilityBased): Needs capability adapters

  • fs (required), net, sys, crypto, storage

Tier 3 (ComplexContext): Needs channels/app_info

  • ipc (required), window (required), process, wasm, app (required), shell

3.3 Registry Methods

MethodLinesPurpose
ExtensionRegistry::new()119-124Creates registry with all descriptors
all()127-130Returns all descriptors
by_tier()132-135Filters by tier
required()138-141Returns required extensions
count()143-146Returns count
build_extensions()148-160Builds Extension vector for JsRuntime
init_all_states()162-189Initializes states in tier order
create_all_descriptors()202-428Defines all 28 extensions

3.4 State Initialization Dispatchers

FunctionLinesPurpose
init_simple_state()434-460Routes Tier 1 initialization
init_capability_state()462-500Routes Tier 2 initialization
init_complex_state()502-566Routes Tier 3 initialization
init_ipc_manually()572-583Manual IPC initialization
init_window_manually()585-597Manual window initialization

4. CLI System

File: crates/forge_cli/src/main.rs

4.1 Entry Point

FunctionLinesPurpose
main()1024-1095CLI dispatcher
usage()11-45Help text
find_forge_host()54-96Locates forge-runtime binary

4.2 Commands

CommandFunctionLinesPurpose
devcmd_dev()98-132Development mode
buildcmd_build()572-701Production build
bundlecmd_bundle()719-752Platform packaging
signcmd_sign()754-814Code signing
iconcmd_icon()992-1022Icon management

4.3 Build Pipeline

FunctionLinesPurpose
detect_framework()142-179React/Vue/Svelte/Minimal detection
bundle_with_esbuild()202-329esbuild via Deno
transform_vue_files()331-424Vue SFC compilation
transform_svelte_files()426-545Svelte compilation

4.4 Icon Commands

FunctionLinesPurpose
cmd_icon()992-1022Icon subcommand dispatcher
cmd_icon_create()833-866Creates placeholder icon
cmd_icon_validate()868-990Validates icon requirements

5. Bundler System

5.1 Bundler Module

File: crates/forge_cli/src/bundler/mod.rs

FunctionLinesPurpose
build_embedded_binary()55-91Builds with FORGE_EMBED_DIR
bundle()111-139Platform dispatcher
parse_manifest()141-144Convenience wrapper

5.2 Manifest Configuration

File: crates/forge_cli/src/bundler/manifest.rs

StructLinesPurpose
AppManifest12-22Full manifest with bundle config
AppConfig25-30App name, identifier, version
BundleConfig41-54Platform bundle settings
WindowsBundleConfig56-74MSIX settings, signing
MacosBundleConfig76-96DMG/PKG settings, notarization
LinuxBundleConfig98-114AppImage settings

5.3 macOS Bundler

File: crates/forge_cli/src/bundler/macos.rs

ComponentLinesPurpose
MacosBundler struct28-49macOS bundling orchestrator
bundle()52-107Main pipeline
create_app_bundle()110-150Creates .app structure

5.4 Windows Bundler

File: crates/forge_cli/src/bundler/windows.rs

ComponentLinesPurpose
WindowsBundler struct24-45Windows bundling orchestrator
bundle()48-67Main pipeline
bundle_portable()76-160Standalone exe creation

5.5 Linux Bundler

File: crates/forge_cli/src/bundler/linux.rs

ComponentLinesPurpose
LinuxBundler struct18-39Linux bundling orchestrator
bundle()42-64Main pipeline
create_appdir()67-146AppDir per freedesktop.org

5.6 Code Signing

File: crates/forge_cli/src/bundler/codesign.rs

ComponentLinesPurpose
SigningConfig15-30Configuration struct
sign()72-91Unified dispatcher
sign_macos_bundle()98-141macOS signing
sign_single_macos()144-150Single target signing

5.7 Icon Processing

File: crates/forge_cli/src/bundler/icons.rs

ComponentLinesPurpose
MIN_ICON_SIZEconst512px minimum
RECOMMENDED_ICON_SIZEconst1024px recommended
IconValidation31-44Validation result
IconProcessor46-49Icon processing utility
MsixIconSet52-98Windows icon set

6. Forge-Weld Binding System

6.1 ExtensionBuilder

File: crates/forge-weld/src/build/extension.rs

ComponentLinesPurpose
ExtensionBuilder struct91-101Builder for extensions
new()109-120Create builder
host()126-137Shorthand for host modules
ops()146-153Register op names
use_inventory_types()175-178Enable linkme merging
generate_sdk_types()162-165Enable .d.ts generation
generate_sdk_module()168-171Enable .ts SDK
dts_generator()187-193Custom DTS generator
build()262-421Main build process
export_types()493-514Add exports to declarations

build() Process:

  1. Get OUT_DIR and CARGO_MANIFEST_DIR (263-269)
  2. Merge inventory types if enabled (271-290)
  3. Transpile TypeScript if ts_path set (292-307)
  4. Generate Rust extension.rs (309-312)
  5. Generate .d.ts if SDK path requested (314-339)
  6. Generate .ts SDK module if requested (341-372)
  7. Save module metadata for documentation (374-410)

6.2 TypeScript Transpilation

File: crates/forge-weld/src/build/transpile.rs

FunctionLinesPurpose
transpile_ts()43-64Transpiles TS string to JS
transpile_file()78-91Transpiles TS file

6.3 Type System

File: crates/forge-weld/src/ir/types.rs

ComponentLinesPurpose
WeldPrimitive enum11-33Rust → TS primitive mapping
to_typescript()36-52TS type string generation
WeldType enum85-174Comprehensive type system

WeldType Variants:

  • Primitive(WeldPrimitive) → number/bigint/string/boolean
  • Option(Box<WeldType>)T | null
  • Vec(Box<WeldType>)T[]
  • Result { ok, err }Promise<T>
  • HashMap { key, value }Record<K, V>
  • Tuple(Vec<WeldType>)[T, U, V]
  • Struct(String) → Interface reference
  • Enum(String) → Enum type reference
  • Plus: JsonValue, OpState, Box, Arc, Rc, RefCell, Mutex, RwLock, Reference, Pointer, Never

6.4 Symbol Metadata

File: crates/forge-weld/src/ir/symbol.rs

ComponentLinesPurpose
ParamAttr enum12-26#[string], #[serde], etc.
OpParam struct60-73Parameter metadata
to_typescript_param()120-123Generates TS param
OpSymbol struct128-145Op metadata

6.5 Symbol Registry (Linkme)

File: crates/forge-weld/src/ir/inventory.rs

ComponentLinesPurpose
WELD_OPS10Distributed slice for ops
WELD_STRUCTS14Distributed slice for structs
WELD_ENUMS18Distributed slice for enums
SymbolRegistry36-102Registry struct
from_inventory()50-56Loads from linkme slices
collect_ops()21-23Iterates WELD_OPS
register_op!() macro106-112Op registration
register_struct!() macro116-124Struct registration
register_enum!() macro128-135Enum registration

6.6 Module Metadata

File: crates/forge-weld/src/ir/module.rs

ComponentLinesPurpose
WeldModule struct11-38Module metadata
host()60-64Factory for host modules
op_names()127-129Returns op names

7. Code Generators

7.1 Extension Generator

File: crates/forge-weld/src/codegen/extension.rs

MethodLinesPurpose
ExtensionGenerator struct9-11Generator wrapper
generate()30-53Generates deno_core::extension!()
generate_with_state()56-81With state init function
generate_with_deps()84-114With dependencies
generate_with_esm_files()117-149Multiple ESM files

7.2 TypeScript Generator

File: crates/forge-weld/src/codegen/typescript.rs

MethodLinesPurpose
TypeScriptGenerator struct8-10Generator wrapper
generate()19-54Full TS module generation
generate_interface()62-108Interface from WeldStruct
generate_enum()111-167Enum generation
generate_export_function()170+Function wrappers

7.3 DTS Generator

File: crates/forge-weld/src/codegen/dts.rs

MethodLinesPurpose
DtsGenerator struct9-11Generator wrapper
generate()20-65Declaration module
generate_interface()68-115Interface declarations
generate_function_declaration()160+Function signatures

8. Proc Macros

8.1 #[weld_op] Macro

File: crates/forge-weld-macro/src/weld_op.rs

ComponentLinesPurpose
weld_op entry149-241Main macro implementation
extract_params()44-76Extracts parameters
to_camel_case()87-103Snake to camelCase
op_name_to_ts()106-118Converts op_* to camelCase
extract_doc_comments()124-147Extracts /// comments

Macro Expansion Process:

  1. Parse ItemFn (150-152)
  2. Clone and strip weld_op attribute (154-157)
  3. Parse attributes (async, ts_name) (159)
  4. Determine async from signature/attribute (165)
  5. Generate TS name via op_name_to_ts() (168)
  6. Extract doc comments (171)
  7. Extract parameters (skip OpState) (174)
  8. Extract return type (177-184)
  9. Generate metadata function name (187)
  10. Generate expanded code (220-237)
  11. Register via register_op!() (237)

8.2 #[weld_struct] / #[weld_enum]

File: crates/forge-weld-macro/src/weld_struct.rs

ComponentLinesPurpose
to_camel_case()56-62Snake to camelCase
weld_struct_impl()80-171Struct metadata generation
weld_enum_impl()173-248Enum metadata generation

8.3 Type Parser

File: crates/forge-weld-macro/src/type_parser.rs

FunctionLinesPurpose
rust_type_to_weld_type()27-121Main conversion
parse_path_type()124-181Path type parsing

Supported Types:

  • Primitives (185-204): u8-u64, i8-i64, f32, f64, bool, String, char, ()
  • Containers (210-239): Option, Vec, Result
  • Maps (241-267): HashMap, BTreeMap
  • Sets (269-275): HashSet, BTreeSet
  • Wrappers (277-299): Box, Arc, Rc, RefCell, Mutex, RwLock

9. Extension Implementation Pattern

9.1 Example: ext_fs

Files:

  • crates/ext_fs/src/lib.rs - Op definitions
  • crates/ext_fs/build.rs - Extension builder config
  • crates/ext_fs/ts/init.ts - TypeScript shim

Error System (lib.rs):

ComponentLinesPurpose
FsErrorCode enum20-44Error code enum
FsError types46-88Error types with #[deno_error::JsError]
Error constructors90-172Helpers: io(), permission_denied()

State Management:

ComponentLinesPurpose
FileEvent struct179-184File change event
WatchEntry187-189Watcher with receiver
FsWatchState192-196Active watchers by ID

9.2 Example: ext_window

File: crates/ext_window/src/lib.rs

FunctionLinesPurpose
op_window_create652-700Creates new window
op_window_close703-727Closes window
op_window_minimize730-746Minimizes window

WindowManager (src/manager.rs):

ComponentLinesPurpose
WindowManager<U> struct50-83Core manager
new()90-119Initialization
menu_id_map()122-124Menu tracking
pending_ctx_menu()127-129Context menu state
is_empty()132-134Check all windows closed

9.3 Example: ext_ipc

File: crates/ext_ipc/src/lib.rs

ComponentLinesPurpose
IpcEvent struct82-90Message container
ToRendererCmd enum92-100Outbound commands
IpcState107-110Channel state
IpcCapabilityChecker trait117-142Permission checking
op_ipc_send174-210Send to renderer
op_ipc_recv213-258Receive from renderer
init_ipc_state()272-282State registration
init_ipc_capabilities()284-292Capability registration

10. IPC Communication Flow

10.1 Channel Setup

File: crates/forge-runtime/src/main.rs

Lines 541-549: Channel creation
- to_deno_tx/rx: IpcEvent channel (256 capacity)
- to_renderer_tx/rx: ToRendererCmd channel (256 capacity)
- window_cmd_tx/rx: WindowCmd channel (256 capacity)

10.2 Renderer → Deno Flow

1. Renderer: window.host.send(channel, payload)
Location: sdk/preload.ts:141-146
2. WebView IPC → native bridge
3. IpcEvent created, sent to to_deno_tx
Location: crates/forge-runtime/src/main.rs:719
4. op_ipc_recv() awaits on receiver
Location: crates/ext_ipc/src/lib.rs:213-258
5. App code: for await (const event of windowEvents())

10.3 Deno → Renderer Flow

1. App: sendToWindow(windowId, channel, payload)
Location: sdk/runtime.ipc.ts:64-70
2. op_ipc_send() sends ToRendererCmd::Send
Location: crates/ext_ipc/src/lib.rs:174-210
3. Main.rs forwards to event loop
Location: crates/forge-runtime/src/main.rs:661-668
4. Event handler calls window_manager.send_to_renderer()
Location: crates/forge-runtime/src/main.rs:857-864
5. WebView evaluates: window.__host_dispatch({channel, payload})
6. Preload dispatches to listeners
Location: sdk/preload.ts:95-105

11. SDK Structure

11.1 Generated Files

Location: sdk/

FileSourcePurpose
runtime.fs.tsext_fsFilesystem ops
runtime.window.tsext_windowWindow management
runtime.ipc.tsext_ipcIPC communication
runtime.net.tsext_netNetworking
runtime.sys.tsext_sysSystem info
runtime.*.tsext_*30 total modules

11.2 Preload System

File: sdk/preload.ts (191 lines)

ComponentLinesPurpose
IIFE wrapper88-190Main bridge implementation
__host_dispatch95-105Native → JS dispatch
globalThis.host108-147Public bridge API
__console__ listener152-177Console forwarding
HMR client179-189Dev mode hot reload

Public API:

  • window.host.on(channel, cb) - Register listener
  • window.host.off(channel, cb) - Unregister listener
  • window.host.emit(channel, payload) - Local emit + send to Deno
  • window.host.send(channel, payload) - Send to Deno only

12. Quick Reference

Where to Look

TaskLocation
Add a new opcrates/ext_*/src/lib.rs - use #[weld_op]
Add new extensionCreate crates/ext_<name>/, follow ext_fs pattern
Modify window behaviorcrates/ext_window/src/manager.rs
Change IPC handlingcrates/ext_ipc/src/lib.rs
Modify CLI commandscrates/forge_cli/src/main.rs
Change permissionscrates/forge-runtime/src/capabilities.rs
Modify module loadingcrates/forge-runtime/src/main.rs:187-300
Add bundler formatcrates/forge_cli/src/bundler/{platform}.rs
Change type generationcrates/forge-weld/src/codegen/*.rs
Modify proc macroscrates/forge-weld-macro/src/*.rs

Data Flow Diagram

┌─────────────────────────────────────────────────────────────┐
│ forge dev my-app │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ forge_cli/src/main.rs:98 - cmd_dev() │
│ - Locates forge-runtime binary │
│ - Launches with --app-dir and --dev flags │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ forge-runtime/src/main.rs:424 - sync_main() │
│ - Parse manifest.app.toml │
│ - Create Capabilities from permissions │
│ - Create IPC channels │
│ - Build Deno JsRuntime with 28 extensions │
│ - Load src/main.ts │
│ - Start tao event loop │
└─────────────────────────────────────────────────────────────┘
┌───────────────┴───────────────┐
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ Deno JsRuntime │ │ tao/wry Event Loop │
│ - Executes TS/JS │◄───►│ - Window management │
│ - runtime:* modules │ │ - WebView rendering │
│ - IPC send/receive │ │ - System events │
└─────────────────────────┘ └─────────────────────────┘
│ │
▼ ▼
┌─────────────────────────┐ ┌─────────────────────────┐
│ App Code (main.ts) │ │ WebView (index.html) │
│ import "runtime:*" │◄───►│ window.host.send() │
│ createWindow() │ IPC │ window.host.on() │
│ sendToWindow() │ │ preload.ts bridge │
└─────────────────────────┘ └─────────────────────────┘