-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathintro.html
More file actions
156 lines (147 loc) · 14.7 KB
/
Copy pathintro.html
File metadata and controls
156 lines (147 loc) · 14.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width,initial-scale=1.0"/>
<title>Next-level full-stack development — Ocsigen</title>
<meta property="og:image" content="https://ocsigen.org/img/ocsigen-badge-400.png"/>
<link rel="stylesheet" href="/css/style.css"/>
<link rel="stylesheet" href="/css/ocsigen-odoc.css"/>
<link rel="stylesheet" href="/css/wodoc.css"/>
<style>.page-header{background-color:rgba(0,0,0,0.2) !important;}</style>
<link rel="alternate" type="text/markdown" href="/intro.md"/>
</head>
<body class="odoc wodoc-page wodoc-home">
<!-- Shared site menu — THE single source of truth for the header, top menu and
drawer of EVERY Ocsigen doc page (vitrine + all projects). Canonical copy
lives here in ocsigen.github.io; each project's build fetches it. Injected
by `wodoc assemble --menu`. Holes filled by the tool (braces omitted here so
this comment is not itself rewritten by the hole-filler):
subproject the sub-project name shown next to the Ocsigen logo
(empty on the vitrine), via --subproject
leftnav the project's left navigation, expanded into BOTH the mobile
drawer (below) and the left column (in the page template),
via --leftnav
The current entry is highlighted by adding the `current` class to the
element carrying data-wodoc-page=<id>: --current on the vitrine (page id),
--menu-current in a project (the project id). Nothing is hardcoded here, so
this file is the ONLY place the menu is defined.
Links are the FINAL site paths (/<project>/, /<page>): the target layout
where each project is served at ocsigen.org/<project>/ — no transitional
/wodoc/ prefix. -->
<div class="page-header">
<p class="logo-ocsigen"><a href="/"><img src="/img/ocsigen-white.svg" alt="Ocsigen"/></a></p>
<div class="mainmenu">
<p class="mainmenu-home current" data-wodoc-page="githubio"><a href="/">Home</a></p>
<p class="mainmenu-doc" data-wodoc-page="tuto"><a href="/tuto/">Doc</a></p>
<p class="mainmenu-blog" data-wodoc-page="blog"><a href="/blog/">Blog</a></p>
<p data-wodoc-page="eliom"><a href="/eliom/">Eliom</a></p>
<p data-wodoc-page="js_of_ocaml"><a href="/js_of_ocaml/">Js_of_ocaml</a></p>
<p data-wodoc-page="ocsigenserver"><a href="/ocsigenserver/">Server</a></p>
<p data-wodoc-page="lwt"><a href="/lwt/">Lwt</a></p>
<p data-wodoc-page="tyxml"><a href="/tyxml/">Tyxml</a></p>
<p data-wodoc-page="ocsigen-start"><a href="/ocsigen-start/">Start</a></p>
</div>
<form id="googlesearch" action="https://google.com/search">
<input name="q" id="gsearch-box" placeholder="Search using Google"/>
<label for="gsearch-box"><img src="/img/search.svg" alt="" id="gsearch-icon"/></label>
<input type="submit" id="gsearch-submit" onclick="document.getElementById('gsearch-box').value += ' site:ocsigen.org';"/>
</form>
<aside class="how-drawer">
<input id="how-drawer-toggle" type="checkbox"/>
<label for="how-drawer-toggle" id="how-drawer-label"><span class="how-drawer-icon"></span></label>
<nav class="how-drawer-content">
<ul class="drawermainmenu">
<li class="drawermainmenu-home current" data-wodoc-page="githubio"><a href="/">Home</a></li>
<li class="drawermainmenu-doc" data-wodoc-page="tuto"><a href="/tuto/">Doc</a></li>
<li class="drawermainmenu-project" data-wodoc-page="eliom"><a href="/eliom/">Eliom</a></li>
<li class="drawermainmenu-project" data-wodoc-page="js_of_ocaml"><a href="/js_of_ocaml/">Js_of_ocaml</a></li>
<li class="drawermainmenu-project" data-wodoc-page="ocsigenserver"><a href="/ocsigenserver/">Server</a></li>
<li class="drawermainmenu-project" data-wodoc-page="lwt"><a href="/lwt/">Lwt</a></li>
<li class="drawermainmenu-project" data-wodoc-page="tyxml"><a href="/tyxml/">Tyxml</a></li>
<li class="drawermainmenu-project" data-wodoc-page="ocsigen-toolkit"><a href="/ocsigen-toolkit/">Toolkit</a></li>
<li class="drawermainmenu-project" data-wodoc-page="ocsigen-start"><a href="/ocsigen-start/">Start</a></li>
<li class="drawermainmenu-project" data-wodoc-page="ocsipersist"><a href="/ocsipersist/">Ocsipersist</a></li>
<li class="drawermainmenu-project" data-wodoc-page="reactiveData"><a href="/reactiveData/">ReactiveData</a></li>
<li class="drawermainmenu-project" data-wodoc-page="ocsigen-i18n"><a href="/ocsigen-i18n/">i18n</a></li>
<li class="drawermainmenu-project" data-wodoc-page="wodoc"><a href="/wodoc/">Wodoc</a></li>
<li class="drawermainmenu-page" data-wodoc-page="projects"><a href="/projects">Other projects</a></li>
<li class="drawermainmenu-page" data-wodoc-page="papers"><a href="/papers">Research papers</a></li>
<li class="drawermainmenu-page" data-wodoc-page="credits"><a href="/credits">Who does Ocsigen?</a></li>
<li class="drawermainmenu-page" data-wodoc-page="contributing"><a href="/contributing">Contributing</a></li>
<li class="drawermainmenu-page" data-wodoc-page="blog"><a href="/blog/">Blog</a></li>
<li class="drawermainmenu-page" data-wodoc-page="install"><a href="/install">Installation</a></li>
<li class="drawermainmenu-page"><a href="https://github.com/ocsigen">Source code</a></li>
</ul>
<!-- On mobile the left column is hidden; its menu lives here in the burger
(.how-doctree, shown only on narrow screens), as the old site did.
Empty on the vitrine; the leftnav hole is filled (with the same
fragment as the left column) only on project pages. -->
<nav class="how-doctree"></nav>
</nav>
</aside>
</div>
<div class="main-page-section main-page-section-header"><h1 id="next-level-full-stack-development">Next-level full-stack development</h1>
<h2 id="write-your-app-once-—-deploy-on-web,-android,-ios">Write your app once — deploy on Web, Android, iOS</h2><h2 id="unique-multi-tier-architecture:-client-and-server-in-a-single-program">Unique multi-tier architecture: client and server in a single program</h2><h2 id="type-safe-from-database-to-ui-—-catch-errors-before-they-happen">Type-safe from database to UI — catch errors before they happen</h2><h2 id="runs-natively-in-webassembly-(with-javascript-fallback)">Runs natively in WebAssembly (with JavaScript fallback)</h2><p><a href="/tuto/latest/basics.html" class="main-button">Get started now!</a></p></div><div class="main-page-section main-page-section-partners"><ul><li><a class="sponsormain" href="https://www.dailymotion.com/video/x82alm8"><img class="logo-besport" src="/img/besport.svg" alt="Be Sport"/></a></li><li><a href="https://tarides.com"><img class="logo-tarides" src="/img/tarides.svg" alt="Tarides"/></a></li><li><a href="https://www.janestreet.com"><img class="logo-janestreet" src="/img/janestreet.svg" alt="Jane Street"/></a></li><li><a href="http://www.univ-paris-diderot.fr"><img class="logo-diderot" src="/img/diderot.png" alt="Université Paris Diderot"/></a></li><li><a href="http://www.cnrs.fr"><img class="logo-cnrs" src="/img/cnrs.png" alt="CNRS"/></a></li><li><a href="http://www.irif.fr"><img class="logo-irif" src="/img/irif.svg" alt="IRIF"/></a></li><li><a href="http://www.irill.org"><img class="logo-irill" src="/img/irill.png" alt="IRILL"/></a></li><li><a href="http://www.inria.fr"><img class="logo-inria" src="/img/inria.png" alt="Inria"/></a></li><li><a href="http://www.systematic-paris-region.org"><img class="logo-systematic" src="/img/systematic.png" alt="Systematic"/></a></li></ul></div><div class="main-page-section main-page-section-multitier"><div class="main-page-section-content"><h2 id="eliom">Eliom</h2><h3 id="client-and-server-code-that-compile-together" class="subtitle">Client and server code that compile together</h3><div class="horiz-blocks"><p>Eliom lets you write <b>client and server code in the same file, and as a single program</b>. The compiler checks that they stay consistent — <b>no more broken APIs</b>!</p><p>A single codebase compiles to a <b>Web app</b> and to <b>mobile apps</b> for iOS and Android.</p></div><div class="main-page-section-multitier-schema"><img class="main-page-schema-multitier" src="/img/multitier-multiplatform.svg" alt="Multi-tier"/></div></div></div><div class="main-page-section main-page-section-js_of_ocaml"><div class="main-page-section-content"><h2 id="js_of_ocaml-/-wasm_of_ocaml">Js_of_ocaml / Wasm_of_ocaml</h2><h3 id="your-ocaml-code,-running-in-the-browser-at-near-native-speed" class="subtitle">Your OCaml code, running in the browser at near-native speed</h3><div class="horiz-blocks"><p>Compile any OCaml program to <b>JavaScript</b> or <b>WebAssembly</b>. WASM delivers near-native performance; JS ensures compatibility with all browsers.</p><p>Works directly from OCaml bytecode — <b>use any OCaml library without recompiling</b>. Seamless interop with JavaScript libraries.</p></div><div class="main-page-section-js_of_ocaml-schema"><pre class="language-ocaml main-page-section-js_of_ocaml-ocaml darkcode"><code>let fib num =
let rec aux num prec2 prec =
if num = 0
then prec
else
aux (num - 1) prec (prec + prec2)
in aux num 1 1</code></pre><div><pre class="language-javascript main-page-section-js_of_ocaml-js darkcode"><code>function fib(num)
{var num$0=num,prec2=1,prec=1;
for(;;)
{if(0 === num$0)return prec;
var
prec$0=prec + prec2 | 0,
num$1=num$0 - 1 | 0,
num$0=num$1,
prec2=prec,
prec=prec$0;
continue}}</code></pre><pre class="language-javascript main-page-section-js_of_ocaml-js darkcode"><code>function(d){var b=d,c=1,a=1;for(;;){if(0===b)return a;var b=b-1|0,e=a+c|0,c=a,a=e;continue}};</code></pre></div><div class="main-page-section-js_of_ocaml-arrow1"><p>➔</p></div><div class="main-page-section-js_of_ocaml-arrow2"><p>➔</p></div></div></div></div><div class="main-page-section main-page-section-projects"><div class="main-page-section-content"><h2 id="main-projects">Main projects</h2></div><div class="main-page-projects"><a class="main-page-project-link" href="/js_of_ocaml/"><div class="main-page-project"><h3 id="js_of_ocaml">Js_of_ocaml</h3><p>Compile OCaml to JS and WebAssembly. Run in any browser.</p></div></a><a class="main-page-project-link" href="/eliom/"><div class="main-page-project"><h3 id="eliom_2">Eliom</h3><p>Write client and server as one program. Deploy to Web and mobile.</p></div></a><a class="main-page-project-link" href="/ocsigenserver/"><div class="main-page-project"><h3 id="server">Server</h3><p>Production-ready Web server with native OCaml integration.</p></div></a><a class="main-page-project-link" href="/lwt/"><div class="main-page-project"><h3 id="lwt">Lwt</h3><p>Concurrent programming made simple — no callback hell.</p></div></a><a class="main-page-project-link" href="/tyxml/"><div class="main-page-project"><h3 id="tyxml">Tyxml</h3><p>Type-safe HTML/SVG generation. Invalid markup won't compile.</p></div></a><a class="main-page-project-link" href="/ocsigen-toolkit/"><div class="main-page-project"><h3 id="ocsigen-toolkit">Ocsigen Toolkit</h3><p>Ready-to-use UI widgets for Web and mobile apps.</p></div></a><a class="main-page-project-link" href="/ocsigen-start/"><div class="main-page-project"><h3 id="start">Start</h3><p>Complete starter app with users, notifications, and mobile support.</p></div></a></div></div><div class="main-page-section wodoc-home-blog"><div class="main-page-section-content"><h2 id="from-the-blog">From the blog</h2><ul class="wodoc-blog-list">
<li class="wodoc-blog-card">
<a class="wodoc-blog-title" href="blog/posts/why-ocsigen-stays-on-lwt-for-now.html">Why Ocsigen decided not to switch from Lwt to Eio (for now)</a>
<p class="wodoc-blog-meta">2026-07-01 — Vincent Balat</p>
<p class="wodoc-blog-excerpt">Through 2025 we migrated the entire Ocsigen stack from Lwt to Eio. The migration compiles and the test suite passes, and yet we have decided to stay on Lwt for now. This post explains the two obstacles that stopped us: the loss of function …</p>
</li>
<li class="wodoc-blog-card">
<a class="wodoc-blog-title" href="blog/posts/ocsipersist-2.1.0.html">Ocsipersist 2.1.0: type-safe persistence with Deriving</a>
<p class="wodoc-blog-meta">2026-06-23 — The Ocsigen team</p>
<p class="wodoc-blog-excerpt">Ocsipersist 2.1.0 is out. The headline is a new, type-safe way to store your data: persistent references, stores and tables can now be serialised with Deriving_Json instead of Marshal. The data is human-readable in the database and stable a…</p>
</li>
<li class="wodoc-blog-card">
<a class="wodoc-blog-title" href="blog/posts/status-of-the-ocsigen-project.html">Ocsigen in 2026: what we're working on</a>
<p class="wodoc-blog-meta">2026-06-19 — The Ocsigen team</p>
<p class="wodoc-blog-excerpt">What are we actually working on these days? Faster Wasm compilation, a new documentation toolchain, hierarchical module names, mobile through Capacitor, AI coding skills... Here is an honest look at the state of Ocsigen in 2026: what is in …</p>
</li>
<li class="wodoc-blog-card">
<a class="wodoc-blog-title" href="blog/posts/welcome-to-the-ocsigen-blog.html">A new home for the Ocsigen blog</a>
<p class="wodoc-blog-meta">2026-06-14 — The Ocsigen team</p>
<p class="wodoc-blog-excerpt">The Ocsigen blog is back, and it is now built like the rest of the Ocsigen website: with wodoc, our odoc-based static site generator. Each post is a plain .mld file — the same lightweight markup we use for the manuals and the API document…</p>
</li>
<li class="wodoc-blog-card">
<a class="wodoc-blog-title" href="blog/posts/documenting-ocaml-projects-with-wodoc.html">Documenting OCaml projects with wodoc</a>
<p class="wodoc-blog-meta">2026-06-07 — The Ocsigen team</p>
<p class="wodoc-blog-excerpt">wodoc turns .mld and .mli sources into a complete, styled website — not just API documentation. The very site you are reading is built with it.</p>
</li>
</ul>
<p><a href="/blog/" class="wodoc-home-blog-more">More posts →</a></p></div></div>
<div class="main-page-section main-page-section-about">
<div class="main-page-section-content">
<ul>
<li><a href="credits.html">Who does Ocsigen?</a></li>
<li><a href="papers.html">Research papers</a></li>
<li><a href="projects.html">All the projects</a></li>
<li><a href="contributing.html">Contributing</a></li>
<li><a href="/blog-archive/">Blog</a></li>
<li><a href="install.html">Installation</a></li>
<li><a href="https://github.com/ocsigen">Source code</a></li>
</ul>
</div>
</div>
<!-- shared Ocsigen highlighter: odoc's bundled highlight.js + wodoc-highlight.js
(Ocsigen OCaml extensions + highlightAll), same engine as the blog and docs. -->
<script src="/doc/highlight.pack.js"></script>
<script src="/doc/wodoc-highlight.js"></script>
</body>
</html>