BOL (Beginning of Life) is a computational research platform that simulates the chemical and physical processes hypothesised to have driven the emergence of life on early Earth, approximately 3.8–4.1 billion years ago. The simulator operates as a self-contained Python application with a web-based dashboard, providing researchers and students with an interactive laboratory for exploring origin-of-life chemistry.
The platform models a three-dimensional hydrothermal environment where simple inorganic molecules (CO2, H2, NH3, H2S) undergo 27 abiotic reaction pathways to produce increasingly complex organic molecules—amino acids, nucleotides, sugars, and lipids. These building blocks spontaneously self-assemble into membrane-bound vesicles (protocells), within which RNA templates replicate with error-prone fidelity, driving Darwinian selection at the molecular level.
Key capabilities include:
The system is designed for portability (pure Python + NumPy), security (PBKDF2 authentication, CSP headers, rate limiting), and scientific transparency (all reactions grounded in published literature).
The origin of life remains one of the deepest unsolved problems in science. The transition from geochemistry to biochemistry required the emergence of three capabilities that define all known life: (1) metabolism—the ability to harvest energy and catalyse chemical reactions; (2) compartmentalisation—membrane boundaries that create distinct chemical environments; and (3) replication—the capacity to copy information with heritable variation.
BOL models all three pillars simultaneously in a unified simulation, allowing researchers to observe whether and how they emerge from simple starting conditions.
The simulator supports four prebiotic scenarios, each representing a major scientific hypothesis. No single hypothesis is privileged; users select the starting conditions and observe the outcomes.
| Hypothesis | Key Proponents | Core Mechanism | Environment |
|---|---|---|---|
| RNA World | Gilbert (1986), Joyce, Szostak | RNA as both information carrier and catalyst (ribozymes) preceded DNA/protein life. Self-replicating RNA molecules drive early evolution. | Shallow ponds with UV exposure; warm temperatures favour ribozyme activity. |
| Iron-Sulfur World | Wächtershäuser (1988) | Metabolism-first: exergonic FeS/pyrite reactions on mineral surfaces drive carbon fixation and organic synthesis before genetic molecules appear. | Deep-sea volcanic vents with abundant iron sulfide and high mineral density. |
| Alkaline Hydrothermal Vent | Russell (1994), Martin | Natural proton gradients (pH 6–11) across iron-sulfide membranes in serpentinite-hosted vents provide free energy for carbon fixation. | Off-axis alkaline vents with steep thermal and pH gradients; moderate mineral content. |
| Warm Little Pond | Damer & Deamer (2015) | Wet–dry cycling in terrestrial hot springs concentrates organics, promoting amphiphilic assembly and polymer synthesis during dehydration. | Shallow surface pools with UV radiation; warm surface temperatures. |
BOL adopts a coarse-grained stochastic particle approach, intermediate between molecular dynamics (which tracks individual atoms) and systems-biology ODE models (which track concentrations). Each molecule is an object with aggregate physicochemical properties—type, mass, charge, hydrophobicity, sequence—moving through a continuous 3D volume. Reactions fire probabilistically based on proximity, thermodynamic feasibility, and local environmental conditions.
This design choice makes the simulation tractable (thousands of molecules in real time) while preserving spatial realism (concentration gradients, compartmentalisation, surface catalysis). Emergent behaviours—self-assembly, autocatalytic cycles, heritable selection—arise from the rules rather than being programmed explicitly.
The application is organised into 11 Python modules plus a web layer. Module dependencies flow downward; no circular imports exist.
| Module | Responsibility | Key Classes / Functions | Dependencies |
|---|---|---|---|
config.py | Configuration management | Config dataclass (~30 parameters) | None |
world.py | 3D environment & spatial hashing | World — hash grid, gradient fields | NumPy |
energy.py | Energy sources & coupling | EnergySystem — 4 energy sources | NumPy, World |
chemistry.py | Prebiotic chemistry engine | ChemistryEngine, Molecule, 27 ReactionRules | NumPy, Config |
assembly.py | Self-assembly engine | AssemblyEngine, Vesicle, Micelle | NumPy, World |
replication.py | RNA replication | ReplicationEngine — copy, mutate, recombine | Config |
simulation.py | Orchestrator / main loop | Simulation — step pipeline | All core modules |
metrics.py | Scoring & data export | Metrics — 24 per-step metrics + complexity score | NumPy |
sweep.py | Batch experimentation | Scenario, single-param, 2D grid sweeps | Simulation, Config |
visualization.py | Desktop 3D rendering | Vispy 0.16.1 GPU-rendered particle scatter | Vispy |
ai.py | Analysis laboratory | 27 analysis functions across 8 modules | All core modules |
web/server.py | Web dashboard & REST API | Flask 3.x with 50 API endpoints | Flask, all core |
Each simulation tick executes a strict 7-phase pipeline. The ordering is critical: feedstock must be injected before chemistry can consume it; assembly must run after chemistry so that new products are available for encapsulation; replication runs last because it operates on assembled structures.
The simulation runs in a background thread while the Flask web server handles HTTP requests on the main thread. Three threading locks protect shared state:
_sim_lock — guards all simulation object access (molecules, vesicles, metrics)_project_lock — guards project JSON file I/O_bug_lock — guards bug tracker JSON file I/OAPI endpoints acquire the simulation lock for read access, ensuring consistent snapshots are returned to the browser. The simulation thread acquires the lock at step boundaries to prevent mid-step reads.
The simulation world is a continuous three-dimensional volume (default 20×20×20 units) representing a cross-section of a hydrothermal vent environment. The vertical axis (Y) maps to depth: Y=0 is the vent floor (hot, alkaline, mineral-rich) and Y=20 is the ocean surface (cold, neutral, mineral-poor).
Efficient neighbour lookups are critical for reaction sampling. BOL uses a uniform spatial hash grid with cell size equal to the reaction radius (default 3.0 units). Each molecule is assigned to a cell based on its position, and neighbour queries return all particles in the same cell plus the 26 surrounding cells (3×3×3 neighbourhood).
The hash grid is rebuilt from scratch at the start of each chemistry step via World.clear()
and World.insert(id, pos). This approach is simpler and more cache-friendly than
incremental updates, given that all molecules move each tick.
Three spatially varying fields are pre-computed on a coarse 10×10×10 grid and queried via trilinear index lookup:
| Field | Distribution | Formula | Physical Basis |
|---|---|---|---|
| Temperature | Linear gradient, top to bottom | T(y) = T_max − (T_max − T_min) × (y / height) |
Hydrothermal vent floor at ~400 K; ocean surface at ~275 K |
| pH | Linear gradient, top to bottom | pH(y) = pH_max − (pH_max − pH_min) × (y / height) |
Alkaline vent fluid (pH 11) mixing with acidic ocean water (pH 6) |
| Mineral density | Concentrated at bottom, zero above 2/3 height | M(y) = max(0, 1.0 − frac_y × 1.5) |
Iron sulfide, pyrite, and clay minerals concentrated near vent chimney |
Horizontal boundaries (X, Z) use periodic wrapping: molecules exiting the right edge reappear on the left. This simulates an effectively infinite ocean floor without edge effects. Vertical boundaries (Y) are also periodic but are coupled with ocean loss at the top to simulate dilution into the open ocean.
The EnergySystem module models four geologically plausible energy sources available
on early Earth. Energy availability is spatially localised: thermal energy is strongest near the
vent, UV penetrates only the top 25% of the water column, and lightning strikes are rare stochastic
events. The total energy available at any position is queried during reaction evaluation to determine
whether endergonic reactions can proceed.
Thermal energy is derived from the temperature field. Higher temperatures near the vent floor provide continuous energy for mineral-surface catalysis.
At a vent temperature of 400 K, thermal energy ≈ 0.67. At ambient ocean temperature (275 K), thermal energy is zero. This models the thermodynamic reality that vent-associated reactions benefit from elevated temperatures.
Redox energy is proportional to local mineral density, modelling the electron transfer capacity of iron-sulfide (FeS) and pyrite (FeS2) surfaces near the vent.
Maximum redox energy of 0.5 occurs at the vent floor; it drops to zero above the mineral-bearing zone.
Ultraviolet radiation follows Beer–Lambert attenuation from the ocean surface. UV provides energy for photochemical reactions (water photolysis, HCN polymerisation) but only penetrates the top fraction of the water column.
Where penetration_depth = world_height × uv_depth_frac (default 25%).
UV energy is zero below 3× the penetration depth. This must be explicitly enabled in the
scenario configuration (uv_radiation: true), as it is not present in deep-sea vent scenarios.
Lightning strikes are modelled as rare stochastic events with spatial and temporal extent:
Lightning provides high-energy input for Miller–Urey type reactions (amino acid synthesis from CH4 + NH3) and HCN synthesis from N2 + CH4. The brief, intense energy bursts model the atmospheric electrical discharges hypothesised by Miller and Urey (1953) as a driver of prebiotic synthesis.
The chemistry engine is the heart of BOL. It implements 27 abiotic reaction rules operating on 26 molecular species, with reaction probabilities governed by thermodynamics, local environment, and catalytic context. The engine uses encounter-based stochastic sampling rather than concentration-based kinetics, preserving spatial resolution.
BOL tracks 26 distinct molecule types, ranging from simple inorganic gases to complex biopolymers. Each type is defined by a template specifying mass, charge, hydrophobicity, and amphiphilicity.
| Type | Mass | Charge | Hydrophobicity | Amphiphilic | Category |
|---|---|---|---|---|---|
| water | 0.3 | 0.0 | 0.0 | — | Solvent |
| CO2 | 0.7 | 0.0 | 0.1 | — | C1 feedstock |
| CO | 0.5 | 0.0 | 0.1 | — | C1 intermediate |
| H2 | 0.03 | 0.0 | 0.0 | — | Reductant |
| NH3 | 0.3 | 0.0 | 0.0 | — | N source |
| HCN | 0.4 | 0.0 | 0.1 | — | N intermediate |
| H2S | 0.5 | 0.0 | 0.1 | — | S source |
| CH4 | 0.3 | 0.0 | 0.3 | — | C1 feedstock |
| N2 | 0.5 | 0.0 | 0.0 | — | Atmospheric |
| phosphate | 1.5 | −2.0 | 0.0 | — | Backbone group |
| iron_sulfide | 2.0 | 0.0 | 0.2 | — | Mineral catalyst |
| formaldehyde | 0.5 | 0.0 | 0.05 | — | C1 intermediate |
| glycolaldehyde | 1.0 | 0.0 | 0.05 | — | C2 sugar |
| pyruvate | 1.4 | −1.0 | 0.1 | — | Metabolic intermediate |
| acetyl_thioester | 1.6 | 0.0 | 0.3 | — | Activated intermediate |
| simple_sugar | 2.8 | 0.0 | 0.0 | — | Carbohydrate |
| ribose | 2.4 | 0.0 | 0.0 | — | Nucleotide backbone |
| amino_acid | 1.8 | 0.0 | 0.3 | — | Protein precursor |
| nucleobase | 1.8 | 0.0 | 0.2 | — | RNA precursor |
| nucleotide | 2.5 | −1.0 | 0.1 | — | RNA monomer |
| fatty_acid | 3.5 | 0.0 | 0.9 | Yes | Membrane amphiphile |
| glycerol | 1.5 | 0.0 | 0.0 | — | Lipid backbone |
| lipid | 4.0 | 0.0 | 0.8 | Yes | Membrane amphiphile |
| peptide | 5.0 | 0.0 | 0.3 | — | Protein polymer |
| rna_strand | 8.0 | −3.0 | 0.1 | — | Information polymer |
Each reaction is defined by a ReactionRule specifying reactants, products,
thermodynamic barrier (ΔG in kJ/mol), base rate, and environmental requirements.
Reactions are grouped into seven categories reflecting the major synthetic pathways of prebiotic chemistry.
| # | Reaction | Equation | ΔG | Rate | Requirements |
|---|---|---|---|---|---|
| 1 | CO2 reduction | CO2 + H2 → CO + H2O | −20 | 0.25 | Mineral surface |
| 2 | CO reduction | CO + H2 → HCHO | −12 | 0.20 | Mineral surface |
| # | Reaction | Equation | ΔG | Rate | Requirements |
|---|---|---|---|---|---|
| 3 | Formose step | 2 HCHO → glycolaldehyde | −8 | 0.20 | — |
| 4 | Sugar synthesis | glycolaldehyde + HCHO → simple sugar | −10 | 0.18 | — |
| 5 | Ribose formation | 2 glycolaldehyde → ribose | −6 | 0.12 | Mineral surface |
| # | Reaction | Equation | ΔG | Rate | Requirements |
|---|---|---|---|---|---|
| 6 | HCN synthesis | NH3 + CO → HCN | −15 | 0.22 | Energy source |
| 7 | Nucleobase from HCN | 2 HCN → nucleobase | −5 | 0.15 | — |
| 8 | Strecker amino acid | HCN + HCHO → amino acid | −18 | 0.20 | — |
| 9 | Amino acid from sugar | NH3 + simple sugar → amino acid | −15 | 0.15 | Energy source |
| # | Reaction | Equation | ΔG | Rate | Requirements |
|---|---|---|---|---|---|
| 10 | Pyruvate synthesis | CO2 + glycolaldehyde → pyruvate | −10 | 0.15 | Mineral surface |
| 11 | Thioester formation | pyruvate + H2S → acetyl thioester | −12 | 0.18 | Mineral surface |
| # | Reaction | Equation | ΔG | Rate | Requirements |
|---|---|---|---|---|---|
| 12 | Nucleotide assembly | nucleobase + ribose → nucleotide | −6 | 0.20 | Mineral surface |
| 13 | Peptide bond | 2 amino acids → peptide | +10 | 0.20 | Energy + Mineral |
| 14 | Peptide elongation | peptide + amino acid → peptide | +8 | 0.25 | Energy + Mineral |
| 15 | RNA polymerisation | 2 nucleotides → RNA strand | +12 | 0.20 | Mineral + Energy |
| 16 | RNA elongation | RNA strand + nucleotide → RNA strand | +10 | 0.25 | Mineral + Energy |
| # | Reaction | Equation | ΔG | Rate | Requirements |
|---|---|---|---|---|---|
| 17 | Fatty acid synthesis | 2 acetyl thioester → fatty acid | −8 | 0.18 | — |
| 18 | Lipid assembly | fatty acid + glycerol → lipid | −5 | 0.22 | — |
| 19 | Glycerol from sugar | simple sugar + H2 → glycerol | −10 | 0.18 | — |
| 20 | Lipid from sugars | 2 simple sugar → lipid | −5 | 0.10 | — |
| # | Reaction | Equation | ΔG | Rate | Requirements |
|---|---|---|---|---|---|
| 21 | UV water photolysis | 2 H2O → 2 H2 | +237 | 0.10 | UV radiation |
| 22 | UV HCN polymerisation | 2 HCN → nucleobase | −5 | 0.25 | UV radiation |
| 23 | UV formaldehyde | CO2 + H2 → HCHO | +5 | 0.20 | UV radiation |
| 24 | Discharge amino acid | CH4 + NH3 → amino acid | −10 | 0.30 | Energy (lightning) |
| 25 | Discharge HCN | N2 + CH4 → 2 HCN | +15 | 0.25 | Energy (lightning) |
The chemistry step follows an encounter-based sampling approach rather than deterministic mass-action kinetics. This preserves spatial locality—only molecules that are physically near each other can react.
max_encounters = min(n_reactive × 5, 5000)._type_partners dictionary to see if any reaction
exists for the pair (m1.type, m2.type).reaction_radius._evaluate_and_fire(rule, [m1, m2]).When a candidate reaction pair is identified, the effective reaction rate is computed by multiplying the base rate with a series of environmental and catalytic modifiers:
Where each factor is computed as follows:
| Factor | Formula | Role |
|---|---|---|
| Temperature | exp(−0.5 × ((T − T_opt) / T_width)²) | Gaussian bell curve centred at optimal temperature (default 350 K, width 80 K) |
| pH | exp(−0.5 × ((pH − pH_opt) / pH_width)²) | Gaussian bell curve centred at optimal pH (default 7.0, width 4.0) |
| Mineral boost | (1 + mineral_density × 2) × (1 + mineral_density × 3) | Surface catalysis by iron-sulfide and clay minerals |
| Ribozyme catalyst | 5.0× (if ribozyme motif detected in nearby RNA) | Catalytic RNA accelerates enclosed reactions |
| Vesicle confinement | 2.5× (if reactants share a vesicle) | Concentration effect inside small compartments; also waives mineral requirement |
| UV boost | Proportional to UV intensity at position | Photochemical activation for UV-requiring reactions |
| Lightning boost | 3.0× (if lightning is active at position) | High-energy electrical discharge for Miller–Urey reactions |
The final rate is hard-capped at 0.95 to prevent deterministic firing. A uniform random number
is drawn; if random() < rate, the reaction fires: reactants are consumed (marked dead)
and products are created at the reaction centre.
Reactions with positive ΔG (endergonic) require energy coupling. The algorithm computes a driving force from the available energy sources and compares it against the thermodynamic difficulty:
If coupling ≤ 0, the reaction is rejected regardless of other factors. The weighted
coefficients reflect the relative thermodynamic potency of each energy source: lightning and UV provide
the most concentrated energy, while thermal gradients provide the weakest per-event drive.
When polymerisation reactions fire, sequence strings are constructed:
GAVLIPFMWSTYQNDEKHRC (20 standard amino acids).AUGC.RNA strands gain catalytic status when their sequence meets two criteria: (1) length ≥ catalytic_threshold
(default 8) and (2) the sequence contains a ribozyme motif from the set
{GUC, GAA, CCA, GCCA, GUCC, GAAC}.
These motifs are loosely inspired by real ribozyme active sites (hammerhead, HDV, hairpin ribozymes).
The AssemblyEngine models the spontaneous organisation of amphiphilic molecules into
membrane-bound compartments. This process follows a lifecycle: free amphiphiles cluster into
micelles, which grow and promote to vesicles (closed bilayer shells),
which then undergo fitness-driven growth and division. Vesicles that lose too many lipids dissolve.
Free-floating amphiphilic molecules (fatty acids and lipids) that are not already part of any structure are clustered using a proximity-based algorithm:
reaction_radius × 3 units.micelle_threshold = 8 lipids), form a new Micelle object.Micelles that accumulate enough amphiphilic molecules are promoted to vesicles—closed bilayer shells that can encapsulate molecules:
vesicle_threshold (default 15) lipids, it is promoted to a Vesicle.Vesicle membranes are selectively permeable, following a three-tier model:
| Category | Molecule Types | Permeation Rate | Behaviour |
|---|---|---|---|
| Freely permeable | water, CO2, CO, H2, NH3, HCN, H2S, CH4, N2, HCHO | 5.0% per step | Small gases pass through bilayer freely |
| Semi-permeable | amino acid, nucleotide, simple sugar, phosphate | 0.8% per step | Slow leakage of polar monomers |
| Impermeable | peptide, RNA strand, lipid, fatty acid | 0% | Large molecules & polymers trapped inside |
This permeability model ensures that polymers and information molecules are retained inside vesicles once synthesised, while small feedstock molecules can enter to fuel internal chemistry.
Each vesicle receives a fitness score based on the functional molecules it contains. This score drives differential growth (fitter vesicles grow faster via osmotic influx and lipid accretion).
| Component | Formula | Maximum Contribution |
|---|---|---|
| RNA strand (non-catalytic) | 0.1 + length × 0.02 | ~0.5 per strand |
| RNA strand (catalytic/ribozyme) | 0.1 + length × 0.02 + 0.3 | ~0.8 per strand |
| Peptide | 0.05 + length × 0.01 | ~0.2 per strand |
| Diversity bonus | +0.15 (if both RNA and peptides present) | 0.15 |
Total fitness is capped at 2.0. Vesicles with catalytic RNA strands enjoy the strongest fitness advantage, reflecting the RNA World hypothesis that ribozymes were the primary drivers of early protocell fitness.
Fitter vesicles grow preferentially through two mechanisms:
Small permeable molecules within a fitness-modulated attraction radius are absorbed into the vesicle. Higher fitness increases the effective absorption radius, modelling the biophysical reality that metabolically active protocells create local concentration gradients.
Free-floating amphiphilic molecules within an attraction zone are recruited to the vesicle membrane:
This creates a positive feedback loop: fitter vesicles attract more lipids, growing larger, which provides more surface area for lipid accretion. This models the osmotic coupling between internal activity and membrane growth observed in synthetic protocell experiments (Szostak lab, 2004–2014).
Vesicles whose membrane lipid count exceeds division_size (default 50) undergo binary fission:
generation = parent.generation + 1 and parent_id = parent.id.This division mechanism produces lineages (multi-generational chains) that can be tracked through the lineage viewer. Combined with differential fitness, this creates a minimal Darwinian selection system: fitter protocells grow faster, divide sooner, and propagate their contents to daughters.
Vesicles that lose membrane lipids below micelle_threshold / 2 (default 4) dissolve:
all contents are released as free molecules and the vesicle is removed from the simulation.
This models the thermodynamic instability of undersized bilayer structures.
The ReplicationEngine models template-directed synthesis of RNA strands—the
process by which information molecules make copies of themselves. Two distinct copying environments
are modelled, reflecting different experimental and theoretical proposals.
Inspired by the Ferris (1996) and Orgel (2004) experiments on montmorillonite-catalysed RNA polymerisation, this mode operates on free-floating RNA strands near mineral-rich surfaces:
len(sequence) free nucleotides must
be within reaction_radius of the template.0.03 × mineral_density / max(1, needed/4)—longer
templates copy more slowly, reflecting the difficulty of long-range template-directed synthesis.RNA templates inside vesicles can replicate using encapsulated nucleotides. This mode is faster because the confined volume concentrates reactants:
vesicle_id,
remaining inside the protocell.Template copying is error-prone, generating heritable variation that drives selection. Four types of errors are modelled, each with probability derived from the base error rate (default 0.02):
| Error Type | Probability | Mechanism |
|---|---|---|
| Point mutation | error_rate per base |
Complement base replaced by random alternative (A, U, G, or C) |
| Insertion | error_rate × min(len/5, 2.0) |
Random base inserted at random position; longer strands more prone |
| Deletion | error_rate × min(len/5, 2.0) |
Random base removed (if length > 2); longer strands more prone |
| Segment duplication | error_rate × 0.5 |
A 2–3 base segment is duplicated in place (models slippage replication errors) |
When two RNA strands coexist inside the same vesicle, there is an 8% chance of single-point crossover during replication:
The crossover point is chosen uniformly at random along the shorter sequence. Recombination allows beneficial motifs from different strands to combine, accelerating the exploration of functional sequence space—analogous to sexual recombination in modern organisms.
The Simulation class in simulation.py coordinates all subsystems.
It initialises the world, populates it with starting molecules according to the scenario
configuration, and runs the step pipeline in a loop.
At each step, new molecules representing vent gases are injected into the bottom 15% of the world, modelling continuous geochemical input from a hydrothermal vent:
| Default Feedstock | Rate (molecules/step) |
|---|---|
| CO2 | 4 |
| H2 | 5 |
| H2S | 2 |
| NH3 | 1 |
Rates are multiplied by the feedstock_rate configuration parameter (default 1.0).
Fractional molecules are handled by probabilistic rounding: for rate 1.5, there is a 50% chance
of spawning 1 or 2 molecules per step.
All molecules undergo temperature-dependent Brownian motion, fully vectorised for performance:
Where noise is drawn from a standard normal distribution. Heavier molecules diffuse
more slowly (inversely proportional to mass). Higher temperatures increase diffusion, naturally
concentrating fast-moving light molecules near the hot vent while heavy polymers settle.
All positions are wrapped periodically after displacement.
Molecules in the top 20% of the world height (above 80% of Y) have a per-step probability of
ocean_loss_frac (default 5%) of being removed from the simulation. This models
dilution of molecules into the open ocean—a sink that balances the feedstock source and
prevents unbounded population growth.
Every 100 steps, dead molecules (consumed by reactions or ocean loss) are purged from the molecule list to free memory and maintain iteration performance. Python’s garbage collector handles the underlying memory reclamation.
The Metrics module records 24 measurements at every simulation step, providing a
comprehensive time-series view of emergent dynamics:
| Category | Metrics | Description |
|---|---|---|
| Population | total_molecules, type_counts | Alive molecule counts by type |
| Diversity | diversity_index | Shannon entropy (bits) of type distribution |
| Assembly | micelle_count, vesicle_count, encapsulated_count, membrane_lipids | Self-assembly state |
| Polymers | rna_strand_count, max_rna_length, avg_rna_length, peptide_count, max_peptide_length, avg_peptide_length | Polymer statistics |
| Catalysis | catalyst_count | Active ribozyme catalysts |
| Energy | energy_budget, lightning_active | Energy availability |
| Chemistry | reactions_this_step | Reaction throughput |
| Replication | replication_fidelity, replication_events | Copying accuracy and count |
| Selection | max_fitness, avg_fitness, max_generation, divisions_observed | Vesicle fitness and lineage |
| Composite | complexity_score | Overall system organisation (0–100) |
The complexity score is a weighted composite metric (0–100) that quantifies how far the simulation has progressed toward life-like organisation. It captures seven dimensions of emergent complexity:
| Component | Weight | Formula | Rationale |
|---|---|---|---|
| Chemical diversity | 15% | min(shannon / 4, 1) × 15 | A diverse chemical repertoire indicates active synthetic pathways |
| Polymer richness | 20% | Blend of RNA count/length (60%) + peptide count/length (40%) | Information polymers are prerequisites for genetic heredity |
| Catalytic activity | 15% | min(catalysts / 3, 1) × 15 | Ribozyme emergence signals the RNA World transition |
| Compartmentalisation | 15% | (min(vesicles/5, 1)×0.5 + min(enclosed/50, 1)×0.5) × 15 | Membrane boundaries enable selection at the protocell level |
| Selection dynamics | 15% | (min(fitness/2, 1)×0.5 + min(generation/5, 1)×0.5) × 15 | Multi-generational lineages with fitness differentials indicate Darwinian selection |
| Replication | 10% | (min(events/10, 1)×0.5 + fidelity×0.5) × 10 | Template copying with reasonable fidelity enables heredity |
| Information content | 10% | min(max_polymer_length / 20, 1) × 10 | Longer sequences carry more potential functional information |
A score of 100 represents optimal simultaneous performance across all seven dimensions—a state rarely achieved, since it requires sustained polymer synthesis, vesicle populations with multi-generational fitness selection, active ribozyme catalysis, and high-fidelity replication all operating concurrently.
Simulation results can be exported in three formats:
The Config dataclass provides approximately 30 parameters with sensible defaults.
All parameters can be overridden by scenario files, project settings, or CLI arguments.
| Category | Parameter | Default | Description |
|---|---|---|---|
| World | world_size | [20, 20, 20] | 3D volume dimensions (units) |
| Environment | temperature_min | 275 K | Ocean surface temperature |
temperature_max | 400 K | Vent floor temperature | |
ph_min | 6.0 | Ocean pH (acidic) | |
ph_max | 11.0 | Vent pH (alkaline) | |
| Energy | thermal_gradient | True | Enable thermal energy |
uv_radiation | False | Enable UV photochemistry | |
lightning | False | Enable stochastic lightning | |
lightning_probability | 0.02 | Strike chance per step | |
| Reactions | reaction_radius | 3.0 | Maximum encounter distance |
base_rate_constant | 0.01 | Global rate multiplier | |
catalyst_multiplier | 100.0 | Ribozyme rate boost | |
| Diffusion | diffusion_scale | 1.0 | Brownian motion intensity |
| Feedstock | feedstock_rate | 1.0 | Vent gas injection multiplier |
feedstock_molecules | {CO2:4, H2:5, ...} | Gas types and counts per step | |
| Loss | ocean_loss_frac | 0.05 | Surface dilution rate |
| Assembly | micelle_threshold | 8 | Minimum lipids for micelle |
vesicle_threshold | 15 | Minimum lipids for vesicle | |
division_size | 50 | Lipid count triggering division | |
| Replication | replication_error_rate | 0.02 | Per-base mutation rate |
min_polymer_length | 5 | Minimum length for copying | |
catalytic_threshold | 8 | Minimum length for ribozyme |
The configuration system uses a layered override architecture:
Each layer only specifies the parameters it needs to change; unspecified parameters inherit from the layer below. This design allows scenarios to define minimal overrides while inheriting robust defaults, and allows CLI arguments to override everything for ad-hoc experimentation.
Temperature: 275–400 K
pH: 6–11 (steep gradient)
Energy: Thermal + Redox
UV: Off | Lightning: Off
Mineral-rich environment with strong gradients.
Temperature: 300–450 K
pH: 5–8 (moderate)
Energy: Thermal + Redox (enhanced)
UV: Off | Lightning: Off
Highest mineral density; metabolism-first focus.
Temperature: 280–330 K
pH: 7–9 (mild)
Energy: Thermal + UV
UV: On | Lightning: Off
Moderate conditions favouring ribozyme stability.
Temperature: 290–350 K
pH: 6–8 (near neutral)
Energy: Thermal + UV + Lightning
UV: On | Lightning: On
Surface environment with all energy sources.
The sweep.py module enables systematic exploration of the parameter space through
three sweep modes:
| Mode | Inputs | Outputs | Purpose |
|---|---|---|---|
| Scenario sweep | All 4 scenarios × N seeds | Bar chart + complexity time-series overlay | Compare hypotheses under identical conditions |
| Single-parameter sweep | One parameter across a value range | 4-panel line plots (complexity, diversity, vesicles, fitness) | Sensitivity analysis of individual parameters |
| 2D grid sweep | Cartesian product of 2 parameters | Heatmap of complexity score | Interaction effects between parameter pairs |
Ten parameters are declared as sweepable: error_rate, reaction_radius,
base_rate, catalyst_multiplier, diffusion_scale,
feedstock_rate, ocean_loss_frac, division_size,
vesicle_threshold, and temperature_max. Each sweep run produces per-run
CSV files and a summary JSON for downstream analysis.
The AI Analysis Laboratory provides 27 deterministic analysis functions organised into 8 scientific modules. Each function operates on the current simulation state (molecules, reactions, vesicles, metrics history) and returns structured JSON results rendered by dedicated JavaScript visualisers.
| Module | # | Functions | Focus Area |
|---|---|---|---|
| Prebiotic Chemistry | 4 | pathway, yield, thermo, mineral | Synthesis routes, reaction yields, thermodynamic coupling, mineral screening |
| Autocatalysis | 3 | raf, cycles, growth | RAF set detection, catalytic cycle enumeration, network trajectory |
| Membrane Dynamics | 3 | cmc, stability, division | Critical micelle concentration, vesicle stability, fission dynamics |
| Replication | 4 | template, error, ribozyme, heredity | Template synthesis, mutation spectrum, ribozyme discovery, lineage tracking |
| Metabolism | 3 | coupling, tca, gradient | Energy coupling pairs, proto-TCA detection, chemiosmotic gradients |
| Selection | 3 | landscape, group, transitions | Fitness landscapes, group selection, major evolutionary transitions |
| Environment | 3 | sweep, compare, cycles | Parameter sensitivity, scenario comparison, periodicity detection |
| Synthesis Report | 4 | full, bottleneck, hypothesis, report | Full pathway analysis, bottleneck identification, hypothesis generation |
Uses breadth-first search backward from 9 target molecules (amino acid, nucleotide, ribose, etc.) through the reaction graph to find all synthesis paths from the food set (11 simple inorganic molecules). Results include the shortest path, intermediate molecules, and which reactions are on the critical path.
Implements the Reflexively Autocatalytic Food-generated set algorithm: starting from the food set, iteratively closes the set by identifying reactions whose products are catalysts for other reactions in the set. A non-empty RAF set indicates self-sustaining autocatalytic chemistry—a key milestone toward metabolism.
Maps the genotype-to-fitness function by binning vesicles by their RNA sequence composition and correlating with fitness scores. Identifies local optima, fitness valleys, and evolutionary trajectories.
Evaluates progress along the key evolutionary transitions framework (Szathmáry & Maynard Smith, 1995): replicating molecules → molecular populations → compartmentalised molecules → RNA-catalysed systems → protocells with heritable variation.
BOL uses a file-based JSON storage strategy with no external database dependencies. This design eliminates database administration, simplifies deployment, and keeps the system fully self-contained.
| Entity | Storage | Key Properties | Access Pattern |
|---|---|---|---|
| Molecule | In-memory | id, type, pos[3], vel[3], mass, charge, hydrophobicity, sequence, vesicle_id, alive | Created/destroyed every step by chemistry |
| Vesicle | In-memory | id, center[3], radius, membrane_ids[], contents[], fitness, generation, parent_id | Created by promotion, removed by dissolution/division |
| Micelle | In-memory | id, center[3], lipid_ids[] | Created by clustering, consumed by promotion |
| Reaction Rule | Constant | name, reactants, products, delta_g, base_rate, ph_opt, temp_opt, needs_mineral | Read-only lookup each chemistry step |
| User Profile | profiles/*.json | username, password_hash, salt, display_name, bio, role | Read on login, write on register/update |
| Project | projects/*.json | id, name, owner, config, runs[] | CRUD via API, locked access |
| Scenario | scenarios/*.json | name, description, initial_molecules, environment, energy_sources | Read-only at simulation start |
| Training Module | training/modules.json | id, category, title, lessons[], quizzes[] | Read-only curriculum |
| Bug Report | bugs/bugs.json | id, title, severity, status, test_config, history[] | CRUD via API, locked access |
The web frontend uses a server-rendered architecture with Jinja2 templates and vanilla JavaScript for interactivity. This approach avoids framework dependencies while delivering a rich, responsive user experience.
| Component | Technology | Responsibility |
|---|---|---|
| Templates | Jinja2 (30+ HTML files) | Server-side rendering with master layout inheritance (base.html) |
| Dashboard JS | app.js (vanilla) | Polling-based live updates, Chart.js integration, simulation controls |
| 3D Viewer | viewer.js (Three.js) | WebGL particle visualisation with camera controls |
| AI Results | ai-results.js | 27 dedicated renderer functions for analysis outputs |
| Styles | styles.css | Splunk-inspired dark theme with CSS custom properties, responsive breakpoints |
| PWA | manifest.json + service-worker.js | Install-to-home-screen, offline caching of static assets |
The design system features a dark background (#0a0a0a) with card surfaces (#1a1a2e) and accent colours—blue (#4cc9f0), pink (#f72585), gold (#fca311)—inspired by Splunk’s enterprise dashboard aesthetic. Mobile responsiveness is achieved through breakpoints at 768px and 480px, with a hamburger menu replacing the top navbar on small screens.
The Flask server exposes approximately 50 REST API endpoints organised into 8 categories:
| Category | Endpoints | Auth Required |
|---|---|---|
| Simulation Control | POST /api/start, /api/stop, /api/pause | No |
| Simulation Data | GET /api/state, /api/history, /api/events, /api/reactions, /api/reaction_rules, /api/lineage, /api/energy, /api/network, /api/particles, /api/molecules | No |
| AI Analysis | POST /api/ai/<module>/<action> | No |
| Scenarios & Sweep | GET /api/scenarios, POST /api/sweep | No |
| Authentication | POST /api/profile/register, /login, /logout, /update, /password, GET /api/profile | Varies |
| Projects | GET/POST /api/projects, GET/PUT/DELETE /api/projects/<id>, POST .../run, GET .../download, GET .../report, POST /api/projects/upload | Yes |
| Training | GET /api/training/modules, GET/POST .../progress, GET/POST .../notes/<id>, POST .../quiz/<id> | Yes |
| Bug Tracker | GET/POST /api/bugs, GET/PATCH/DELETE /api/bugs/<id>, POST .../test, POST .../test-all-open | Yes |
The dashboard uses a polling-based approach for real-time updates, chosen for simplicity and compatibility over WebSockets:
| Endpoint | Interval | Data | Consumer |
|---|---|---|---|
GET /api/state | 1 second | KPI cards, molecule counts, complexity, fitness | Dashboard number cards |
GET /api/history | 2 seconds | Time-series arrays for charting | Chart.js line/bar charts |
GET /api/events | 3 seconds | Recent event log entries | Event feed sidebar |
Chart.js instances update in-place using chart.data.datasets[n].data = newData with
smooth animation transitions. This avoids chart recreation overhead and provides a fluid visual
experience.
BOL implements defence-in-depth security aligned with NIST SP 800-53 controls and CISA binding operational directives.
| Control | Implementation | Standard |
|---|---|---|
| Password hashing | PBKDF2-HMAC-SHA256, 260,000 iterations, 32-byte random salt | NIST SP 800-132 |
| Password policy | Minimum 8 characters; must contain uppercase, lowercase, and digit | NIST SP 800-63B |
| Timing-safe comparison | secrets.compare_digest() | Prevents timing side-channel attacks |
| Session management | Flask signed cookies; 8-hour lifetime; HttpOnly, SameSite=Lax, Secure (production) | OWASP Session Management |
| Login rate limiting | 10 attempts per 5-minute window per IP; returns 429 | NIST SP 800-53 AC-7 |
/api/users, user deletion)
require admin privileges configured via the BOL_ADMIN_USERS environment variable.| Header | Value | Purpose |
|---|---|---|
| Strict-Transport-Security | max-age=31536000; includeSubDomains | Force HTTPS for 1 year |
| Content-Security-Policy | script-src 'self' CDN...; frame-ancestors 'none' | Prevent XSS and clickjacking |
| X-Content-Type-Options | nosniff | Prevent MIME type sniffing |
| X-Frame-Options | SAMEORIGIN | Prevent framing by external sites |
| Referrer-Policy | strict-origin-when-cross-origin | Limit referrer information leakage |
| Permissions-Policy | camera=(), microphone=(), geolocation=(), payment=() | Disable unused browser features |
[a-zA-Z0-9_-] allowlist.
Project IDs, lesson IDs, and filenames are sanitised before filesystem access.|safe filter usage.escHtml() and textContent for safe DOM updates.shlex.split() with shell=False for subprocess calls.BOL supports two deployment modes: local development and production deployment on a cloud server.
setup_server.sh creates a bol
user, installs Python 3.12, Nginx, and certbot on Ubuntu 24.04 LTS.deploy_to_server.ps1 rsyncs the project to
/opt/bol and creates a Python virtual environment with all dependencies.finish_setup.sh creates a systemd unit
file, Nginx virtual host configurations, and obtains SSL certificates.fix_nginx_headers.sh applies CSP, HSTS,
and X-Frame-Options headers to the Nginx configuration.| Task | Command |
|---|---|
| Service status | systemctl status bol |
| Restart service | systemctl restart bol |
| View logs | journalctl -u bol -f |
| SSL renewal | certbot renew (auto-configured) |
| Nginx config test | nginx -t |
| Backup | Git for code; periodic copy of profiles/, projects/, bugs/, .secret_key |
| Requirement | Target | Implementation |
|---|---|---|
| Performance | <200ms per step (1,000 molecules) | NumPy vectorised operations, spatial hashing |
| Scalability | Up to 10,000 molecules | O(1) neighbour lookup, adaptive encounter budgets |
| Portability | Windows, Linux, macOS | Pure Python + NumPy; browser-based UI |
| Security | NIST SP 800-53, CISA BOD 18-01 | PBKDF2, CSP, HSTS, rate limiting |
| Availability | 99.5% uptime (production) | systemd auto-restart, Gunicorn multi-worker |
BOL was designed and constructed through a prompt-driven development process: a series of carefully sequenced natural-language design prompts, each specifying a major subsystem to build. The methodology mirrors an iterative engineering workflow where each prompt defines requirements, the implementation is executed, and validation is performed against all four origin-of-life scenarios before advancing to the next prompt.
This approach yielded several advantages:
docs/PROMPTS.md) and
progress log (docs/PROGRESS_LOG.md) provide a complete record of every design
decision, code change, and validation result.The application was constructed through 24 sequential prompts, beginning with project inception and culminating in a fully deployed web platform with PDF documentation, training curriculum, and algorithmic audit. The first 10 prompts were planned at inception; 14 additional prompts were added during development as the scope naturally expanded.
| # | Prompt | Date | Key Deliverables |
|---|---|---|---|
| 001 | Project Inception & Scaffold | 2026-03-09 | Project structure, prompt log, progress log, existing software survey, 10-prompt build plan, Python package scaffold with config, world, simulation, and metrics modules. |
| 002 | Primordial Chemistry Engine | 2026-03-09 | 27 molecule types, 21 reaction rules with pH/temperature Gaussian modifiers, cell-direct neighbour sampling for O(1) encounters, feedstock injection, ocean loss, mineral surface catalysis. |
| 003 | Energy Sources & Thermodynamics | 2026-03-09 | Four energy sources (thermal gradient, redox chemistry, UV Beer–Lambert, stochastic lightning). Multi-source Gibbs free energy coupling. 5 new energy-driven reactions (26 total), including UV photolysis and Miller–Urey synthesis. |
| 004 | Self-Assembly & Protocells | 2026-03-09 | Micelle formation via spatial clustering, vesicle promotion, lipid accretion, membrane permeability model (permeable vs impermeable types), initial encapsulation, vesicle confinement, dissolution. Compartment isolation in chemistry engine. |
| 005 | Polymers & Information Chemistry | 2026-03-09 | Amino acid sequences (20 AA codes), RNA sequences (AUGC), 6 ribozyme motifs, template-directed RNA replication with Watson–Crick pairing and error-prone copying. Mineral-surface concentration effects. First ribozyme catalyst emerged in validation. |
| 006 | Selection & Variation | 2026-03-10 | Vesicle fitness scoring, osmotic growth, division with content inheritance, semi-permeable monomers (Szostak model), confinement catalysis (2.5× rate), RNA recombination, segment duplication mutations. Third-generation vesicles observed. |
| 007 | 3D Visualization | 2026-03-09 | Vispy 0.16.1 GPU renderer with CPK-coloured particle scatter, vent chimney mesh, thermal gradient planes, fitness-coded vesicle shells, HUD overlay, TurntableCamera, keyboard controls. ~460 lines of rendering code. |
| 008–010 | Metrics, Sweeps & Testing | 2026-03-10 | Metrics dashboard with Chart.js, parameter sweep engine, 4 scenario JSON presets, 56 unit tests (all passing), CLI arguments, performance optimisation (cell-direct sampling, dead molecule GC). |
| 011 | Web Dashboard | 2026-03-10 | Full Splunk-themed Flask web application with real-time KPI cards, 4 Chart.js time-series charts, simulation controls, event log, scenario picker, parameter sweep UI. Dark-theme CSS design system (~1,200 lines). |
| 012 | 3D Microscope Viewer | 2026-03-10 | Three.js WebGL sprite-based particle renderer in the browser. Collapsible documentation panels. Real-time particle streaming from simulation API. Legend overlay, help panel, camera controls. |
| 013 | Icons & Branding | 2026-03-10 | Multi-resolution favicons (16–256px) and desktop icon generated with Pillow. DNA helix + vesicle motif. |
| 014 | Existing Software Reference | 2026-03-10 | Showcase page documenting 20 real-world origin-of-life tools in 5 categories with descriptions, capabilities, and BOL comparison points. |
| 015 | Molecule SVGs | 2026-03-10 | 32 accurate ball-and-stick SVG molecule images. Viewer converted from Points to Sprites. Case normalisation, 7 missing types added, SVG artefacts removed. |
| 016 | Navigation, Security & Profiles | 2026-03-10 | Top navigation bar replacing sidebar, landing home page, security architecture (NIST SP 800-53 / CISA BOD 18-01 compliance), user profile system with credential protection, admin section (documentation, builds, user management). |
| 017 | White Paper & Design Documentation | 2026-03-10 | Comprehensive 21-section technical white paper (~135 KB). Cover page with abstract, full table of contents, professional print CSS, DREL Solutions branding. Served as standalone HTML. |
| 018 | AI Laboratory UX Overhaul | 2026-03-11 | Split AI Laboratory into 8 individual pages with dedicated templates. 30 per-action rich visual renderers (tables, meters, cards) in ai-results.js with shared CSS. |
| 019 | Project Management | 2026-03-11–12 | Full CRUD projects with user ownership, molecule grid picker, environment config, synchronous and background run modes. PDF report generation (stdlib). JSON download/import with owner reassignment. CLI --project flag. |
| 020 | Training Curriculum | 2026-03-14 | 8-category origin-of-life training system with 32 interactive modules. TTS reader with chunk-based paragraph splitting, quizzes with grading, personal notes, progress tracking. |
| 021 | Bug Tracker & Quality Assurance | 2026-03-14 | Full lifecycle bug management with CRUD API, 5 severity levels, 6-state workflow (open → verified). Automated test runner (HTTP checks + shell commands). Stats dashboard with filtering. |
| 022 | Mobile PWA & Infrastructure | 2026-03-14 | Progressive Web App with manifest.json and service worker for offline caching. Hamburger menu for mobile navigation. Session persistence via secret key file. .gitignore for dev artefacts. |
| 023 | Algorithm Audit & Test Report | 2026-03-14 | Deep code audit of chemistry, energy, assembly, and replication modules. 4-scenario validation (1000 steps, seed 42). 6 issues identified, 1 code fix (vesicle −1 placeholder), 5 advisory. Formal test report page. |
| 024 | Whitepaper Sidebar TOC & PDF Generation | 2026-03-14 | Fixed left sidebar table of contents with scroll-spy highlighting and collapsible sub-sections. Professional PDF generation via xhtml2pdf with A4 layout, custom stylesheet, and page footers. |
BOL includes a dedicated Build History page (/builds) that provides
a versioned release record of the platform. The build system serves as both documentation and
an auditable record of every iteration.
The build page is rendered as static content in the builds.html template, served
via the /builds route. It is accessible to all authenticated users and provides
a single-page view of the complete development history.
| Attribute | Value |
|---|---|
| Release date | 2026-03-14 |
| Build iterations | 24 (prompts) |
| Tests | 56 — all passing |
| Platform | Python 3.12 |
| Dependencies | 6 third-party packages |
BOL includes a built-in Bug Tracker (/bugs) that provides full
lifecycle bug management without requiring external issue-tracking tools. The tracker was designed
to keep quality assurance tightly coupled with the application itself.
Each bug progresses through a defined state machine with six possible statuses:
open → in_progress → fixed → verified
↓ ↑ ↓
↓ reopened ←———————+
↓
wont_fix
Bugs are stored as JSON in a file-based storage layer (bugs/bugs.json) with
thread-safe access via a threading lock. Each bug record contains:
| Field | Type | Description |
|---|---|---|
| id | Integer | Auto-incrementing unique identifier |
| title | String (max 500) | Bug summary (required) |
| description | Text | Detailed bug description |
| severity | Enum | low, medium, high, critical |
| status | Enum | open, in_progress, fixed, verified, wont_fix, reopened |
| environment | Enum | local, staging, production |
| steps_to_reproduce | Text | Step-by-step reproduction instructions |
| expected_behavior | Text | What should happen |
| actual_behavior | Text | What actually happens |
| fix_description | Text | Description of the fix applied |
| test_command | String | Automated verification command (HTTP or shell) |
| fix_verified | Boolean | Whether the fix has been verified by test |
| tags | Array | Categorisation tags (e.g., “chemistry”, “ui”, “security”) |
| created / updated | ISO 8601 | Timestamps for audit trail |
The bug tracker exposes a full CRUD API with filtering and automated testing:
| Endpoint | Method | Description |
|---|---|---|
/api/bugs | GET | List bugs with optional filters (status, severity, environment, search) |
/api/bugs | POST | Create new bug (authenticated) |
/api/bugs/<id> | GET | Retrieve single bug |
/api/bugs/<id> | PATCH | Partial update (authenticated) |
/api/bugs/<id> | DELETE | Delete bug (authenticated) |
/api/bugs/<id>/test | POST | Run automated test for a single bug |
/api/bugs/test-all-open | POST | Run tests on all open/in-progress/fixed bugs |
The bug tracker includes a built-in automated test runner that can verify fixes without
leaving the application. Each bug can specify a test_command in one of three formats:
GET https://url [expected_status].
Validates that the endpoint returns either the specified status code or any 2xx response.subprocess.run(shell=False)
with a 30-second timeout and output capped at 2,000 characters. Commands are parsed with
shlex.split() to prevent shell injection (NIST SI-10).When a bug in fixed status passes its automated test, the tracker automatically
promotes it to verified. The “Test All” function runs tests on every
open, in-progress, or fixed bug that has a test command defined, returning a summary of
total, passed, and failed counts.
The bug tracker UI provides:
http:// and https:// only, preventing server-side request forgery
via file://, ftp://, or other dangerous schemes.
| Term | Definition |
|---|---|
| Amphiphile | A molecule with both hydrophilic (water-loving) and hydrophobic (water-repelling) regions, enabling self-assembly into membranes. In BOL: fatty_acid and lipid. |
| Arrhenius equation | Temperature dependence of reaction rates: k = A × exp(−Ea/RT). BOL uses Gaussian bell curves as a simplified analog. |
| Beer–Lambert law | Exponential attenuation of light intensity with depth: I = I0 × exp(−depth/penetration). Used for UV energy modelling. |
| Brownian motion | Random molecular movement driven by thermal energy. Modelled as Gaussian noise scaled by temperature and inversely by mass. |
| CMC | Critical Micelle Concentration — the amphiphile threshold above which spontaneous aggregation occurs. BOL uses micelle_threshold. |
| ΔG (Gibbs Free Energy) | Thermodynamic potential for a reaction. Negative ΔG = spontaneous (exergonic). Positive ΔG = requires energy input (endergonic). |
| Endergonic | A reaction requiring energy input (ΔG > 0). Must be coupled to an energy source (thermal, redox, UV, lightning) to proceed. |
| Exergonic | A spontaneous reaction that releases energy (ΔG < 0). Can proceed without external energy coupling. |
| Fischer–Tropsch | Catalytic reaction converting CO + H2 to organic molecules on metal surfaces. BOL reaction #2. |
| Formose reaction | Autocatalytic synthesis of sugars from formaldehyde. BOL reactions #3–5. |
| Miller–Urey | Classic experiment (1953) synthesising amino acids from simple gases via electrical discharge. BOL reaction #24. |
| Protocell | A vesicle encapsulating functional molecules—a minimal precursor to a living cell. |
| RAF Set | Reflexively Autocatalytic Food-generated set — a self-sustaining network of mutually catalysed reactions starting from a food set. |
| Ribozyme | An RNA molecule with catalytic activity. In BOL: RNA strands ≥8 bases containing a recognition motif (GUC, GAA, CCA, GCCA, GUCC, GAAC). |
| Spatial hashing | Grid-based indexing scheme dividing 3D space into cells for O(1) neighbour lookups. |
| Strecker synthesis | Chemical route from HCN + aldehyde to amino acids. BOL reaction #8. |
| Thioester | A reactive sulphur ester (R–CO–S–R′) that stores chemical energy analogous to ATP’s phosphoanhydride bond. |
| Watson–Crick pairing | Complementary base pairing in RNA: A↔U, G↔C. Used by the replication engine for template copying. |
BOL — Beginning of Life Simulator • Technical White Paper • Version 1.0.0 • March 2026
© 2026 DREL Solutions. All rights reserved.