{"id":50695127,"url":"https://github.com/binomica-labs/splicecraft","last_synced_at":"2026-06-14T06:01:12.849Z","repository":{"id":346592781,"uuid":"1190666059","full_name":"Binomica-Labs/SpliceCraft","owner":"Binomica-Labs","description":"Terminal-based plasmid map viewer, sequence editor, and cloning/mutagenesis workbench in pure Python","archived":false,"fork":false,"pushed_at":"2026-06-09T05:57:21.000Z","size":52973,"stargazers_count":157,"open_issues_count":5,"forks_count":9,"subscribers_count":2,"default_branch":"master","last_synced_at":"2026-06-09T06:28:20.439Z","etag":null,"topics":["bioengineering","biology","biopython","cloning","genetics","golden-braid","microbiology","moclo","molecular-biology","mutagenesis","plasmid","primer3","pure-python","restriction-enzymes","terminal-ui","textual","workbench"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Binomica-Labs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-24T13:59:31.000Z","updated_at":"2026-06-09T05:57:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Binomica-Labs/SpliceCraft","commit_stats":null,"previous_names":["binomica-labs/splicecraft"],"tags_count":171,"template":false,"template_full_name":null,"purl":"pkg:github/Binomica-Labs/SpliceCraft","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Binomica-Labs%2FSpliceCraft","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Binomica-Labs%2FSpliceCraft/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Binomica-Labs%2FSpliceCraft/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Binomica-Labs%2FSpliceCraft/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Binomica-Labs","download_url":"https://codeload.github.com/Binomica-Labs/SpliceCraft/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Binomica-Labs%2FSpliceCraft/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34310801,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-14T02:00:07.365Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bioengineering","biology","biopython","cloning","genetics","golden-braid","microbiology","moclo","molecular-biology","mutagenesis","plasmid","primer3","pure-python","restriction-enzymes","terminal-ui","textual","workbench"],"created_at":"2026-06-09T06:03:11.593Z","updated_at":"2026-06-14T06:01:12.843Z","avatar_url":"https://github.com/Binomica-Labs.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SpliceCraft\n\n![SpliceCraft Logo](https://raw.githubusercontent.com/Binomica-Labs/SpliceCraft/master/splicecraftLogo.png)\n\n[![PyPI](https://img.shields.io/pypi/v/splicecraft.svg)](https://pypi.org/project/splicecraft/)\n[![Python](https://img.shields.io/pypi/pyversions/splicecraft.svg)](https://pypi.org/project/splicecraft/)\n[![100% Python](https://img.shields.io/badge/100%25-Python-3776AB?logo=python\u0026logoColor=white)](https://www.python.org/)\n[![TUI: Textual](https://img.shields.io/badge/TUI-Textual-5A45FF?logo=python\u0026logoColor=white)](https://textual.textualize.io/)\n[![Tests](https://github.com/Binomica-Labs/SpliceCraft/actions/workflows/test.yml/badge.svg)](https://github.com/Binomica-Labs/SpliceCraft/actions/workflows/test.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Status: Release candidate](https://img.shields.io/badge/status-release--candidate-blue.svg)](https://github.com/Binomica-Labs/SpliceCraft)\n\n## Your whole cloning workflow, in the terminal.\n\nSpliceCraft is a plasmid workbench that runs where you already work. Open a\nmap, edit the sequence, design primers, plan a Golden Braid or MoClo\nassembly, BLAST a hit, check your Sanger reads, and keep a lab notebook —\nall from the keyboard, all in one place, no browser tab and no cloud\naccount. Circular and linear maps render as crisp Unicode braille graphics\nin any modern terminal, and nothing leaves your machine unless you ask it to.\n\nIt's built by a practicing bioengineer for daily bench work: the bug\nreports come from real cloning, and so do the fixes. If you live in a\nterminal and clone for a living, it's meant to feel like home.\n\n![SpliceCraft screenshot](https://raw.githubusercontent.com/Binomica-Labs/SpliceCraft/master/splicecraftScreenshot.png)\n\n**Why give it a try:**\n\n- **Fast and local.** No Electron, no web app, no login. `pipx install splicecraft` and you're designing in seconds.\n- **It does the whole job.** View → edit → design → clone → simulate → verify → document — one tool that actually understands how those steps connect.\n- **It guards your data like it's irreplaceable** (because it is — see below).\n- **It's scriptable.** A 100+ endpoint local API and a stdlib CLI let an agent or a shell script drive every workflow.\n\n## Quick start\n\n```bash\npipx install splicecraft\nsplicecraft                      # empty canvas\nsplicecraft L09137               # fetch pUC19 from NCBI on launch\nsplicecraft myplasmid.gb         # local GenBank or .dna\n```\n\nx86-64 Linux, Intel macOS, and Windows install entirely from prebuilt\nwheels — nothing to compile. On **ARM64 Linux** (Raspberry Pi / ARM\ncloud) and **Apple Silicon with Python ≥3.10**, one dependency\n(`primer3-py`, the primer-design engine) has no prebuilt ARM wheel and\ncompiles at install, so install a C toolchain first:\n`sudo apt install build-essential python3-dev` (Linux) or\n`xcode-select --install` (macOS). One-time, then `pipx install splicecraft`.\n\nPress `?` once running for the full keyboard-shortcut reference. See\n[`docs/install.md`](docs/install.md) for pip / uv / conda / source installs.\n\n## A workhorse that just works\n\nYour plasmid library is the product of months — sometimes years — of work.\nSpliceCraft is engineered so it can be your daily driver without ever making\nyou nervous about it. Three promises, and the receipts behind them:\n\n**Your data is sacred.** Every save runs through a four-layer safety net: an\natomic write (a crash can never leave a half-written file), a `.bak` plus\nrotating timestamped backups, a daily snapshot, and a \"suspicious shrink\"\nguard that flat-out refuses to replace a 156 MB library with an empty file.\nOpen a file that collides with something you already have and SpliceCraft\nasks — skip, keep a copy, or overwrite — it never clobbers your work behind\nyour back. Before any self-update it snapshots everything to a sibling\ndirectory first, so even a hypothetical bug in a new version can't take your\nrecovery copy with it.\n\n**The biology is correct, and we prove it.** Restriction scanning handles\npalindromes, Type IIS enzymes, and origin-spanning cut sites the way a bench\nscientist expects; features that wrap the origin survive every edit;\ntranslation (including non-standard genetic codes via `/transl_table`),\nreverse-complement, and IUPAC matching are pinned down to the base.\nSelection markers are read from the actual entry vector you're using —\nno hardcoded antibiotics quietly mislabeling a construct. There are\n**4,000+ automated tests** behind all of it, plus property-based fuzzing on\nthe biology primitives, crash-injection tests on the save path, and\nconcurrency fuzzing on the data layer. Every release ships only when the\nwhole suite is green.\n\n**We go looking for trouble.** The codebase is governed by a long list of\n\"sacred invariants\" (documented in [`CLAUDE.md`](CLAUDE.md)), and each\nrelease is preceded by deep, multi-pass audits hunting for edge cases,\ndata-loss windows, race conditions, and security gaps — with every finding\nverified against the real code before a line is changed. The short version:\nit's a workhorse, and it goes to real lengths to keep \"it just works\" true.\n\nFull data-safety writeup: [`docs/data-safety.md`](docs/data-safety.md) ·\nSecurity policy: [`SECURITY.md`](SECURITY.md).\n\n## A guided tour\n\nEverything lives behind a menu bar across the top of the screen. Here's the\ntour — starting with **BLAST** and working rightward across the bar, with the\nhousekeeping menus (**File**, **Settings**) saved for last.\n\n### BLAST\n\nSearch without leaving the app (`Ctrl+B`). The **Local** tab runs BLASTN /\nBLASTP / HMMscan against your own library with an in-process engine — powered\nby `pyhmmer`, so there's no external `blast+` to install — and a one-click\ndownloader pulls Pfam-A or NCBIfam (or any HMMER3 `.hmm.gz` URL) with\nautomatic update-detection, no `wget` + `hmmpress` ritual. On native Windows,\nBLASTN/BLASTP run in-process but HMMscan needs WSL2 (`pyhmmer`/HMMER is\nPOSIX-only). The **Online** tab\nsends DNA / RNA / protein — or a whole plasmid or a single feature straight\nfrom your library — to NCBI (blastn / blastp / blastx / tblastn / tblastx) or\nto Pfam at EMBL-EBI, and drops the hits into a scrollable table just like a\nweb BLAST. A live spinner and poll counter prove the search is really running,\nand Cancel actually stops it.\n\n### Enzymes\n\nDrive the restriction overlay: show all sites, unique cutters only, 6+ or 4+\nbp recognition, or just the Golden Braid connectors. Build **enzyme\ncollections** — named subsets of the master catalog (200+ NEB enzymes plus\nyour own customs) — and the active collection scopes every scan. Add a custom\nenzyme (name, site, cut positions, type, supplier) and it's live in every\nmap from then on.\n\n### Features\n\nA workbench for your reusable annotations — promoters, RBSs, tags, CDSs.\nCapture a region off any plasmid into the feature library, then drop it back\nonto another construct to either *annotate* a selection or *splice* the\nsequence in. It's the same store the Synthesis editor and Domesticator pull\nfrom, so your parts stay consistent everywhere.\n\nMarking things up by hand? **Ctrl+F** finds a DNA subsequence — fuzzy, so\nyou can allow a few mismatches, and on both strands — then `n` / `N` step\nthrough every hit. Each match lands pre-selected, so **Alt+Shift+F** tags it\nas a feature on the spot: ideal for walking a plasmid and annotating repeat\nregions one by one. (Looking for an existing annotation instead? `Ctrl+/`\nsearches your features by name.)\n\n### Primers\n\nA full-screen Primer3 designer covering detection, cloning, Golden Braid, and\ngeneric primers — each with a persistent **Designed → Ordered → Validated**\nlifecycle, so you can see at a glance what's been ordered and what came back\nworking, right alongside the plasmid it belongs to.\n\n### Mutato\n\nSite-directed mutagenesis, with a hint of whimsy in the name. Point at any\nCDS, name the change (say, `L54A`), and SpliceCraft designs the SOE-PCR\nprimers for you — with a smart fallback to a 2-primer modified-outer strategy\nwhen a near-the-end mutation can be folded into a single primer. It checks\nits own work, too: the shortcut is only offered when the primer genuinely\ncarries the change, so you never amplify wild-type by accident. It also turns a\npasted protein into a ready-to-order CDS — frequency-matched codon optimization\nagainst your chosen table, with a **stops** selector (1–3) that also honors a\ntrailing `*` run when you want a double or triple stop codon, and an **Avoid\nsites** picker that scrubs your chosen restriction-enzyme cut sites out of the\noptimized CDS.\n\nIts second tab, **Scrub**, cures a whole plasmid of restriction sites without\nany cloning. Pick the enzymes to remove (Golden Gate / MoClo Type IIS sites by\ndefault) and SpliceCraft finds the smallest set of point changes that destroy\neach site — **silent** ones inside any coding sequence, checked against *every*\noverlapping reading frame so a protein never changes (and biased toward your\nchosen codon table's frequent synonyms when there's a choice), and minimal\nswaps elsewhere — without ever spawning a new forbidden site. You get the cured\ncircular plasmid (one click to apply, fully undoable) plus primers designed off\nthe cured sequence so they bind exactly where they're drawn — save them to your\nprimer library or add them straight to the map. Choose how it re-circularizes:\n**QuikChange** — an improved-QuikChange pair per locus, PCR → DpnI → transform\n(no ligase, no assembly); or **Golden Braid** — split the plasmid at each cure\ninto BsaI-tailed fragments that a one-pot Golden Gate reaction ligates back\ntogether, the native 4 nt junction overhangs making reassembly seamless so the\nonly net change is the cured sites. (BsaI being the assembly enzyme, every BsaI\nsite is force-cured, and the design proves itself by a digest-and-ligate\nsimulation before you order.) Sites it can't remove silently are reported,\nnever forced.\n\n### Synthesis\n\nA gene-synthesis composer with three tabs. The **DNA tab** is a\nhorizontally-scrolling linear editor with anti-parallel strand markers, live\nfeature stripes, restriction overlay, and AA translation, plus a feature\nlibrary side-pane (Insert to splice, Annotate to overlay). The **Protein\ntab** lets you type or paste amino acids and watch the codons appear underneath\nusing your chosen codon table — pick a different one or hit **Manage** to open\nthe **tabbed codon-table manager**, where each way of getting a table has its\nown tab: **Build from genome** (give an NCBI assembly accession or a taxid, and\nchoose highly-expressed genes — ribosomal proteins, the recommended bias for\nstrong expression — or the whole genome), **Fetch (Kazusa)**, **Import TSV**,\nplus a **Library** tab to pick or delete and a **Chart** tab that draws any\ntable as the classic genetic-code grid — each codon annotated with its usage\nwithin its amino-acid family (relative synonymous usage), and each family's\nsingle most-used codon highlighted in bold green (family-wide, so a codon\nsplit across cells — Leu, Ser, Arg, the stops — lights up once) for easy\nvisual identification. The same manager opens from\n**Settings ▸ Codon Tables** and the Mutato / Constructor codon pickers. Codons\nare reflected live — and a built-in motif library (His6, FLAG, HA, TEV,\nP2A, NLS, GS linkers, and ~30 more) inserts pre-colored tags. Hit **Optimize →\nDNA** to codon-optimize the protein (with the same stop-count and **Avoid\nsites** controls as Mutato) and hand the CDS straight to the DNA tab as an\neditable fragment. Or hit **Open** to\nload a sequence straight from a single-entry FASTA (or other amino-acid file) — a\nfile browser highlights the loadable formats in pink. Compose a part,\nhit **Clone Fragment**, and it's handed straight to the Domesticator as an L0\nbuilding block. When you save the domesticated part, one dialog names — and independently\nfiles — three things: the **cloned plasmid** (into any collection), the\n**linear fragment** you'd send for a DNA-synthesis order (its own name,\ndefaulting to a `FRAG-…` form, into any collection), and which **parts bin**\nthe L0 part files into. The fragment is the *primed amplicon* — the insert\nflanked by the designed domestication primers' enzyme sites + overhangs, exactly\nas it would run on the bench — and both the fragment **and** the clone carry the\n**domestication primers**, drawn with their bound (annealing + overhang) and\nunbound (enzyme-tail) regions, so you can see exactly how each was built (and\nregenerate the amplicon later for a synthesis order).\nThe **Operon Design tab** turns the codon optimizer and SpliceCraft's\nbuilt-in RBS engine into an expression-tuning workbench. Keep a library of\n**protein collections** on the right (add a protein by pasting a sequence,\ngrabbing a CDS from any plasmid in your library with **From feature**, or\n**Fetch**ing one from NCBI by accession), drop proteins into the **assembly\nlane**, and give each gene a **target relative RBS strength**.\n**Assemble** codon-optimizes every CDS and reverse-designs every ribosome\nbinding site *in its real assembled context* — so the achieved strength tracks\nyour target, and a gene the surrounding sequence can't drive strongly is\nflagged rather than silently missed. The finished operon (promoter + RBS + CDS\nper gene + terminator) drops into the DNA tab fully annotated, ready to add cut\nsites or **Clone Fragment**. It's all pure-Python — the RNA folding,\ncofolding, and translation-initiation model ship inside SpliceCraft with no\nexternal dependencies.\n**Save** (and **Save As**, which forks a copy and only lights up once the\nfragment has been saved once) let you pick which collection the fragment lands\nin, and keep editing it there.\n\n### Parts\n\nYour **Parts Bin** — the Level-0 building blocks for grammar-based assembly,\norganized into per-grammar bins. Multiple bins live side by side as Parts Bin\ncollections, so a yeast toolkit and a plant toolkit never get mixed up.\n\n### Constructor\n\nWhere it all comes together. A multi-tab assembly bench — Traditional\ncloning, Gibson, Golden Braid, MoClo, or your own custom grammar — driven by\na 4-source part picker. Every assembly, at every level, lands as one complete\nlibrary entry (payload + overhangs + backbone) that carries every parent\nfeature forward, so you can trace a finished L3 construct all the way back to\nits L0 parts right from the Library panel.\n\n### Simulator\n\nIn-silico PCR and agarose gels. Pick a template from your library, run the\nPCR, then save the amplicon back to the library or send it to a gel lane.\nGels render at 0.5–4% with a real Helling–Goodman–Boyer mobility curve; stack\nseveral amplicons side by side, save the whole gel to reload later, or cite\nit as `\u0026\u003cgel\u003e` in your lab notebook.\n\n### Sequencing\n\nVerify your constructs against real reads. Drop in a Plasmidsaurus `.zip` and\nwalk three numbered tabs — pick the run, pick the sample, pick the target\nplasmid — then **Align**. The read lands as a colored bar on the plasmid's\nlinear map (blue match / red mismatch / gray gap) with its name painted\nright onto the bar so a multi-read pile-up stays readable. Zoomed all the\nway out, each cell is shaded by how much of its span actually binds —\nsolid blue where it matches, a red shade that deepens with the mismatch\ndensity, gray for gaps — so a partially-binding read reads as a blue/red/\ngray patchwork and even a single-base mismatch still shows red in its\nregion. **Click anywhere on a read's bar to jump the sequence panel to\nthat exact spot** — centered and highlighted — so you can land on a\nmisaligned stretch (or the precise base to re-edit) without scrolling;\nthe full per-base alignment view is still a keystroke away in the\nAlignment Manager. **Bulk auto-align**\nmatches a whole results folder against your library in one pass — and its\nconfirm window shows each read's real **identity, mismatched-base, and gap\ncounts** (computed by actually aligning, not just the name/k-mer match\nscore), ready when the window opens so you can see how clean every read is\nbefore you commit. The\n**Verification Report** grades every construct (✓ verified / ⚠ near-match /\n~ partial / ✗ divergent) in one sortable table — click a row to jump to the\nfirst variant. The **Alignment Manager** lists every stored alignment with\nits identity, mismatched-base count, and gap count, so one glance tells you\nhow clean each read is — and an identity that isn't a true 100% never rounds\nup to \"100%\" (a single off-by-one base reads as e.g. `99.99%`, not a false\nperfect score). The Library panel even shows a per-plasmid **Seq** badge so\nyou can see what's been verified at a glance, alongside a **Kind** badge\n(`○` plasmid · `/` fragment · `≈` amplicon · `ρ` protein) telling you what\neach entry is.\n\n### Experiments\n\nA genuine lab notebook, in markdown. A split-pane editor, entries grouped\ninto **projects** (the way plasmids group into collections), and live colored\ncross-references — type `@plasmid`, `!action`, or `\u0026gel` and double-click (or\n`Ctrl+G`) to jump straight to the source. Attach images, and spellcheck with\n`F7` against a dictionary you can grow.\n\n### History\n\nEvery plasmid you build through SpliceCraft remembers how it was made —\nwhether you cloned it via Golden Braid, traditional digest/ligation, Gibson,\nor PCR, or just edited and saved it. **History** opens with a **Protocol**\nsummary — a numbered recipe that reads left → right like the bench (*\"assemble\npProm + pCDS_GFP + pTerm into pENTR_L1 → TU_GFP ✂ Esp3I\"*, with a symbol\nlegend) — above a **lineage tree** that opens collapsed to the finished plasmid\nand its direct inputs and lets you drill in as deep as you like. Selecting a\nstep shows its detail, including the **primers** used for a PCR. A backbone or\npart reused across branches is shown once and then referenced, so even a\nmulti-part Golden Braid / MoClo build reads at a glance. The same history rides\nalong when you import or re-export a CommercialSaaS `.dna` file. \"How did I make\nthis again?\" is always one keystroke away.\n\n### File \u0026 Settings\n\nThe housekeeping. **File** opens local files, fetches from NCBI, saves,\nexports (GenBank / FASTA / GFF3), bulk-imports a folder, and restores from\nbackup — and it's home to **Master Delete**, a triple-gated full wipe for\nwhen you genuinely want a clean slate (typed `YES`, a default-No confirm, and\na cool-down on the button; no shortcut, no API). **Settings** collapses every\ntoggle (restriction overlay, primer-binding length, and more) into one dialog,\nwith launchers for the grammar, entry-vector, enzyme-collection, and\ncodon-table editors.\n\nWant to drive all of this from a script or an agent? There's a 100+ endpoint\nlocalhost JSON API (`splicecraft --agent`) and a stdlib-only CLI sidecar\n(`splicecraft-cli`) — see [`docs/agent-api.md`](docs/agent-api.md) and\n[`docs/cli.md`](docs/cli.md).\n\nFull feature reference: [`docs/features.md`](docs/features.md).\n\n## Documentation\n\n| Topic                         | Where                                                                |\n|-------------------------------|----------------------------------------------------------------------|\n| Install methods               | [`docs/install.md`](docs/install.md)                                |\n| First five seconds with pUC19 | [`docs/getting-started.md`](docs/getting-started.md)                |\n| Full feature list             | [`docs/features.md`](docs/features.md)                              |\n| Keybindings + menus           | [`docs/keybindings.md`](docs/keybindings.md)                        |\n| Data safety + backups         | [`docs/data-safety.md`](docs/data-safety.md)                        |\n| Agent API (HTTP)              | [`docs/agent-api.md`](docs/agent-api.md)                            |\n| CLI sidecar                   | [`docs/cli.md`](docs/cli.md)                                        |\n| Architecture                  | [`docs/architecture.md`](docs/architecture.md)                      |\n| Sacred invariants             | [`CLAUDE.md`](CLAUDE.md)                                            |\n| Contributing                  | [`CONTRIBUTING.md`](CONTRIBUTING.md)                                |\n| Security policy               | [`SECURITY.md`](SECURITY.md)                                        |\n| v1.0.0 acceptance gate        | [`V1_GATE.md`](V1_GATE.md)                                          |\n| Changelog                     | [`CHANGELOG.md`](CHANGELOG.md)                                      |\n| Release checklist             | [`RELEASE_CHECKLIST.md`](RELEASE_CHECKLIST.md)                      |\n\n## Tests\n\n```bash\npython3 -m pytest -n auto -q                  # full suite (~5–6 min on 8 cores)\npython3 -m pytest tests/test_dna_sanity.py    # biology correctness only (\u003c 2 s)\npython3 -m pytest tests/test_perf_regression.py  # perf gates (~3 s)\n```\n\nAll tests run offline against synthetic `SeqRecord`s and monkeypatched data\npaths; the autouse `_protect_user_data` fixture in `tests/conftest.py`\nguarantees no test can write to real user files.\n\n## Maintenance\n\nSpliceCraft is actively maintained. The maintainer is a practicing\nbioengineer running real cloning workflows in it daily; releases typically go\nout the same week a problem surfaces at the bench. Issues and PRs welcome at\n[github.com/Binomica-Labs/SpliceCraft/issues](https://github.com/Binomica-Labs/SpliceCraft/issues).\n\nSee [`CONTRIBUTING.md`](CONTRIBUTING.md) before opening a non-trivial PR — it\nwalks through the sacred invariants, the test cadence, and the\nsecurity-sensitive code surfaces.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbinomica-labs%2Fsplicecraft","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbinomica-labs%2Fsplicecraft","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbinomica-labs%2Fsplicecraft/lists"}