FSCSS (Figured Shorthand CSS) usually shows up next to npm, a browser IDE, or a CDN runtime. If your stack is Python-first, you still shouldn’t have to maintain a separate Node app just to turn .fscss into CSS.
The fscss package on PyPI is a thin Python layer around the official compiler. It vendors xfscss (currently 1.2.6) and runs it with Node. Same language as the IDE and npm install fscss — not a second, partial implementation.
- Repo: github.com/Omonire/fscss-py
- Hub guide: hub.devtem.org/python-compiler
- Language docs: fscss.devtem.org
What you get
| Surface | Use |
|---|---|
compile_file / compile_string / compile_dir
|
Build scripts & tools |
CLI fscss in.fscss out.css
|
Local / CI |
--watch |
Simple recompile loop |
init_flask / init_django
|
Static assets on app start |
Requirements: Python 3.7+ (tested 3.8–3.12) and Node.js 20+ on PATH. Node is not bundled.
.fscss → Python API / CLI → node (vendored xfscss) → .css
Install
pip install fscss
node --version # v20+
Minimal example
style.fscss
$accent: #8f6bff;
@define card(sel:.card){`
@use(sel) {
px: 16px;
py: 14px;
rounded: 12px;
stack: 12px;
}
`}
body {
bg: #0b0a13;
color: $accent!;
ff: sans-serif;
}
@card(.panel)
Python
import fscss
fscss.compile_file("style.fscss", "style.css")
CLI
fscss style.fscss style.css
fscss style.fscss --watch
Shorthands like px, rounded, and stack need FSCSS 1.2.5+ in the engine (this package vendors 1.2.6).
API snapshot
import fscss
# In-memory
css = fscss.compile_string("$c: red;\nbody{ color: $c!; }")
# Whole tree → sibling .css files
for src, out in fscss.compile_dir("static"):
print(f"{src} -> {out}")
| Function | Notes |
|---|---|
compile_file(in, out) |
Returns compiler stdout/stderr (warnings included). Raises RuntimeError on hard failure. |
compile_string(source) |
Returns CSS when no output_path (warnings not included). |
compile_dir(dir) |
Every .fscss → matching .css
|
watch_dir(dir) |
Daemon thread, poll interval |
Flask & Django
Flask — compile static folder; watch when debug is on:
from flask import Flask
import fscss
app = Flask(__name__)
fscss.init_flask(app)
Django — e.g. from AppConfig.ready():
import fscss
fscss.init_django()
# or: fscss.init_django("path/to/static")
Ship the compiled .css in production if you want zero Node on the server; use the helper in dev for convenience.
When to use this vs other FSCSS tools
| Tool | Fit |
|---|---|
| This package | Python apps, pipelines, Flask/Django static |
npm fscss |
Node/CI already in the repo |
| Browser IDE | Learning, multi-file, xfcmds, libck, libon, modules |
runtime.min.js / esm.min.js
|
Prototypes in the browser |
One language, several front doors — production output is still plain CSS.
Caveats (short)
- One Node process per compile — fine for builds, not a substitute for a long-lived daemon.
-
Warnings often still exit 0; check return text from
compile_file. -
$variablesare order-sensitive; declare them before rules. - Engine bugs → Figsh/xfscss; wrapper bugs → fscss-py issues.
Try it
pip install fscss
fscss --version
Compile a real .fscss file and compare with the IDE or npx fscss if you have Node tooling already.
Links
- PyPI: https://pypi.org/project/fscss/
- GitHub: https://github.com/Omonire/fscss-py
- Hub: https://hub.devtem.org/python-compiler
- FSCSS docs: https://fscss.devtem.org
- Modules: https://github.com/fscss-ttr
Early package (0.1.x) — reports with minimal input/output and node --version help a lot.
Top comments (0)