[NightFury]
[What I do]
[](https://forgenet.fr)
[](https://capibara.fr)
[](https://marcusbot.fr)
[](#)
---
###
[] About
I'm **NightFury**, a French developer, and I run **Forge Network** (`forgenet.fr`) a non-profit
association that publishes the projects on this page.
I tend to take a product across its whole stack rather than one layer of it: the database and its
isolation model, the API, the interface, then the Debian machine it runs on nginx, Docker, PM2,
certificates, backups. Most of what follows exists because something had to be decided at that
level.
```javascript
const nightFury = {
role: ["Full-Stack", "SysAdmin", "Data Eng", "OS Builder"],
founder: "Forge Network forgenet.fr",
stack: ["TypeScript", "Next.js", "React", "Node", "Dart", "PostgreSQL", "Docker", "Linux"],
now: ["Capibara (SaaS suite)", "a custom Linux distro", "a new Grand Projet"],
learning:"Scala & high-performance JVM systems",
};
```
---
##
[] OpenCoperLock the one you can read
> My main open-source project, and the only place where the claims on this page can be checked
> against the source. Everything after it is private, so start here.
### [] A private cloud for one dedicated machine
*A self-hostable Drive files, folders, quotas, sharing with three things most "drop a file" tools don't have.*






**Quick-Upload** opens a temporary drop zone on any device from a code no login with optional
password, expiry and usage limit. **Remote-Upload** makes the server fetch a link itself, so a phone
on a metered connection never relays the bytes. **Hybrid encryption** is a choice made per folder:
encrypted at rest so the antivirus can still scan the file, or a zero-knowledge vault encrypted in
the browser that the server cannot read at all.
Shared Spaces are encrypted server-side only, because a zero-knowledge vault cannot be shared
that trade-off is written in the docs rather than left for you to discover. Same for the rest:
background work runs inside the API process to keep a deployment to a single moving part, with
Redis/BullMQ documented as the upgrade for horizontal scale instead of required up front.
Antivirus scanning on upload WebDAV mounting personal-token REST API desktop right-click integration one-click self-update from GitHub architecture, security policy and a candid threat model in `docs/`







[](https://github.com/softpython2884/OpenCoperLock)
[](https://copper.forgenet.fr)
|
---
##
[] Flagship Work
> Four systems in production. All four are private client work and products that are sold so the
> links go to the live product or the download, and the numbers come from the repositories.
### [] Capibara private in production
*The software a small company runs its day on: quotes, invoices, accounting, customers, stock, staff, shop and the website that fronts it.*







Around twenty applications sharing one set of customers, one accounting ledger and one search index,
so an invoice, the stock movement behind it and the ticket about it are the same object seen from
three places. Each company also gets a public website it edits itself, built from blocks, served
from its own domain.
The isolation is structural rather than a filter: **every customer gets its own copy of the database
schema**, so one company's data can't turn up in another's query even if a `WHERE` clause is
forgotten. What it costs is honest to state a schema change has to be replayed on every customer,
which is where the 182 tenant migrations come from, and why a deployment stops instead of running
new code against a database that hasn't caught up.
CRM French invoicing (Factur-X) Accounting with FEC export Shop Inventory Purchasing Planning Support Projects HR Training Blog Newsletter Chat Wiki & storage
Permissions are re-read from the database on every call rather than trusted from the session Meilisearch, MinIO, a mail server with webmail, self-hosted video and a Stripe Connect marketplace each run as their own container Not multi-region and not one database per client: a single Postgres holds them all, and scaling past one machine is a known open problem rather than a solved one.









Payment, security and compliance code is 11 % of the lines and 29 % of that estimate.
[](https://capibara.fr)
[](https://forgenet.fr)
|
### [] OPUS forgenet.fr
*The platform Forge Network runs on: client projects and invoicing, server hosting, software licensing and a store.*






**OPUS Cloud** rents out servers with a console, a web file manager and backups in the browser. A
Cloud Box behaves like a small VPS SSH, a persistent home directory, your own packages but it
isn't a virtual machine: the sandbox refuses the privileges a normal SSH daemon needs, so the box
ships its own lightweight root filesystem and SSH server instead. Docker doesn't run inside it and
only the home directory survives a rebuild. Both limits are on the page, not discovered after
signing up.
**Forge Licensing** issues the licence keys for the group's software. Every answer is signed, so an
application can verify a licence without calling home and a captured answer can't be replayed as a
valid one. Elipse RSAI runs on it.
Client workspace with quotes, invoices and instalment plans certification program (27 tracks 4 levels 5 real-project briefs) store with Stripe checkout and automatic licence delivery news feed with RSS







[](https://forgenet.fr)
[](https://console.forgenet.fr)
|
### [] Marcus marcusbot.fr
*A Discord bot that server owners extend themselves by drawing what they want, not by writing code.*




The usual bot features 93 commands, levels, moderation with an AI pass, premium tiers plus a
visual editor where a module is a diagram of blocks. Nothing is compiled: the editor saves a graph
and one interpreter walks it at runtime, so a server owner can build a ticket system or a role menu
without touching a line of TypeScript.
The hard part was never the editor. A button posted in a Discord channel outlives the process that
posted it, so every component is written to the database and restored when the bot boots without
that, each restart leaves dead buttons in old messages. That, and the fact that Discord's limits
(five buttons a row, five rows a message) have to be enforced in the editor rather than discovered
by the user when the message fails to send.








Least flattering number on this page, and it stays: 2.07 more lines were written than survive. The visual editor was rebuilt more than once.
[](https://marcusbot.fr)
|
### [] Elipse RSAI private shipped
*A field app for the health referents who follow French nurseries on the phone, in the car, with no signal and no account.*





A referent covers 5 to 30 nurseries and owes each one a number of hours set by decree, split by
quarter, and has to be able to prove it. Between two visits it gets written on a notepad, or not at
all, and reconstructed in December. The app logs a visit in three taps, keeps four counters per
nursery, and flags the quarter that is drifting the quarterly minimum is the one people miss, you
can reach the annual total and still be short on three quarters. It then writes the paperwork
visit reports, referral letters, care plans, annual review as PDFs, offline.
Nothing leaves the device, and that is a consequence rather than a preference. Records naming a
child are health data; hosting them in France requires a certification well out of reach for a
project this size, so the hosted version was dropped and the server removed entirely. The bill lands
on synchronisation: with no server to reconcile against, two devices sync directly over the local
wifi, or through an encrypted file on a USB stick when the nursery network keeps them apart which
it often does.
Local database with sensitive fields encrypted devices paired by QR code and a six-digit code read out loud PDF engine written in Dart, no network the only outbound call checks the licence and carries no data about anyone an expired licence drops the app to read-only and never holds the records hostage








17k lines of tests against 56k lines of app. The rules that decide whether someone is compliant are kept apart from the interface so they can be tested on their own.
[](https://forgenet.fr/telechargements/elipse)
|
###
[] Where those estimates come from
| Project | Lines counted | Effort | Rebuild cost | Written / kept |
|:---|---:|---:|---:|---:|
| **Capibara** | 430 122 | 189 person-months | ~2.46 M | 1.14 |
| **Marcus** | 112 364 | 67 person-months | ~867 k | 2.07 |
| **OPUS** | 103 925 | 53 person-months | ~687 k | 1.39 |
| **Elipse RSAI** | 83 471 | 33 person-months | ~434 k | 1.05 |
| **OpenCoperLock** | 28 147 | 12 person-months | ~155 k | 1.12 |
Not money anyone spent. These estimate what it would cost to rebuild each project from scratch with a senior team at the 2026 French senior rate (~650 /day) and they are computed rather than guessed. The script is tools/estimate.py and it runs on any of these repositories.
How. Every file is sorted into a zone payment, security, compliance, integrations, business logic, interface, data model, infrastructure, tests, docs and each zone carries its own lines-per-hour rate, because billing code with idempotency, webhooks and reconciliation does not cost what CRUD costs. Git history then adds what was written and later rewritten or thrown away, since abandoned work took the same time, and an overhead factor covers what leaves no file behind: architecture, deployment, operations.
A person-month is one person working full time for one month. It is a unit of effort, not a headcount 189 person-months is roughly what a team of ~46 delivers in four months.
Two caveats. The productivity assumption sits at the optimistic end of the published 1020 lines/hour range, so if these figures are wrong they are low rather than high. And on Capibara, payment, security and compliance code is 11 % of the lines but 29 % of the estimate which is exactly why a flat average would have been worthless here.
---
##
[] More public repositories
> Experiments, tools and weekend builds. Smaller, and that's the point.
#### [] [Gemini-Assistant](https://github.com/softpython2884/Gemini-Assistant)
A clipboard assistant that stays in the background. A hotkey grabs the selection from whatever
application is in front, sends it to Gemini and pastes the answer at the cursor falling back to
another model when a quota runs out.


[](https://github.com/softpython2884/Gemini-Assistant)
|
#### [] [NightSlavery](https://github.com/softpython2884/NightSlavery)
A Minecraft Fabric mod (1.21, Java 21) inspired by *Kenshi*: capture built as a state machine
free, knocked out, imprisoned, enslaved with cages, a control scepter, escapes, rebellions, and
gamerule switches so it can't be used to grief a server.


[](https://github.com/softpython2884/NightSlavery)
|
#### [] [Macro](https://github.com/softpython2884/Macro)
An older one. A console-style layer for the TV, navigable entirely with an Xbox controller, that
launches local games and media bridged to Windows through a Python hotkey listener.


[](https://github.com/softpython2884/Macro)
|
#### [] StreamDeck utilities
Gaming and office setups need different mice and different speakers. Two PowerShell scripts on one
key: **MouseMode** swaps the Windows pointer profile, **AudioSwitcher** changes the default output
*and* moves every running application onto the new device.

[](https://github.com/softpython2884/MouseMode)
[](https://github.com/softpython2884/AudioSwitcher)
|
Also in the lab
[](https://github.com/softpython2884/Betty)
[](https://github.com/softpython2884/SimuBourse)
[](https://github.com/softpython2884/StudyVerse)
[](https://github.com/softpython2884/CreepOS)
[](https://github.com/softpython2884/OpenMark-Blog)
[](https://github.com/softpython2884/Mana-Clash)
---
##
[] Custom Linux distribution unfinished, nothing to download
The least finished thing on this page, and the only one with no artifact behind it: no installer, no
release, no repository yet. The target is a distribution built against the bare kernel its own
window manager, session, package and file managers rather than a theme over an existing desktop,
aiming for Arch-level configurability without Arch-level setup.
It's here because it's where a large share of my time goes, not because it's usable. Treat it as a
statement of intent until there's something to install.
---
##
[] Tech Stack
**Languages**








**Frontend**





**Backend & Data**







**Systems & DevOps**






---
##
[] What I actually write








Counted across the eight repositories behind this page 717 526 lines, private ones included. Re-derive it with tools/languages.py. A GitHub language graph would only see the public repos, which is the smaller half.
---
##
[] Certified
[](https://forgenet.fr/verify/OPUS-2026-Z26F2D)






How to read these scores? Each score (out of 10) measures a concrete ability not theory learned by heart. It reflects the ability to write clean, maintainable code and to handle a production deployment autonomously. Assessments are carried out and approved by OPUS on the basis of real, delivered projects.
Verifiable at
forgenet.fr/verify/OPUS-2026-Z26F2D
---
##
[] Contact
[](https://forgenet.fr)
[](mailto:contact@forgenet.fr)
[](mailto:nightfury@nationquest.fr)
[](https://discord.com/users/nightfury_httyd)
[](https://ko-fi.com/nationquestproject)
[footer]