Wall Framing Designer is a web app for laying out a framed wall elevation, adding doors and windows, and having the framing members update automatically. It runs a FastAPI backend with a vanilla JavaScript frontend and stores saved projects in a SQLite database.
- Draws a single wall elevation in 2D
- Places plates, kings, jacks, studs, headers, sills, and cripples automatically
- Lets you drag doors and windows horizontally with snap-to-1/16 inch behavior
- Supports feet/inches or decimal-inch entry and display
- Saves projects and presets in SQLite
- Produces a print-friendly plan with dimensions, legend, cut list, and warnings
- Backend: Python 3.11+, FastAPI, SQLite
- Frontend: HTML, CSS, vanilla JavaScript, HTML5 Canvas
- Build tooling: none required
Before you start, make sure you have:
- Python 3.11 or newer installed
pipavailable- A modern web browser
From the project root:
cd d:\path\to\designer
py -m venv .venv
.venv\Scripts\activate
python -m pip install --upgrade pip
pip install -r backend\requirements.txtFrom the project root:
cd /path/to/designer
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -r backend/requirements.txtStart the backend from the project root:
python backend\run.pyThe backend serves the frontend directly, so there is no separate frontend dev server and no Node install step.
The backend requirements are defined in backend/requirements.txt. The current
required Python packages are:
fastapi>=0.110uvicorn[standard]>=0.29pydantic>=2.6
Install them with:
pip install -r backend\requirements.txt- The app uses SQLite
- The database file is
data/designer.db - The
datafolder is created automatically if it does not exist - The database schema is applied automatically on first startup
- Default framing presets and opening presets are seeded automatically when the preset tables are empty
- There is currently no database username/password or app login system
This means a fresh clone can be started immediately after installing Python dependencies. The DB is created the first time the backend imports the database module during app startup.
To reset all saved projects and reseed defaults:
- Stop the server.
- Delete
data/designer.db. - Start the app again with
python backend\run.py.
The app will recreate the database automatically.
designer/
├── backend/
│ ├── app/
│ │ ├── __init__.py
│ │ ├── db.py
│ │ ├── main.py
│ │ ├── models.py
│ │ ├── routes.py
│ │ └── schema.sql
│ ├── requirements.txt
│ └── run.py
├── data/
├── frontend/
│ ├── index.html
│ ├── plan_preview.html
│ ├── css/
│ └── js/
├── reference/
└── tests/
- Open the app in your browser.
- Choose a framing preset, or enter stud size, spacing, and plate settings manually.
- Enter the wall length and wall height.
- Add an opening by choosing a preset or creating a generic door/window.
- Click an opening to select it.
- Drag it left or right on the canvas, or edit its values in the selected opening controls.
- Review the framing layout, dimensions, cut list, and warnings as they update.
- Save the project when you want to keep the current design.
- Use the print view when you want a dimensioned output sheet.
Measurement fields accept common framing-style formats and normalize them after editing. Examples:
8'8 ft8' 6"8'6"8 ft 6 in8' 6 1/2"8-6102102.5102 1/2"
Internally, the app stores lengths in decimal inches and snaps displayed values to 1/16 inch. You can switch between:
- Feet and inches, for example
8'-6 1/2" - Decimal inches, for example
102.5"
Ctrl+Z: UndoCtrl+Y: RedoDelete: Remove the selected opening
The browser UI talks to these backend endpoints under /api:
GET /api/projectsPOST /api/projectsGET /api/projects/{id}PUT /api/projects/{id}DELETE /api/projects/{id}GET /api/presets/framingPOST /api/presets/framingDELETE /api/presets/framing/{id}GET /api/presets/openingsPOST /api/presets/openingsDELETE /api/presets/openings/{id}
- Confirm the virtual environment is activated
- Confirm dependencies were installed from
backend/requirements.txt - Make sure Python is 3.11+
- Confirm the app can write to the project folder
- Confirm the
datafolder anddata/designer.dbfile can be created - Check whether the DB file was deleted or locked by another process
- Static frontend files are served by FastAPI from the
frontendfolder - SQLite initialization happens on import in
backend/app/db.py
- Overhead plan and multi-wall layout
- DXF, OBJ, or SVG export expansion
- 3D/orbit view
- Sheathing sheet layout
- Per-wall schedules and combined project print output