Back

Case: Selkie

Selkie is an AI-assisted diagramming tool designed for users who prefer declarative configuration over manual drawing. It uses a domain-specific language (Mermaid) to define diagram structures, with AI providing intelligent scaffolding during the early stages of creation. Selkie streamlines the transition from concept to structured output, supporting workflows where diagrams are shared, versioned, or refined manually.

The idea of Selkie is to help you start quickly and think clearer without getting stuck in the layout and nuances.

This blog post tracks the progress of creating the app itself.

By the way, I have written about creating diagrams earlier in Why Creating Diagrams is Hard (and How PlantUML/Mermaid Can Help).

First version

I have had the idea for quite some time, but only yesterday I started working with it. I decided to approach the project so that I will first aim to create e2e working example so I can actually get the feeling of how the app works and if it makes sense at all. I was able to make the first version in few hours by using an existing Javascript-based full-stack template I had prepared earlier for projects exactly like this. The template is called cito-starter (not publicly available) and consists Angular frontend and NodeJS backend. In case of Selkie the backend does the API calls towards OpenAI. See first render of the UI below:

First version
Figure: Screenshot of the first version.

The first version does the following:

Regarding the name "Selkie": the idea is derived from "Mermaid". Wikipedia describes Selkies as "mythological creatures that can shapeshift between seal and human forms by removing or putting on their seal skin". In Finnish "Selkeä" means "clear". Not sure if this has wings, but I think one of the main functions of any diagram is to convey information and make things clearer.

Next, I will focus on the UI design, visual aspects and interaction design.

Working on all fronts: UI, code and concept

Second iteration is under way. I replaced my custom code editor (contentEditable div) with Monaco. I also added some tweaks to frontend to make the idea a bit more iteratable. Some current topics on the table:

Below is the latest UI:

Working on second iteration
Figure: Working on second iteration.

Second version

Second iteration is now done. I haven't had time to focus on improving LLM functionality yet, but main functionalities are usable end-to-end. Diagrams are stored to database. Editing works and the development-time usage can start. The project itself can also be tracked with the app itself. Some of the recent work included:

Below is the second version UI:

Selkie second iteration
Figure: Second iteration.

The work continues on refactoring the project e2e. After that it will be deployed to virtual machine for public access and prepared for development phase that focuses on LLM logic. Third version planned content will be shaped as the idea marinates and matures.

Below is the final version of the second version UI:

Selkie second iteration, final
Figure: Second iteration complete.

Deployment done

The applicaton is now running in: https://concept.directory/

Second iteration got some minor adjustments before deploying to the public domain. The changes include:

On top of application changes I spent sime time hardening the nginx configs and adjusting scripts for deployment.

Below is the deployed version in light and dark.

Selkie first deployed version, dark theme.
Figure: First deployed version (dark).
Selkie first deployed version, light theme.
Figure: First deployed version (light).

Third version

Third iteration is now in progress. I have been refining the current version to work for home and work notes. LLM improvements are still waiting to get worked on. Recent work includes:

Below is the ongoing third version of the UI:

Selkie third iteration in progress.
Figure: Third iteration in progress.

The Selkie project itself is tracked with the Selkie. Next items on the project's Gantt looks like this:

Next steps as of 2025-05-04
Figure: Next steps.

The solution turned out to be helpful

I have spent the past days on working on yaml-based syntax. The idea is to support custom yaml-based syntax for note taking. The major reason is have consistency in structure, better parsing and proper pre-computations before sending the content to Mermaid.

Currently I have added support for the following: