Why wolkenkit?
Scaling with confidence
wolkenkit separates reading data from writing them by incorporating a CQRS architecture. This way you can optimize and scale your application as needed.
Empowering interdisciplinary teams
wolkenkit uses domain-driven design to model your domain language as code. This way it invites you to work in an interdisciplinary team as early as possible.
Learning from your past
wolkenkit does not store the current application state, but the stream of events that led to it. Using event-sourcing allows you to reinterpret your past.
Have a project in mind? Just get in touch!
Getting started
Hi, I'm Sophie!
Nice to meet you! I'm your new team's JavaScript ace. Our mission is to build the next big messaging platform.
Has Valentin already shown you the first draft of the desired UI? No? Well, look, here it is!

Wait a minute!
Before writing any code, we should first figure out the details of the domain.
Since this works best in an interdisciplinary team, let's gather in front of a whiteboard with people that know the domain inside out.
Wow, that was fun! Look at the model that we came up with!


Now let's use the wolkenkit CLI, a remote control for wolkenkit applications, to start the backend.
It packages and deploys the application into a bunch of Docker containers and runs them locally.
Wow, we now have a streaming REST API up and running! But REST alone won't make all users happy.
$ wolkenkit start
Let's create a single page application that can be hosted anywhere.
We then use the wolkenkit SDK to connect to the new backend.
The SDK will bring the API that we've just created to the client. One language, one code. So now we can start…
1 …sending messages using the write model.
2 We also can easily read lists in real-time.
const wolkenkit = require('wolkenkit-client');
const messaging = await wolkenkit.connect({
host: 'messaging.wolkenkit.io'
});
messaging.communication.message(). 1
send({ text: 'Hello world!' }).
await('sent', () => {
console.log('Command has been processed!');
});
messaging.lists.messages.readAndObserve({ 2
orderBy: { timestamp: 'descending' },
take: 10
}).started(messages => {
// Render your client
console.log(messages);
}).
updated(messages => {
// Render your client with updated messages
console.log(messages);
});
Congratulations!
You've just created a highly scalable cloud service.
Like to learn more?
Need help modeling your domain? Just ask!
Features
Any questions? Just have a look at the documentation!
Plans
Community Edition
- Perfect for open-source projects, thanks to AGPL 3.0
- Develop, build, and run on your local machine
- Run on your own server using docker-machine
- Community support via StackOverflow
- No credit card needed
Enterprise Edition
- Includes all features of the Community Edition
- For commercial projects, due to a proprietary license
- High-availability and scaling with confidence
- Learn from your past by using the built-in time-machine
- Deploy on-premise, to your own cloud, or get managed hosting
- Support tailored to your needs