Everyone is welcome.

That includes people who have never sent a pull request. A typo fix, a better translation, a clear bug report and a new feature are all real contributions.

This page is a short version of CONTRIBUTING.md in the repository, which is the full guide. Please read the code of conduct first. It is short. If something is unclear, open an issue and ask: the question is useful too.

Build and run in four commands

You need Windows 10 or 11, Node.js, the Rust toolchain and the WebView2 runtime.

npm install
npm run build            # type-check and vite build (also builds the hook relay)
cargo check --workspace  # needs dist/ to exist, so run `npm run build` first
npm run tauri dev        # run the app

Two more commands help while you work:

npm test                 # the node --test suites
npm run fake-session     # a pretend agent session through the relay, while the app runs

npm run pack builds the installer into release/. It also builds the hardware helper, which needs the .NET 8 SDK. Nothing else needs it.

A map of the tree

  • crates/<feature>/: one Rust crate for each feature. crates/svc-<name>/: shared services (audio, media, capture, input and so on). crates/core/: what every feature uses.
  • src/features/<feature>/: the TypeScript side of each feature.
  • src-tauri/: the app host. The island window, the feature registry, settings, the tray, shortcuts and the base features.
  • src/ui/: the design tokens and components. src/island/, src/settings/, src/i18n/ and the rest: the shared page code.
  • hook/: the relay lintel-hook.exe that agent programs start on each event. helper/: the hardware helper lintel-hw.exe, the only part that runs as administrator.
  • tests/, scripts/ and docs/: the test suites, the generator and the checks, and the documents.

Inside the code, crate names keep an older prefix (notch-core, notch-feat-<id>). That is on purpose. Do not rename them.

A feature is one folder that can be switched off

  1. Pick a short id.Lower case with dashes, for example night-light.
  2. Run the generator.node scripts/new-feature.mjs night-light creates the crate (a feature that is off by default) and the folder src/features/night-light/. The app finds the feature by itself.
  3. Run cargo check --workspace once.It completes the lock file.
  4. Write the two sides.Rust in crates/night-light/src/lib.rs, the page in src/features/night-light/index.ts.
  5. Check your feature alone while you work.cargo check -p notch-feat-night-light and npx tsc --noEmit -p src/features/night-light.

A feature owns its two folders and nothing outside them, its CSS classes (they start with .f-<id>-), its words in its own strings.json, and its settings.

The rule that matters most: a feature that is off loads nothing. Everything starts in start and ends in stop: hooks, timers, threads, windows, subscriptions.

Add or fix a translation

Translations are very welcome, and you do not need to build the app to help.

  • The words of a feature live in src/features/<id>/strings.json. The words of the base app live in src/i18n/strings.json and src/i18n/extra.json.
  • Each entry is keyed by its English text and holds ten languages: English, Simplified Chinese, Hindi, Spanish, Arabic, French, Bengali, Brazilian Portuguese, Russian and Indonesian.
  • Placeholders in braces, such as {app} and {count}, stay exactly as they are. Move them to where they belong in your sentence.
  • To fix a translation, change the value for your language and leave the key alone.

Rules that are not negotiable

Each rule protects the person using Lintel.

  • Windows only. Lintel is made for Windows 10 and 11.
  • No telemetry and no account. Network calls go only to services the user configured.
  • Never act for the user without a click. Nothing is approved, sent or deleted without a clear yes. Nothing ever answers a permission card except the user’s own click.
  • Never block an agent program. If the app does not answer, the relay exits at once.
  • Never overwrite an agent’s settings file. Dated backup, merge, show the difference, write only after the user confirms.
  • Idle means idle. Prefer Windows events to polling, and pause any poller that nobody is watching.
  • Every feature can be turned off, and a feature that is off loads nothing.
  • Secrets live only in Windows Credential Manager. Never on disk, never in git.
  • The app runs without administrator rights. Only the hardware helper asks, and only after the user opts in.
  • No branding of the projects Lintel grew from in code, strings or assets. They are credited in NOTICE.md and the README.

Two smaller ones: keep the code minimal, and name the original file in a header comment when a file is largely ported from another project.

The design language in five lines

  • One look, dark everywhere.
  • Colours, sizes, radii and curves come only from the tokens in src/ui/tokens.css.
  • Buttons, switches, rows and cards come only from the shared components in src/ui/.
  • Animate transform and opacity, not width or height, and respect reduced motion.
  • Plain TypeScript, the DOM and Canvas. No UI framework.

What help is wanted most

The roadmap is the honest list of what version 1.0.0 leaves open, sorted by size. Some places to start:

  • Translations. Some newer lines are English only, and the lines of the Features page are not translated at all. If a line reads badly in your language, fix it.
  • Testing on other machines. Lintel was built and checked on one laptop with Windows 11. Reports from Windows 10, desktops, other display scalings and several displays are useful even when everything works.
  • Agent hooks on real installs. The hooks for Antigravity, Cursor, Muse and Hermes were never confirmed against a real install.
  • The voice assistant. It was checked mostly with recorded clips. It needs real voices, real rooms and real interruptions, and the wake phrase needs measuring with many voices.
  • Larger work. Code signing, mirroring notifications (it waits for a signed build), the island on a second display, and reading fans on more laptops.

Propose a change

  • For anything large, open an issue first. Small fixes can go straight to a pull request.
  • Keep pull requests small. One change each.
  • Write a description that stands alone. What changes for the user, why, how you tried it, and a screenshot for anything visible. Use made-up content in screenshots.
  • Run the four checks before you push.
npm run build
cargo check --workspace
npm test
node scripts/check-brand.mjs

A maintainer reads every pull request. Expect questions: they are about the code, not about you. A pull request that cannot be merged gets a reason.

Report a bug or a security problem

  • A bug. Open an issue on the issues page. Say what you did, what you expected, what happened, and your version of Windows.
  • A question or an idea. The discussions are open.
  • A security problem. Do not open a public issue. Use the private report form. SECURITY.md says what a good report holds. Never put a real key or a personal file in it.

Licence

Lintel is licensed under GPL-3.0-or-later. By sending a contribution you agree that it is licensed under the same terms, and you confirm that you have the right to send it. If you bring in code from another project, say where it comes from and under which licence, so that NOTICE.md can credit it.