every language + every system

Citrine Programming Language

With Citrine you can easily create apps and games in your native language on any computer (Linux, Windows, Mac etc..) and run them on any device, mobile phone, game console or the web. Share with your friends everywhere! * coming soon...

Latest News

XMAS Demo 2023
Dutch PDF book now available
Citrine/UZ Update
Roadmap 2024: Media plugin
Pre-order the Citrine Book!
French homepage! (thanks Mario Périard)
Translation Kit Update
Citrine 0.9.5 Sorghvliet released!
More news »

Note: This website is also served over non-HTTPS because some visitors have to rely on caching proxies due to poor internet connectivity in their countries.





Write code in your own beautiful native language without foreign keywords or archaic ASCII symbols.



Just ~5 writing rules. No special syntax for if-then/for/while. No classes, data types etc...



No more awkward sublanguages of the past like regex, HTML or SQL. Just one language.



Citrine is very easy to learn, you create a program by sending messages to objects. There are 3 types of messages: unary (no arguments), binary (one argument) and keyword messages (one or more arguments),
here's how:

☞ x ≔ ‘Hello’ length.
☞ x ≔ 3 + 7.
☞ x ≔ Number between: 0 and: 10.

We use to declare a new variable. In the second example we send a message +7 to 3, the resulting object will be 10. There is no need for if, while or for statements, to execute code conditionally send true: to a boolean, to run code in a loop, multiply the task by sending ×:

(x ≥ y) true: { ✎ write: ‘buy!’. }.
{ :i ✎ write: i. } × 3.
{ x add: 1. } while: { ↲ x < 9. }.

You can write Citrine in your native language, so, for instance, in Dutch, the third example looks like this:

{ x optellen: 1. }
zolang: { ↲ x < 9. }.

There is no special syntax needed for string interpolation, just send a non-defined message to a string to replace the word specified by the message with the argument:

‘Hola señor!’ señor: ‘Don Quijote’.
Hola Don Quijote!

To create your own object, send new to the main Object, you can also use other objects as a prototype. You can add new logic to all objects with on:do:, even existing ones. There are no classes.

☞ y ≔ Number new.
y on: ‘double’ do: { ↲ ⛏ × 2. }.

Note that refers to the object itself. To store a value as an object property use: , properties are only accessible from within the object itself and its derivatives.

cat on: ‘name:’ do: { :me
	⚿ name ≔ me.

Apart from a few details, that's basically all there is to it! Now you know Citrine! For more examples, open the learn-by-example manual, which is available for all languages supported by Citrine! * Translated manual available


Citrine is a localized scripting language. For some languages, we have to rely on machine translations because we haven't found translators yet. We appreciate any help! All natural languages are welcome**, even if they are not very common (EGIDS-status 6). ** Artificial languages, fantasy languages, private languages and other non-natural languages will not be included but you are free to fork the project of course.
Improve Translations


Citrine Online Store


Programming with Abstraction & Objects in Citrine is a book that covers the core language features and includes lots of examples as well as ~40 exercises. Available in: Dutch, English and Russian.

BUY e-BOOK BUY PAPERBACK (coming soon)


COMING SOON! Export your Citrine app/game to your smartphone, game console or any other platform!

BUY Export (coming soon)


Do you wish to embed Citrine as a mini language into your business application? That is possible of course! Feel free to contact me to explore the possibilities!


Citrine is free and open source, licensed BSD. Download the latest version of Citrine and have fun!

Download Citrine 0.9.5 or grab the source...

Free Extra Tools & Language Supplements Download extra software, tools and language supplements for the Citrine Programming Language.



Why Citrine?

Because I want to make fun little products in a beautiful, simple Dutch programming language, without English (key)words, ugly sublanguages and archaic ASCII symbols in the mix. I figured some other people might want the same thing but using their own native language instead of just Dutch, so that's why I share it. Have fun!

Why is this page in English?

As a developer, you have to know some English. Nobody is going to change that anytime soon. Writing complex logic in a foreign language is something different though. Citrine allows you to put your thoughts into the words of the language you know best: your mother tongue. That being said, if you want to translate a manual page, feel free to help!

Can I contribute?

Sure, Citrine is open source (Licensed BSD1,2) and we can share code using e-mail or Github or other systems. Citrine is written in C. The Citrine Project is apolitical and everyone is welcome. 1. BSD License explained 2. Citrine Programming Language License on website

Why icons in the language?

To limit verbosity and avoid using cryptic looking ASCII symbols, Citrine uses icons for frequently used operations like declaring a variable. Also, why should we limit our character set to the current configuration of keyboards anyway? Many computer users around the world already use lots of characters that aren't available on their keyboard and it works perfectly fine.

Why not just use AI?

I can imagine an AI layer on top of Citrine that helps you to formulate the code. At the moment I do not have any plans for such a system though.

Other questions?
Consult the Extended Technical FAQ >.

What type of scoping does Citrine use?

Citrine uses dynamic scoping, for instance, the following example prints '2':

☞ f ≔ { q ≔ 2. }.
{☞ q ≔ 1. f run. ✎ write: q.} run.

Can I use inheritance?

Yes. Assuming we have a Cat object that can print its name, here, we override the behaviour for message 'name' with a new response. The symbol 'plays' back another response from the same object. Sending the same message invokes the overridden behaviour. If you really want recursion (i.e. invoke the code you're currently running) prefix your message with the word 'recursive'.

Royal cat ≔ Cat new.
Royal cat on: 'name' do: {
	↲ ‘your royal highness ’ +
	( ⛏ name ).
✎ write: 
((Royal cat new name: ‘Diva’) name).
your royal highness Diva

What happens if a message is not understood?

If an object does not understand a message, the message will be ignored (Null Pattern). You can intercept those messages though, similar to PHP's magic methods:

echo ≔ Object new.
 on: ‘respond:’
 do: { :s ↲ s + s }.
echo ho!.

About us

Gabor de Mooij
Gabor de Mooij
Core language design & Linux/BSD implementations.
Software developer from the Netherlands.

Aavesh Jilani
Aavesh Jilani
Hindi & Marathi translations (Citrine/HI and Citrine/MR).
Windows, iOS, Android/ARM platform support.
Software developer from India. The creator of Dragon (programming language) and Suasive (search engine).

Roman Litwinow
Roman Litwinow
Russian Translations for Citrine/RU,
Russian Language Supplements,
Russian Citrine Website.
Software developer & Language Consultant from Russia.

Special thanks to:
JadedCtrl (Haiku Support), John Calistro (Brazil-Portugese Support), Tirifto (Czech Support), Tulenov Temur (Uzbek Support) Jan Wicijowski (Polish Support), Twiggler (Windows Support), Jake Russo (Plugins, CURL Lib Support), DennisCGc (Bug fixes & improvements), Takano32 (Various), Leonora Tindall (Bug fixes & improvements), Janus (Bug fixes & improvements), Shinriyo (MacOSX Support), Bernadette Peeters (English language support), Sean Eshbaugh (MacOSX Binaries), Georgel Preput (Romanian Support), Lina Dapkute (Lithuanian Support), Mario Périard (French language support, regional homepage), Muhammad Alvaro Syawal Siregar (Indonesian language support) & Marianne (Editor, Language Consultant). Some Citrine demos use assets from Kenney.nl.

Other Credits & Acknowledgements
Citrine uses assets from the following projects: Kenney.nl for Demo Assets (Licensed CC0), SipHash (Marek Majkowski; Licensed MIT), CCGI (Stephen C. Losen; Licensed LGPL), Font Awesome (Licensed SIL OFL 1.1). InnoSetup by JRSoftware Copyright (C) 1997-2023 Jordan Russell. All rights reserved. Portions Copyright (C) 2000-2023 Martijn Laan. All rights reserved. (Inno Setup License) In addition, the website and some demos may contains assets from the Open Icon Library licensed under Creative Commons Attribution, Creative Commons Attribution-Share Alike, GNU General Public License, GNU Lesser General Public License, MIT License, BSD License and Public Domain. These assets carry their own licenses and are not covered by the Citrine BSD License. The Citrine BSD License only covers the source code of the Citrine Project (and the binary files that can be generated from them). Aforementioned copyright holders of assets and/or artwork do not endorse the Citrine Project in any way. If there is a license/attribution problem please note that this is not on purpose. As a fellow programmer and open source creator I try to take good care of licensing and attribution. Just contact me if you find any issues or have any questions. If you find anything wrong with the usage or licensing of materials anywhere in the Citrine Project please contact me immediately so I can take appropriate action. Citrine itself is fully open source and free (BSD License). You can use Citrine for whatever you want, in any way you like, even in commercial projects. Citrine only charges a small fee for accompanying products like books, consultancy services and online build services to export code to external platforms.

contact: gabordemooij at gaborsoftware dot nl

KVK 66696534 BTW/TAX NL002061759B51