๐งฉ Design-Information-Modeling for Kit-of-Parts ๐
You want to ๐งฉ the next ๐๐๐ข๐ญ๐ซ๐จโช๐ with ๐ค? But ๐๐ข๐ฃ๐ฅ๐ฑ๏ธ๏ธโจ๏ธ๏ธ takes all your โ? Then try to ๐ง the ๐งฌ and let semio ๐๐ฅโ๐จ๐ช๐
Note
Are you a user or new to semio? Then you might want to first check out our docs ๐
Glad to see you!
Let me walk you through ๐ถ
- ๐ Products
- ๐ Specs
- ๐ฆ Repo
- ๐งโ๐ป Development
- โป Ecosystems
- ๐ฆ Bundles
- ๐ Examples
- ๐ฏ Brand
- โ๏ธ License
- ๐Security
- โจ Contributors
- ๐ Stats
๐ Products โ
Do you wonder how semio is interopable? The reason are shared specification, ecosystems and bundles ๐ชข
Work-in-progress artifacts stay bundled with the active ticket workspace so teams can trace temporary data without hunting global temp locations. The engine offers a dev/debug startup mode that waits for a debugger to attach before it runs. The engine can also run as a pure stdio MCP server for tool integrations.
โ sketchpad โ
sketchpad is a simple-to-use, accessible and browser-based user interface for semio๐ฑ๏ธ๏ธ
It is the digital pencil for sketching plans and digital scalpel for building models in semio โ
Sketchpad uses semantic borders to communicate interactive element edges and window boundaries. Windows are separated from the canvas edge and from each other by a single spacing unit, and each window is outlined by a continuous border.
Each window has a consistent set of icon actions (open in new window, maximize/minimize, close) that stays in the same position across window kinds.
Sketchpad uses background levels to visually distinguish the base canvas from windows, panels, and transient UI surfaces.
Sketchpad is a multi-window workspace: each app defines which window kinds it supports and window layouts persist so users can restore their preferred arrangement.
In a multi-window workspace, exactly one window is active and its surface uses the active background color; table views follow the active window surface background.
Hover and selection cues stay consistent across Home, Kit, Design, Type, Quality, Docs, and Feedback so focus follows your pointer and selection across the workspace.
๐ฅ studio โ
A studio is a synchronous collaboriation environment for teams to work together in semio ๐ค
โ cloud โ
Use any file-hosting platform as an asynchronous Common-Data-Environment ๐
๐ค assistant โ
The assistant helps you on every step in the design process with semio โ
VS Code Extension โ
The VS Code extension keeps tickets close to daily work with inline close or reopen actions that act on the selected ticket, commit visibility, and concise hover descriptions for quick scanning.
Automation tooling rejects invalid arguments and non-file paths so MCP-driven workflows surface mistakes immediately.
Ticket creation MUST require a Goal ID and interaction starts ALWAYS request a description, while file lists can be added later when needed.
Ticket interaction and finish actions attach git-derived file lists and line totals scoped to the ticket files so progress and impact are visible from the ticket view.
Code hygiene diagnostics ignore comment markers inside string literals so snippets and URLs stay clean of false comment warnings.
Code hygiene diagnostics flag orphan definitions outside named sections so the file structure stays consistent.
The command browser mirrors the repo command and subcommand hierarchy so discovery follows the same structure as the CLI.
Problem list entries open in dedicated editor tabs so edits are immediately saveable.
Contributor views merge ticket activity and file header credits into a per-person breakdown with line totals, grouped tickets, commits, bundles, and file navigation for quick context.
The built-in Explorer adds a Sections panel that lists the current file structure (including JSON object keys), lets you jump to a section on click, supports F2 rename, and provides inline create-child, rename, delete, and drag-move actions.
The semio-repo: Navigate command (semio.navigate) accepts any semiorepo:// URI or plain artifact ID and opens the corresponding resource: files open in the editor, folders and bundles reveal in the Explorer, tickets open their ticket.md, goals open their goal.json, contributors and commits open GitHub in the browser, and sections and definitions jump to the correct line.
The semio-repo: Navigate to... command (semio.navigateTo) opens a quick pick listing all tree nodes from the repo.
Clicking any tree item in the Monorepo view navigates to its resource, including goals which open their goal.json.
A URI handler registered for the semiorepo scheme means clicking semiorepo:// links from terminals, markdown previews, or external applications triggers navigation within VS Code.
A batteries-included Grasshopper plugin for semio โก
๐ฆ semio.3dm โ
A Grasshopper-based integration of Rhino and semio ๐
๐ semio.wasp โ
A Grasshopper-based integration of Wasp and semio ๐
๐ฆ semio.monoceros โ
A Grasshopper-based integration of Monoceros and semio ๐
๐ semio.ladybug โ
A Grasshopper-based integration of Ladybug and semio ๐
๐ Specs โ
๐ฆ Kit โ
A kit is a collection of types, designs, authors, qualities, attributes, and concepts ๐ฆ
A kit is either static (a special .zip file) or dynamic (bound to a runtime) ๐ฆ
A static kit contains a reserved .semio folder that contains a kit.db sqlite file ๐พ
The SQL-schema of kit.db is found in ./sqlite/schema.sql ๐
For Inter-Process-Communication (IPC) the JSON-schema in ./jsonschema/kit.json is used ๐
๐ Design โ
A design is an undirected graph of pieces (nodes) and connections (edges) with organizational layers, groups, stats, attributes, and concepts ๐
A design is proto (a protodesign) when it has no parent.
Children of a parent are _subdesigns.
A flat design has no connections and all pieces are fixed โณ
The pieces are placed hierarchically (breadth-first) for every component ๐ฟ
Additional connections which where not used in the placement can be used to validate the computed planes ๐
๐ Type โ
A type is a reusable component with different models, connectors, attributes, concepts, and authors ๐งฑ
A type is proto (a prototype) when it has no parent.
Children of a parent are _subtypes.
A type can be virtual (intermediate type requiring other virtual types to form a physical type), scalable, and mirrorable with stock quantity, unit, and optional location ๐
๐ Connection โ
A connection is a 3D-Link between two pieces with the translation parameters gap (offset in y-direction), shift (offset in x-direction) and rise (offset in z-direction), and the rotation parameters rotation (rotation around y-axis), turn (rotation around z-axis) and tilt (rotation around x-axis) ๐ชข
The translation is applied first, then the rotation ๐ฅ
The two pieces are called connected and connecting but there is no difference between them ๐
The direction of a connection goes from the lower hierarchy to the higher hierarchy of the pieces โก
A connection can have attributes and diagram positioning with x and y offsets ๐
โญ Piece โ
A piece is an instance of either a type or a design with id, optional description, optional plane, center position, scale, optional mirror plane, hidden and locked states, color, and attributes ๐
A piece is either fixed (with a plane) or linked (with a connection) ๐
A group of connected pieces is called a component ๐ฟ
The hierarchy of a piece is the length of the shortest path to the next fixed piece ๐ฃ
โ Connector โ
A connector is a conceptual connection point with an outwards direction, id, optional description, and t value for diagram ring positioning ๐ค
A connector can be marked as mandatory in which case it is required to be connected to a piece ๐ฏ
A connector can have a connector port and a list of compatible ports for explicit compatibility control ๐จโ๐ฉโ๐งโ๐ฆ
No port means the default port and no compatible ports means the connector is compatible with all other connectors ๐
It is enough for one connector to be compatible with another connector to be compatible with each other โ
A connector can have props that define measurable characteristics and attributes for additional metadata ๐
๐พ Model โ
A model is a tagged url to a resource with an optional description ๐
No tags means the default model ๐
The similarity of models is determined by the jaccard index of their tags ๐
๐ท๏ธ Attribute โ
A attribute is metadata with a unique name, an optional value, an optional unit and an optional definition (url or text) ๐ค
The name iskebab-cased and with .-separated string similar to toml keys ๐
No value is equivalent to the boolean true where the name is the category of the attribute ๐
The unit is a unit identifier ๐ข
mmfor millimeter,cmfor centimeter,dmfor decimeter,mfor meter,kmfor kilometermยฒfor square meter,mยณfor cubic meter,mโดfor quartic meterยฐfor degree,radfor radianNfor newton,kNfor kilonewton,MNfor meganewtonยฐCfor degree Celsius,ยฐFfor degree FahrenheitWfor watt,kWfor kilowatt,MWfor megawatt,GWfor gigawattWhfor watt-hour,kWhfor kilowatt-hour,MWhfor megawatt-hour,GWhfor gigawatt-hourJfor joule,kJfor kilojoule,kcalfor kilocaloriekWh/mยฒafor kilowatt-hour per square meter per yearm/sfor meter per second,mยฒ/sfor square meter per second,mยณ/sfor cubic meter per secondPafor pascal,kPafor kilopascal,MPafor megapascal- โฆ
A list of attributes is semantically equivalent to nested dictionaries where the key is the name and the value is the value โ
๐ท๏ธ Tag โ
A tag is a kebab-cased name ๐ค
โณ Plane โ
A plane is a location (origin) and orientation (x-axis, y-axis and derived z-axis) in 3D space โ
The coordinate system is left-handed where the thumb points up into the direction of the z-axis, the index-finger forwards into the direction of the y-axis and the middle-finger points to the right into the direction of the x-axis ๐
๐ Url โ
A url is either relative (to the root of the .zip file) or remote (http, https, ftp, โฆ) string๐
A relative url is a /-normalized path to a file in the .zip file and is not prefixed with with ., ./, /, โฆ
๐ข Quality โ
A quality is a measurement definition with a key, name, description, kind (General, Design, Type, Piece, Connection, Connector), unit information (SI and Imperial), range constraints (min/max with exclusion flags), default value, and optional formula ๐
A quality can be scalable (adjusts with piece scaling) and have multiple benchmarks for performance evaluation ๐ฏ
The kind determines which entities the quality can be applied to using a bitwise enum system ๐ข
๐ Benchmark โ
A benchmark is a performance standard within a quality with a name, optional icon, and range (min/max with exclusion flags) ๐
Benchmarks provide reference points for evaluating quality measurements against industry or design standards ๐
๐ท๏ธ Concept โ
A concept is a name and order pair that provides semantic grouping for kits, types, or designs ๐ง
Concepts enable hierarchical organization and categorization of design elements beyond simple naming ๐
๐ค Author โ
An author has a name and email and can be associated with kits, types, or designs with a rank indicating contribution level ๐จโ๐ป
Authors provide attribution and contact information for design ownership and collaboration ๐ค
๐ Layer โ
A layer is an organizational grouping within a design with a name, optional description, and color for visual organization ๐จ
Layers provide a way to group and manage pieces logically within complex designs ๐
๐ฅ Group โ
A group is a collection of pieces within a design with optional name, description, color, and attributes ๐ฅ
Groups enable semantic clustering of pieces that belong together functionally or conceptually ๐
โ๏ธ๏ธ Prop โ
A prop is a key-value pair on a connector that references a quality with a specific value and optional unit ๐ง
Props define measurable characteristics of connectors using the quality system for standardized measurement ๐
๐ Stat โ
A stat is a statistical measurement on a design that references a quality with range (min/max) and optional unit ๐
Stats provide computed or measured performance data for entire designs using the quality framework ๐
This git repo has everything that exists in the open semio ecosystem ๐คฏ
โ๏ธ Principles โ
Let's start with the rules of thumbs that this codebase was built with ๐ซฐ
๐พ If something can be written in a single file, then it probably should โ
I know, the urge to tidy up or separate things is big ๐๏ธ๏ธ
But try to withstand it ๐ซฅ
Out of my experience, it makes development slower, not faster ๐
A single file is easier for humans and computers to understand ๐ก
You will be surprised
- by the awesome fill-in-the-middle suggestions of your copilot ๐ค
- by the hassle-free context selection for your ai agent ๐ฑ๏ธ๏ธ
- by the smooth refactor experience by just going top-to-bottom โฌ
- by the beautiful diff for your next code review ๐
- by the clean git-history when you try to find a certain change ๐
๐ Write and read code upside down โ
Whenever something is referenced it should be above in the source code โฌ
This means that all the building blocks (functions, classes, components, โฆ) are first defined and then used below โฌ
If you have a cyclic depedency (really?!) then put the object with lower complexity first ๐ฅ
This means that when you start with unknown code, it is probably best to start on the bottom and go upwards ๐ฑ๏ธ๏ธ
Why? LLMs, reflection, โฆ , work best left-to-write ๐ค
But Fill-in-the-Middle training is for free!?
Yeah, if you consider only FiM for code, then yes ๐
But we want it all!
And is really so hard to start reading a from the bottom?
๐ If a class, function, component, โฆ is only used once, then don't create it โ
Probably, you learned to group code by classes, functions, components, โฆ even if those definitions are only used once ๐ฅ
It hides the actual complexity and makes it harder to navigate the code ๐
๐บ Inline everything that bearly fits onto the screen โ
Smaller code, less tokens and easier diffs ๐
Your ai bill will be lower and the completions will resolve faster ๐
If you are not sure what the code does, you can ask ai ๐ฌ
๐ฃ Don't use comments or if you must, only tag code at the end of the line โ
Smaller code, less tokens and easier diffs ๐
Your ai bill will be lower and the completions will resolve faster ๐
If you are not sure what the code does, you can ask ai ๐ฌ
๐ Use regions to structure your code โ
Because you are not using classes, functions, components, โฆ and you are inlining everything, your code will become long ๐
To organize your code, you can use nested regions ๐
In general, our files follow this structure:
- Header
- TODOs
- Imports
- Constants
- CODE
๐ If a folder doesn't make your life dramatically easier, don't create it โ
We all know this ./src/** folder that has made it into a lot of starters ๐
Other than feeling cool about using hacky abbreviations, does it really help you to understand the bundle faster and work more efficient on it?
If your bundle contains hundreds of config file and other bundle folders at the root, maybe ๐ค
But most likely not โ
๐ฆ Parts that belong together should be close in the source code โ
The default code organization is to group kind of structurally similar parts together ๐
All models next to each other, all controllers next to each other, all errors next to each other, โฆ
While this pattern supports structural refactoring, it makes plain extensions harder because you have to search through all the files ๐
Most changes are plain extensions and not structural refactors ๐
Further it has the advantage that every LLM-agent only has to predict one big block of code instead of plenty of small ones ๐ค
That's why frameworks like React exist or vendoring such as with shadcn is more flexible than dependcenies such as with bootstrap
Cutting components vertically (a bit of logic with a bit of UI) instead of horizontally (all logic, all ui) requires more effort but enhances reusability ๐ฎ
๐ If multiple people work longterm on the same part, then one file for each part should be created โ
Trust me, it will make collaboration much easier ๐
๐ฎ If you don't need an port because something is not likely to be extended soon, don't create it โ
The main question is the port productive or not?
The pay-off of abstraction happens in the future ๐ฃ
Every extension profits from a clean port ๐
Most things are not extended ๐ชจ
If you change your architecture, just design proper ports for something concrete not something potential and reactor it โ
๐ค Repeating code is ok if it the repeated code is close in the source code โ
We are past the time where we copy code for no reason ๐
Actually repeated code can improve the attribute of your copilots suggestion ๐คฏ
The main question is how can your application grow?
If a change requires exponentially more duplication then you'll probably have to fix it ๐ ๏ธ
If not, then you are probably good ๐
๐ท๏ธ Never use `type` for naming enums, ports, or types. Always use `kind` instead โ
To avoid confusion with the native type concept in Semio, always use kind for naming enums, ports, or types that represent categories or classifications ๐ท๏ธ
Examples: ArtifactType โ ArtifactKind, WindowType โ WindowKind, etc. ๐
๐คจ Wait, no high-level advice and only plain numbers, files, folders or close line of codes?
In our understanding, policy-of-thumbs are most useful when they are concrete ๐จ
Besides that we are sure you know about KISS (Keep-It-Simple-Stupid), DRY (Dont-Repeat-Yourself) vs WET (Write-Every-Thing-Twice)/RUG (Repeat-Until-Good), YAGNI (You-Aren't-Gonna-Need-It), SoC (Separation-of-Concerns), Avoid Premature Optimization, Law of Demeter, LCHC (Low-Coupling-High-Cohesion), SOLID (SR (Single Responsibility), OC (Open/Closed), LS (Liskov's Substitution), IS (Port Segregation), DI (Dependency Inversion)), โฆ
But as always, the devil is in the details ๐
Even if 95% of the codebase follows those principles, there are good reasons for the other 5% โ๏ธ
๐ฉ Don't worry, you'll figure out the possibilities and make the right choice for the specific problems โ
๐ฆ GitKraken โ
Note
It is free for open-source bundles like this one โค
We use GitKraken Desktop as our git client ๐ฑ๏ธ๏ธ
It is the only nice chronological graphical overview for all branches at the same time that we found ๐
๐ฌ Discord โ
Most git events are synchronized with our repo channel ๐ฌ
It is perfect to find the latest activities and the history ๐
๐ข Release โ
Every release contains a set of matching specs, bundles, examples and docs ๐ฆ
The release notes follow this format:
SYMBOL TITLE
COMPONENT
- SYMBOL SUMMARY [CONTRIBUTOR]
โฆ
Title symbols:
- ๐๏ธ๏ธ Foundational work
- ๐ ๏ธ Heavy work
- ๐ช Minor work
- ๐ Major Bug fix
Description symbols:
- ๐ฑ Started [not yet ready]
- โ Added [ready]
- โฌ Updated
- ๐ Renamed
- ๐ Refactored
- ๐ Bug fix
Before every release the repo is archived ๐ฆ
๐ท๏ธ Tag โ
We have two different types of tags:
rYY.MM-Vfor releases (e.gr21.06-1,r23.07-2,r24.12-1,r25.07-1, โฆ)COMPONENT-vMAJOR.MINOR.PATCHfor bundles which follow the semver versioning scheme (e.gengine-v4.0.2,sketchpad-v1.0.0,grasshopper-v5.4.0-beta, โฆ)
๐ฟ Branch โ
The main branch is compressed (squashed history) and acts as the canonical integration branch ๐
If a release receives updates after main already progressed, create a parallel release/rYY.MM-V branch for that release and keep it compressed as well ๐งต
Every contributor has their own FIRSTNAME general-purpose development branch ๐ ๏ธ
In GitKraken you will quickly find the latest development branch ๐
Other branches are created for bundles, specific features or bug fixes ๐
Usually one person works on one feature at a time and hence the -NAME suffix ๐
๐๏ธ๏ธ Commit โ
Commit messages follow this format:
MAIN-TASK-SYMBOL SUMMARY WORK-SYMBOL
The first symbol encodes the main task of the commit and the last symbol encodes the amount of work (๐ช < ๐จ < ๐ ๏ธ < ๐๏ธ๏ธ) ๐งฐ
๐ฆ Commit as much as you like โ
Are you worried about committing all those binary application files (.zip, .gh, .blend, .glb, .3dm, โฆ) or the intermediate versions between your ai edits?
Well, normally you should be ๐พ
But as we archive and squash all commits on every release nothing is lost or polluted ๐ฏ
โ Push around once an hour โ
Pushing regularly keeps you extra safe from losing your work ๐
There are a few services (like Discord) that are automatically updating to what happens in the repo ๐
To keep our inbox notifications low, we try to push not more than once an hour โฌ
๐งโ๐ป Development โ
Different ecosystems need different tools ๐งฐ
๐ณ Devcontainer (Recommended) โ
The recommended way to develop is using the devcontainer which provides a consistent cross-platform environment.
Prerequisites:
- Docker Desktop or compatible container runtime
- VS Code with Dev Containers extension
Getting Started:
- Clone the repository
- Open in VS Code
- Click "Reopen in Container" when prompted (or run "Dev Containers: Reopen in Container" from command palette)
- Wait for container build and setup to complete
The devcontainer includes:
- Node.js 22.x, Go 1.24, Python 3.13, .NET SDK 7.0/8.0, Rust
- All required VS Code extensions
- Pre-configured development environment
- Port forwarding for all dev servers (3000, 4000, 4321, 5678, 6006, 2507)
๐ช Windows Setup (Legacy) โ
For a complete setup you need:
- Windows 10 or 11
- Visual Studio Code
- Visual Studio 2022 Community
- Rhino 8
- Python 3.14
- uv
- Node
If you do not have Python installed, I recommend to install it over the Microsoft Store ๐ช
Afterwards you can install uv with this command:
irm https://astral.sh/uv/install.ps1 | iexThen you can run semio-repo/cli/cli preflight build from the root to build all packages, or run tsx ./build.ts in the Grasshopper directory and add your full path LOCAL_PATH\net\Semio.Grasshopper\Debug\net48 to your GrasshopperDeveloperSettings โ๏ธ๏ธ
๐ซ Tickets โ
Contributor workflows use tickets to track each task across interactions.
A ticket interaction records a prompt, author, and is bounded by {started, finished} timestamps.
Ticket workflows record file touch lists and per-file line diffs so work is auditable and easy to continue.
Each ticket workspace keeps a single ticket.md with todos, changes, log, and summary sections so all task context stays in one place, and an important.md file for compulsory actions that must be completed before the ticket can be finished.
๐งฐ Violations โ
Contributor workflows include an automated code-quality report that highlights inline and multi-line comments (including JSDoc blocks), missing license headers, malformed region blocks, and empty regions before changes are shared.
Comment scanning works uniformly across all supported languages (TypeScript, Go, Python, C#, Shell, Rust) through a single generic implementation in BaseLanguage.ScanComments. Each language declares its own string literal flavors (template literals for JS/TS, raw backtick strings for Go, triple-quoted strings for Python, verbatim @"" strings for C#) so the scanner correctly ignores comment markers inside string contexts. Each language also declares its own skip directives (e.g. eslint-/@ts- for TypeScript, nolint for Go, noqa/type: ignore for Python, pragma for C#) which are excluded from comment violations alongside the built-in TODO and semio-ignore- directives.
It also enforces module boundaries and domain-neutral terminology for shared UI building blocks.
Each reported problem includes a short reason and solution so contributors can resolve violations quickly.
The fix command applies autofixes for all autofixable violation kinds: it replaces wrong file header artifact IDs with the correct emoji-prefixed path (e.g. ๐ป semio/js/src/index.ts), removes empty sections (including one surrounding blank line, preferring the preceding one), resolves missing section end names by walking backward through nested sections to find the matching start, corrects mismatched section end names, removes contiguous inline comment blocks (including intervening blank lines), and removes block and JSDoc comments.
After removing lines, a post-processing step collapses consecutive blank lines so the output stays clean.
Non-autofixable violations (missing header regions, unnamed region starts, orphan definitions) are reported but left for manual resolution.
๐ Port Numbers โ
Overview of all connectors used during development and in final packages:
| Service | Port | Command / Package | Notes |
|---|---|---|---|
| Sketchpad | 3000 |
dev js js sketchpad |
Vite dev server for Sketchpad |
| Play | 4000 |
dev play |
Vite dev server for Play |
| Docs | 4321 |
dev docs |
Astro dev server (default) |
| Storybook | 6006 |
dev js js storybook |
Storybook dev server (default) |
| Playwright | 5173 |
npm test (js) |
Test server for Playwright E2E tests |
| Engine | YYMM |
semio/engine package |
Connector derived from release: rYY.MM-V โ YYMM (e.g., r25.07-1 โ 2507) |
Press Ctrl+Shift+P (or Cmd+Shift+P on macOS) โ "Tasks: Run Task" and select from:
Root-level commands:
build- Build all packagestest- Run all testsfix- Run auto-fixes/formattersanalyze- Run non-mutating checkspreflight- Run all preflight checks (default build task)update- Update dependenciespublish:test- Publish to test serverspublish- Publish packagesdev- Start all dev serversdev js js storybook- Startsemio/jsStorybookdev js js sketchpad- Startsemio/jsVite Sketchpad (connector3000)
Workspace-specific commands:
build [workspace]- e.g.,build js,build engine,build vscodetest [workspace]- e.g.,test js,test engine,test vscodepreflight [workspace]- e.g.,preflight js,preflight enginedev [workspace]- e.g.,dev js,dev engine,dev play,dev docs
Press F5 or use the Run and Debug panel to launch:
Development:
dev- Start all services with Python debugger attacheddev engine/dev js/dev play/dev docs/dev vscode- Individual servicesdev js js storybook/dev js js sketchpad-semio/jsspecialized dev entrypoints
Testing:
test- Run all teststest js/test engine/test vscode- Individual test suites
Fix / Analyze:
fix- Run auto-fixes/formattersanalyze- Run non-mutating checks
Preflight:
preflight- Run all preflight checkspreflight js/preflight engine/preflight vscode- Individual checks
Building:
build assets/build icons/build engine/build js/build docs- Individual builds
Publishing:
update/publish:test/publish- Root-level publishing commands
Most of our codebase is heavily optimized for AI agents ๐ค
We pick tools based on billing model (request-based vs token-based), required context size, and whether a workflow needs MCP (e.g. Playwright) ๐งฐ
๐ ๏ธ Uses-Cases โ
Here some strategic advice for different uses-cases ๐บ
โ๏ธ Decision Making โ
Model will always tell you that your ideas, guesses, analysis, โฆ are great ๐ฏ
This makes it really hard to use them for decision making because they tend to just reinforce your own bias ๐ข
Try to formulate everything as neutral, general and unbiased as possible ๐
๐ Refactoring โ
Most refactors are too big to be done in one go and models are usually steered that if they think the problem is too big then they try to automate it with scripting ๐ค
This is usually not possible and then they fail โ
After all from a provider perspective those tasks are dangerous and hard to scale and we understand why they want the model to avoid doing it ๐ฅ
The next problem is that when they take the wrong approach then, due to large context, they hardely remember how the original state was ๐ค
For this reason, we usually create a new file which we name with the suffix*.old and this way in the prompt we can refer to the original state ๐
๐ Bug Fixes โ
Try to describe only how to the bug appears and not what you think caused it ๐ถ
Experience what can be causes for bugs is increadibly valuable skill as a developer but the problem is that models are really biased the way you ask questions ๐
Especially when your guess is wrong then the model might have found the mistake but because of your bias it tries to take a different approach to fix it ๐
Secondly, if the model can't find the bug then it will often try to remove functionality, add try catch blocks, add logging and other things that fastly turn your codebase into a mess ๐ฃ
Therefore, it is often a good idea that after you found the bug, reset your branch and create a new ticket where you define exactly how to fix the bug ๐ช
โจ๏ธ๏ธ Tools โ
๐ Web-Chat โ
For research, prompt preparation or single file-related operations (sorting, formatting, explaining, โฆ) we use the free , Gemini or Groq, โฆ in the browser to not waste precious tokens ๐
The free quota is very quickly reached but resets regularly and hence we just use it for questioning or prompt preparation ๐ฌ
Good for larger experiments due to more generous free quota ๐งช
๐ป Editor โ
๐ Resources:
Copilot is our default for most tickets because request-based billing makes fast interaction cheap ๐ณ
๐ Resources:
We have the Pro plan ๐ณ
We use Cursor as our main editor for typing code mostly with Tab โก
For tasks that require updated large docs that are too large to paste into the prompt, we use the agent ๐
But in general, we don't use the chat because it is way too expensive ๐ฐ
๐ Windsurf โ
Used for token-heavy test-driven-development workflows with MCP (especially Playwright) ๐งช
โจ๏ธ๏ธ CLI โ
โจ๏ธ๏ธ Claude Code โ
We have the Pro plan ๐ณ
Used for small bugs and focused fixes with strong repo context ๐ง
๐งพ Codex โ
Used for simple tasks (small edits, small refactors, small doc updates) ๐งฉ
โ Cloud โ
๐ฆ Jules โ
[!NOTE] Free plan includes 15 tasks per day, 3 concurrent tasks and powered by Gemini 2.5 Pro ๐
Used on the phone when no IDE is available ๐ฑ
๐ Agents โ
โ Reorderer โ
Used to ensure consistent order of source code, docs, โฆ
๐ Formatter โ
Used to ensure consistent formatting of source code, docs, โฆ
๐ค Models โ
The default model for agent work is Claude Opus 4.5, with GPT-5.2 Codex and GPT-5.3 Codex as alternatives ๐ง
Claude Opus 4.5 โ
GPT-5.2 Codex โ
GPT-5.3 Codex โ
๐ CI/CD โ
๐บ Channels:
- TechWorld with Nana -
devops
All automation, CI runs, and agent workflows are controlled through the canonical root commands dev, fix, analyze, preflight, test, build, update, publish:test, and publish. Only dev is allowed to stay live for watch mode, while the remaining commands must exit so CI and agents can finish reliably. publish:test and publish always run a full build first.
The root package.json uses preflight.ts to orchestrate the command pipeline, and delegates bundle builds/tests/publishing to Nx (npx nx run-many -t <target>).
โป Ecosystems โ
Documentation for each ecosystem has been migrated to the respective bundle README.md files:
- semio/js/README.md - JavaScript (React, TypeScript, Vite, Tailwind, Three.js)
- semio/net/README.md - .NET (C#, NuGet, Grasshopper)
- semio/py/README.md - Python (uv, Pydantic, SQLAlchemy)
๐ฆ Bundles โ
Documentation for each bundle has been migrated to the respective bundle README.md files:
| Bundle | README |
|---|---|
| .devcontainer | .devcontainer/README.md |
| semio-repo/cli | semio-repo/cli/README.md |
| semio-repo/vscode | semio-repo/vscode/README.md |
| semio-repo/server | semio-repo/server/README.md |
| semio-repo/graphql | semio-repo/graphql/README.md |
| semio-repo/sqlite | semio-repo/sqlite/README.md |
| semio | semio/README.md |
| semio/js | semio/js/README.md |
| semio/engine | semio/engine/README.md |
| semio/desktop | semio/desktop/README.md |
| semio/docs | semio/docs/README.md |
| semio/play | semio/play/README.md |
| semio/net | semio/net/README.md |
| semio/py | semio/py/README.md |
| semio/go | semio/go/README.md |
| semio/rs | semio/rs/README.md |
| semio/assets | semio/assets/README.md |
| semio/sketchpad | semio/sketchpad/README.md |
| semio/sqlite | semio/sqlite/README.md |
๐ Hello semio โ
๐ซ Metabolism โ
๐ฏ Brand โ
โ Concept โ
โ Do โ
- Visual is better than text ๐
- Compact โก More information โก Faster to understand ๐
โ Dont โ
- Rounded corners โฌ
- Shadows ๐ค
- Multiple unicode directly after each other ๐ฅ๐ฅ๐ฅ
๐ Colors โ
| Name | Hex | RGB | HSL | HSV (or HSB) | CMYK | Color |
|---|---|---|---|---|---|---|
| Primary | #FF344F | 255, 52, 79 | 352, 100, 60.2 | 352, 79.6, 100 | 0, 80, 69, 0 | Folly |
| Secondary | #00A69D | 0, 166, 157 | 176.7, 100, 32.5 | 176.7, 100, 65.1 | 100, 0, 5, 35 | Persian green |
| Tertiary | #FA9500 | 250, 149, 0 | 34.8, 100, 49 | 35.76, 1, 0.49 | 0, 40, 100, 2 | Princeton orange |
| Dark (= 0) | #001117 | |||||
| Grey 100 (= 0.1 = 1/10) | #06171C | |||||
| Dark 8-9 (= 0.1ฬ = 1/9) | #07181D | |||||
| Dark-Dark-Dark-Grey (= 0.125 = 1/8) | #091A1F | |||||
| Dark 6-7 (= 0.142857 = 1/7) | #0C1C21 | |||||
| Dark-Dark-Grey (= 0.166667 = 1/6) | #112025 | |||||
| Grey 200 (= 0.2 = 1/5) | #18272A | |||||
| Dark 7-9 (= 0.2ฬ = 2/9) | #1D2B2F | |||||
| Dark Grey (= 0.25 = 1/4) | #243235 | |||||
| Dark 5-7 (= 0.285714 = 2/7) | #2E3C3D | |||||
| Grey 300 (= 0.3 = 3/10) | #334041 | |||||
| Dark-Dark-Grey (= 0.3ฬ = 1/3) | #3E494A | |||||
| Dark-Grey-Grey-Grey (= 0.375 = 3/8) | #4C5756 | |||||
| Grey 400 (= 0.4 = 2/5) | #555F5D | |||||
| Dark 4-7 (= 0.428571 = 3/7) | #606966 | |||||
| Dark 5-9 (= 0.4ฬ = 4/9) | #666E6B | |||||
| Grey (= 0.5 = 1/2) | #7B827D | |||||
| Light 5-9 (= 0.5ฬ = 5/9) | #91968F | |||||
| Light 4-7 (= 0.571429 = 4/7) | #979B94 | |||||
| Grey 600 (= 0.6 = 3/5) | #A2A59D | |||||
| Light-Grey-Grey-Grey (= 0.625 = 5/8) | #ABADA4 | |||||
| Light-Grey-Grey (= 0.6ฬ = 2/3) | #B9BBB0 | |||||
| Grey 700 (= 0.7 = 7/10) | #C4C4B9 | |||||
| Light 5-7 (= 0.714286 = 5/7) | #C9C8BD | |||||
| Light Grey (= 0.75 = 3/4) | #D3D2C5 | |||||
| Light 7-9 (= 0.7ฬ = 7/9) | #DAD9CB | |||||
| Grey 800 (= 0.8 = 4/5) | #DFDDD0 | |||||
| Light-Light-Grey (= 0.8ฬ = 5/6) | #E6E4D5 | |||||
| Light 6-7 (= 0.857143 = 6/7) | #EBE8D9 | |||||
| Light-Light-Light-Grey (= 0.875 = 7/8) | #EEEADB | |||||
| Light 8-9 (= 0.8ฬ = 8/9) | #F0ECDD | |||||
| Grey 900 (= 0.9 = 9/10) | #F1EDDE | |||||
| Light (= 1) | #F7F3E3 |
๐ฅ Primary โ
Use the primary color for the most important elements of your design ๐
We use it e.g. for:
- Highlighting interactive elements ๐ฑ๏ธ๏ธ
- Background for important elements ๐ฅ
๐ฅ Secondary โ
๐ฅ Tertiary โ
โซ Dark โ
โช Light โ
๐ฉถ Gray โ
Are you curious how a 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 and 11 colored gradient can come together for an invertible theme in a semantically meaningfull way? Well, here is how you achieve it with 33 colors ๐คฏ
๐ Typography โ
Note
Try to place notes either in the beginning or the end of a section โ A starting note should contain something important but not crucial to give the brain the right context ๐ง The starting sentence of a note needs no symbol because every note type starts with a symbol ๐ฅ
- Be consistent with your language โป
- When things are analogical use the same sentence structure for it ๐
- One symbol after every sentance ๐ฏ
- One symbol at a time ๐ฅ
- A symbol is preferably an emoji or otherwise unicode โ๏ธ
- ๐ One symbol to summarize a title
- ๐ก One symbol to summarize a title description and one to think about in the end ๐ค
.are forbidden โ- All components in
semio(sketchpad,studio, โฆ) start with a small letter ๐ก - Did you know that
โฆis just one character?
Tip
In the end of a section you can give the curious reader a summarizing question to think about the consequences and a link to more resources ๐ค
๐ก Typesetting โ
- Sans serif: Anta ๐จ
- Serif: Kelly Slab โ
- Monospaced: Shart Tech Mono ๐ฅ
- Emoji: Noto Emoji โซ
๐ Visual elements โ
- Sharp corners ๐
- Borders โก
- Basic geometric shapes โช
The files in this repository are licensed under the GNU Affero General Public License unless otherwise described. Most libraries, modules, extensions, objects or code herein are explicitly licensed. This is indicated in the root of the containing folder under a different license file, or in the configuration files of a bundle or in the respective file's header.
As a reference, different type of components have usually different licenses:
- software libraries: LGPLv3 or later - GNU Lesser General Public License Version 3
- applications: AGPLv3 or later - GNU Affero General Public License Version 3
- examples: MIT - The MIT License
- templates: CC0 - No Rights Reserved
- assets: CC BY-ND 4.0 - Attribution-NoDerivatives 4.0 International
If you have any questions, please don't hesitate to get in touch with us over email ๐ง
If you have any security vulnerabilities or concerns, please contact us over email and don't open an issue, discussion or write into our public discord server ๐ฅท
โจ Contributors โ
๐ Stats
We use Goatcounter for gaining insights about our docs ๐







