{"id":32798287,"url":"https://github.com/fkkarakurt/nerve","last_synced_at":"2026-06-01T00:00:48.345Z","repository":{"id":158716488,"uuid":"472820720","full_name":"fkkarakurt/Nerve","owner":"fkkarakurt","description":"Zero-dependency neural network in a single C header. Copy nerve.h, compile, done.   Adam · ReLU · Dropout · Xavier/He · Neuroevolution game AI (Snake · Pong · Flappy Bird).   No build system. No dependencies. Runs on Linux, macOS, Windows, and bare-metal.","archived":false,"fork":false,"pushed_at":"2026-05-28T12:12:19.000Z","size":26613,"stargazers_count":46,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-28T13:11:03.323Z","etag":null,"topics":["adam-optimizer","ansi-c","application","artificial-intelligence","backpropagation","c","c99","deep-learning","embedded-systems","game-ai","header-only","machine-learning","mlp","neural-network","neural-network-library","neural-networks","reinforcement-learning","single-header"],"latest_commit_sha":null,"homepage":"https://github.com/fkkarakurt/Nerve/wiki","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fkkarakurt.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"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":"2022-03-22T15:07:37.000Z","updated_at":"2026-05-28T12:12:24.000Z","dependencies_parsed_at":"2023-12-09T19:26:38.913Z","dependency_job_id":"70879513-ac43-4987-a216-b20048e452a8","html_url":"https://github.com/fkkarakurt/Nerve","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/fkkarakurt/Nerve","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fkkarakurt%2FNerve","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fkkarakurt%2FNerve/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fkkarakurt%2FNerve/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fkkarakurt%2FNerve/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fkkarakurt","download_url":"https://codeload.github.com/fkkarakurt/Nerve/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fkkarakurt%2FNerve/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33753925,"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-05-31T02:00:06.040Z","response_time":95,"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":["adam-optimizer","ansi-c","application","artificial-intelligence","backpropagation","c","c99","deep-learning","embedded-systems","game-ai","header-only","machine-learning","mlp","neural-network","neural-network-library","neural-networks","reinforcement-learning","single-header"],"created_at":"2025-11-06T00:06:11.824Z","updated_at":"2026-06-01T00:00:48.340Z","avatar_url":"https://github.com/fkkarakurt.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Nerve\n\n\u003cimg src=\"assets/nerve-flappy.gif\" width=\"720\" alt=\"Flappy Bird AI learning in real-time via neuroevolution\" /\u003e\n\n**The modern AI stack — in pure C you can read.**\n\n*A real Transformer, on-device learning, and sentence embeddings.\nZero dependencies. One header. Runs from a microcontroller to a browser tab.*\n\n[![CI](https://github.com/fkkarakurt/nerve/actions/workflows/ci.yml/badge.svg)](https://github.com/fkkarakurt/nerve/actions/workflows/ci.yml)\n[![License: GPL-3.0](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](LICENSE)\n[![Language](https://img.shields.io/badge/Language-C99-orange.svg)](nerve.h)\n[![Single Header](https://img.shields.io/badge/integration-single%20header-purple.svg)](nerve.h)\n[![Zero Deps](https://img.shields.io/badge/dependencies-none-brightgreen.svg)]()\n[![Version](https://img.shields.io/badge/version-2.1.0-informational.svg)]()\n[![npm](https://img.shields.io/npm/v/@fkkarakurt/nerve?color=cb3837\u0026logo=npm\u0026label=npm)](https://www.npmjs.com/package/@fkkarakurt/nerve)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-ff69b4.svg)](https://github.com/fkkarakurt/nerve/pulls)\n\n[![Platforms](https://img.shields.io/badge/platforms-Linux%20%7C%20macOS%20%7C%20Windows%20%7C%20embedded-lightgrey.svg)]()\n\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.20432307.svg)](https://doi.org/10.5281/zenodo.20432307)\n\n\u003e 📖 [**Documentation \u0026 Scientific Manual**](https://github.com/fkkarakurt/Nerve/blob/main/nerve_manual.pdf)\n\n\u003c/div\u003e\n\n---\n\n## Why Nerve?\n\nMost neural network libraries are either massive frameworks or toy implementations.\nNerve sits in between: small enough to read in an afternoon, correct enough for real work,\nportable enough to run anywhere C compiles — including bare-metal.\n\n|  | Nerve | TensorFlow Lite | tinyML | plain C |\n|--|:-----:|:---------------:|:------:|:-------:|\n| Zero dependencies | ✅ | ❌ | ❌ | ✅ |\n| Single file | ✅ | ❌ | ❌ | — |\n| Adam optimizer | ✅ | ✅ | ❌ | — |\n| Dropout | ✅ | ✅ | ❌ | — |\n| ANSI C89 compatible | ✅ | ❌ | ❌ | ✅ |\n| \u003c 1 500 lines | ✅ | ❌ | ❌ | — |\n\n---\n\n## Beyond a library — the modern AI stack, in C you can read\n\nNerve started as a multilayer perceptron. It now implements, from scratch and\nwith zero dependencies, the pieces the giants run on — small enough to read,\nportable enough to run on a 2017 laptop or a browser tab. No GPU, no Python at\nruntime, no cloud, no per-token bill.\n\n| It can… | How | Proof |\n|---------|-----|-------|\n| **Run a real 1.1B-parameter LLM** | decoder Transformer (RMSNorm, RoPE, GQA + KV-cache, SwiGLU, int8) in one header | TinyLlama-1.1B generates coherent text at ~3 tok/s on a laptop CPU — `studies/infer` |\n| **Learn from *you*, on-device** | a frozen model's features + a tiny head trained with Nerve's own autodiff | personalises to your categories in ~40 ms, privately — `studies/infer/learn.c` |\n| **Understand meaning** | a MiniLM BERT-style sentence encoder (int8, ~22 MB) | `hamburger → food`, `running shoes → fitness`; semantic search by meaning — `studies/embed` |\n| **Recognise handwriting** | the 784-128-10 MLP trained on MNIST | ~97% test accuracy — `studies/mnist` |\n| **Run in your browser** | the same C compiled to a **65 KB** WebAssembly module | generate · teach · search · draw a digit — all client-side, nothing leaves the page — `web/` |\n| **Differentiate anything** | tape-based reverse-mode autodiff in ~200 lines | define a layer without hand-deriving its gradient — `studies/autograd` |\n\nEvery capability ships with a runnable proof, and every algorithm is grounded\nin its paper — see [`docs/REFERENCES.md`](docs/REFERENCES.md). Nerve does not try\nto out-scale the giants; it earns its place by being the most **readable,\nportable, reproducible** implementation of the same ideas.\n\n---\n\n## Use it from JavaScript / TypeScript\n\nThe same engine, compiled to WebAssembly, ships on npm — for the browser or Node.\nNo server, no GPU, no API key; it runs on the user's machine.\n\n[![npm](https://img.shields.io/npm/v/@fkkarakurt/nerve?color=cb3837\u0026logo=npm\u0026label=npm)](https://www.npmjs.com/package/@fkkarakurt/nerve)\n\n```sh\nnpm install @fkkarakurt/nerve\n```\n\n```js\nimport Nerve from \"@fkkarakurt/nerve\";\n\nconst nerve = await Nerve.load();\n\n// 1. generate text (streams token by token)\nnerve.generate(\"Once upon a time\", { onToken: t =\u003e process.stdout.write(t) });\n\n// 2. meaning similarity (cosine, -1..1)\nnerve.similarity(\"a puppy on the grass\", \"a young dog in the park\"); // ~0.5\n\n// 3. learn your own categories, then classify\nnerve.teach([\n  { text: \"schedule a meeting tomorrow\", label: \"calendar\" },\n  { text: \"i want to eat a hamburger\",   label: \"food\" },\n  { text: \"go for a run in the park\",    label: \"fitness\" },\n]);\nconsole.log(nerve.classify(\"i want a pizza\")); // { label: \"food\", confidence: 0.7, ... }\n\n// 4. semantic search over your own notes — index() first, then search()\nnerve.index([\n  \"The capital of France is Paris.\",\n  \"Coffee contains caffeine, a stimulant.\",\n]);\nconsole.log(nerve.search(\"what keeps me awake?\")); // [{ text: \"Coffee contains...\", score }]\n```\n\n\u003e **Try it live in your browser** — text generation, on-device learning, semantic\n\u003e search and handwritten-digit recognition, all client-side: *(demo link coming\n\u003e with the docs site)*.\n\n---\n\n## Quick Start\n\n### 3-line API\n\n```c\n#define NERVE_IMPLEMENTATION\n#include \"nerve.h\"\n\nnerve_t *net = nerve_new(\"2-\u003e4-\u003e1\");   /* Adam + Tanh + Xavier — sensible defaults */\nnerve_fit(net, X, y, 4, 5000);        /* train                                      */\nnerve_free(net);\n```\n\n```\ngcc -O2 main.c -o main -lm\n```\n\nNo CMake. No vcpkg. No `apt install`. Just `gcc` and `nerve.h`.\n\n### Full-control API\n\n```c\n#define NERVE_IMPLEMENTATION\n#include \"nerve.h\"\n\nnetwork_t *net = net_allocate(3, 2, 8, 1);\nnet_set_optimizer(net,      NERVENET_OPTIMIZER_ADAM);\nnet_set_activation(net,     NERVENET_ACTIVATION_TANH);\nnet_initialize_xavier(net);\nnet_set_learning_rate(net,  0.01f);\nnet_set_l2_lambda(net,      1e-4f);\n\nfor (int i = 0; i \u003c 5000; i++) {\n    int j = i % 4;\n    net_compute(net, in + j*2, NULL);\n    net_compute_output_error(net, tgt + j);\n    net_train(net);\n}\nnet_free(net);\n```\n\n---\n\n## Benchmark — SGD vs Adam\n\nResults on boolean functions (7 independent runs each):\n\n**XOR (2-4-1 network)**\n\n| Configuration           | Converged | Avg Iters | Speedup     |\n|-------------------------|:---------:|----------:|:-----------:|\n| SGD / Uniform / Sigmoid | 7 / 7     |    22 285 | 1×          |\n| SGD / Xavier  / Tanh    | 7 / 7     |    13 647 | 1.6×        |\n| Adam / Xavier / Sigmoid | 7 / 7     |     2 601 | **8.6×**    |\n| Adam / Xavier / Tanh    | 7 / 7     |     2 183 | **10.2×**   |\n| Adam / He / ReLU        | 5 / 7     |     2 064 | **10.8×**   |\n\n**4-Class Identity (4-6-4 network)**\n\n| Configuration           | Converged | Avg Iters | Speedup     |\n|-------------------------|:---------:|----------:|:-----------:|\n| SGD / Uniform / Sigmoid | 7 / 7     |    22 689 | 1×          |\n| Adam / He / ReLU        | 7 / 7     |     1 214 | **18.7×**   |\n\n---\n\n## Algorithm Reference\n\n| Component | Options | Reference |\n|-----------|---------|-----------|\n| Optimizer | SGD + momentum | Rumelhart et al., 1986 |\n| Optimizer | **Adam** ★ | Kingma \u0026 Ba, 2015 |\n| Init | Xavier / Glorot | Glorot \u0026 Bengio, 2010 |\n| Init | **He** ★ | He et al., 2015 |\n| Activation | Sigmoid, Tanh, **ReLU** ★, Leaky ReLU | — |\n| Regularisation | L2 weight decay | — |\n| Regularisation | **Dropout** (inverted) | Srivastava et al., 2014 |\n\n★ recommended combination for hidden layers\n\n---\n\n## Examples\n\nEleven standalone `.c` files — each compiles with a single `gcc` command.\n\n**Core examples**\n\n| # | File | Result |\n|---|------|--------|\n| 01 | `01_xor.c` | XOR in \u003c 2 000 iterations (Adam) |\n| 02 | `02_sine.c` | sin(x) approximation, MSE \u003c 0.00002 |\n| 03 | `03_iris.c` | Iris classification **96.7%** test accuracy |\n| 05 | `05_regression.c` | Auto MPG regression, RMSE **3.63 mpg** |\n| 06 | `06_dropout.c` | Dropout generalisation +7 pp over no-dropout |\n| 07 | `07_spiral.c` | 3-class non-linear spiral **98.3%** accuracy |\n| 08 | `08_model_io.c` | Save → load → fine-tune checkpoint workflow |\n| 09 | `09_predictive_maintenance.c` | Live sensor monitor, 100% test accuracy |\n\n**Terminal AI games** — neural networks that learn to play, live in your terminal\n\n| # | File | Architecture | Algorithm |\n|---|------|-------------|-----------|\n| 10 | `10_snake_ai.c` | 11 → 16 → 3 | Neuroevolution, pop 100 |\n| 11 | `11_pong_ai.c` | 5 → 8 → 1 | Neuroevolution vs rule-based bot |\n| 12 | `12_flappy_ai.c` | 5 → 8 → 1 | 20 birds evolving simultaneously |\n\n---\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eExample outputs\u003c/b\u003e\u003c/summary\u003e\n\n### XOR\n\n```\n$ gcc -O2 examples/01_xor.c -o xor -lm \u0026\u0026 ./xor\n\nNerve 2.0.0 — XOR Example\nArchitecture: 2-4-1 | Adam | Xavier Init\n\nResults after 1847 epochs:\n  [1, 1]   0.0   →   0.0031  OK\n  [1, 0]   1.0   →   0.9968  OK\n  [0, 1]   1.0   →   0.9967  OK\n  [0, 0]   0.0   →   0.0028  OK\n```\n\n### Iris Classification\n\n```\n$ gcc -O2 examples/03_iris.c -o iris -lm \u0026\u0026 ./iris\n\n  Final test accuracy: 96.7%\n\n  Confusion Matrix:\n                   setosa  versicolor  virginica\n  setosa                8           0          0\n  versicolor            0          13          0\n  virginica             0           0          9\n```\n\n### 3-Class Spiral\n\n```\n$ gcc -O2 examples/07_spiral.c -o spiral -lm \u0026\u0026 ./spiral\n\n  Final Test Accuracy: 98.3%  (59 / 60)\n\n  +--------------------------------------------------------------+\n  |XXXXXXXXXXXX..................................................|\n  |XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX........................|\n  |XXXXXXXXXXXXXXXXXXXXXXXXXOOOOOOOOOOXXXXXXXXXXX................|\n  |XXXXXXXXXXOOOOOOO........XXXX.......OOOOOOXXXXXXXXX...........|\n  |OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO|\n  +--------------------------------------------------------------+\n```\n\n### Predictive Maintenance\n\n```\n  Reading  1   → [  OK  ] NORMAL    99.9%\n  Reading  5   → [ WARN ] WARNING   98.8%\n  Reading  8   → [ CRIT ] CRITICAL  97.3%\n  Reading 11   → [FAULT ] FAULT     99.5%\n```\n\n\u003c/details\u003e\n\n---\n\n## API Reference\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eEasy API\u003c/b\u003e\u003c/summary\u003e\n\n```c\n/* Create */\nnerve_t *net = nerve_new(\"2-\u003e8-\u003e1\");          /* Adam + Tanh + Xavier */\n\nnerve_config_t cfg = nerve_default_config();\ncfg.lr      = 0.005f;\ncfg.dropout = 0.2f;\nnerve_t *net = nerve_new_ex(\"4-\u003e32-\u003e3\", \u0026cfg);\n\n/* Train */\nnerve_fit(net, X, y, n_samples, epochs);\nnerve_fit_verbose(net, X, y, n_samples, epochs, 100);\n\n/* Evaluate */\nfloat acc = nerve_score(net, X, y, n_samples);\nnerve_predict(net, x, output);\nint   cls = nerve_classify(net, x);\n\n/* Persist */\nnerve_save(net, \"model.net\");\nnerve_t *loaded = nerve_load(\"model.net\");\n\nnerve_free(net);\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eCore API\u003c/b\u003e\u003c/summary\u003e\n\n```c\n/* Allocate */\nnetwork_t *net = net_allocate(3, 64, 128, 10);\nnet_free(net);\n\n/* Configure */\nnet_set_activation(net,     NERVENET_ACTIVATION_TANH);\nnet_set_optimizer(net,      NERVENET_OPTIMIZER_ADAM);\nnet_initialize_xavier(net);\nnet_set_learning_rate(net,  0.01f);\nnet_set_momentum(net,       0.9f);\nnet_set_l2_lambda(net,      1e-4f);\nnet_set_dropout(net,        0.2f);\n\n/* Train — one sample */\nnet_compute(net, input, NULL);\nnet_compute_output_error(net, target);\nnet_train(net);\n\n/* Train — shuffled epoch */\nfloat mse = net_train_epoch(net, inputs, targets,\n                             n_samples, n_inputs, n_outputs, batch_size);\n\n/* Inference */\nfloat out[10];\nnet_compute(net, input, out);\nint   label = net_classify(net, input);\nfloat acc   = net_compute_accuracy(net, inputs, targets, n, n_in, n_out);\n\nint cm[9] = {0};\nnet_confusion_matrix(net, inputs, targets, n, n_in, n_out, 3, cm);\n\n/* Persist */\nnet_save(net,  \"model.net\");   network_t *net = net_load(\"model.net\");\nnet_bsave(net, \"model.bin\");   network_t *net = net_bload(\"model.bin\");\n```\n\n\u003e After loading, re-apply `net_set_activation()` and `net_set_optimizer()`.\n\n\u003c/details\u003e\n\n---\n\n## Building\n\n```bash\n# All examples (Linux / macOS)\nmake -C examples\n\n# Terminal games only\nmake -C examples games\n\n# CMake (Linux / macOS / Windows)\ncmake -B build \u0026\u0026 cmake --build build\n\n# Individual example\ngcc -O2 examples/01_xor.c -o xor -lm\n```\n\n## Academic foundations\n\nNerve is a from-scratch implementation of established results, written to be\nread. Every component — attention, RoPE, RMSNorm, SwiGLU, GELU, BERT-style\nencoders, Adam, dropout, autodiff, int8 quantization — is grounded in its\noriginal paper in [`docs/REFERENCES.md`](docs/REFERENCES.md). The contribution is\nreadability, portability and reproducibility, not new science.\n\n## Citation\n\n```bib\n@software{nerve,\n  author       = {Fatih Küçükkarakurt},\n  title        = {{Nerve: Technical Reference Manual — A Zero-Dependency Single-Header Multilayer Perceptron Library for ANSI C}},\n  year         = 2026,\n  publisher    = \"Nerve Developer\",\n  doi          = {10.5281/zenodo.20432307},\n  url          = {https://doi.org/10.5281/zenodo.20432307}\n}\n```\n\n---\n\n## License\n\nCopyright (C) 2026 Fatih Küçükkarakurt\n\nReleased under the [GNU General Public License v3.0](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffkkarakurt%2Fnerve","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffkkarakurt%2Fnerve","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffkkarakurt%2Fnerve/lists"}