---
epic: 12
story: 12.2
title: "Scripting Layer (Rhai or mlua)"
status: draft
---

## Epic 12 — Plugin & Extension System
**Goal:** Let power users extend CalcPad.

### Story 12.2: Scripting Layer (Rhai or mlua)

As a power user without Rust experience,
I want to write lightweight scripts to add custom functions to CalcPad,
So that I can extend functionality without compiling native code.

**Acceptance Criteria:**

**Given** a user creates a script file in the `.calcpad-plugins/` directory
**When** CalcPad starts or reloads plugins
**Then** all `.rhai` (or `.lua`) files in the directory are loaded and executed
**And** functions registered by the scripts become available in expressions

**Given** a script uses the API `calcpad.add_function("double", |x| x * 2)`
**When** a user types `double(21)` in a sheet
**Then** the answer column displays `42`

**Given** a script attempts to access the filesystem, network, or system commands
**When** the script is executed
**Then** the sandboxed runtime blocks the operation
**And** an error is reported without crashing the application

**Given** a script contains a syntax error or runtime error
**When** CalcPad attempts to load it
**Then** an error message identifies the problematic script file and line number
**And** all other valid plugins continue to load and function normally

**Given** a script registers a function with the same name as a built-in
**When** the user evaluates an expression using that name
**Then** the built-in takes precedence (or a configurable priority is respected)
**And** a warning is logged about the naming conflict
