jivejdon is a free, open source community platforms project written in Java and released under Apache-2.0. It has 588 GitHub stars, 160 forks and 5 open issues, and was last pushed 5 days ago. On this registry it ranks #13 of 14 tracked projects in Community Platforms, with 5 head-to-head comparisons available.

What is jivejdon?

Jivejdon is a Java, Apache-2.0-licensed chain notebook and knowledge system that combines DDD, domain events, event sourcing, CQRS and clean/hexagonal architecture to link blog and forum posts into a knowledge graph — built for enterprises and teams that want to run their own internal knowledge system rather than a flat publishing CMS.

What it is

Jivejdon is an open-source content and community platform written in Java, living in the same ecosystem as blog and forum software (its repository topics include blog, cms and forum). It is powered by jdonframework, which supplies the customer/supply, or publish-subscribe, model that separates domain logic from infrastructure. The project describes itself as a chain notebook or chain blog: posts are not isolated entries but nodes linked to one another by keywords and topics, and the resulting structure is presented two ways — as a time sequence of threads for human readers, and as a tag-based knowledge graph for AI readers.

The concrete problem it addresses is that conventional blog and CMS deployments leave knowledge stranded in chronological posts that no one can traverse. Jivejdon replaces that model with interlinked posts organized as a theme garden, so that when a user posts, the system automatically interlinks posts around keywords and topics and groups them into links. The README frames the target use case plainly: enterprises managing internal knowledge systems, where Jivejdon combined with intelligent agents can serve as the organization's second brain.

Key capabilities

  • Interlinks posts around keywords and topics at posting time, organizing them together in the form of links rather than as isolated entries.
  • Serves the same content to human readers as a time sequence at /threads/ and to AI readers as a knowledge graph at /tag/.
  • Models two aggregate roots, ForumThread and ForumMessage, with all setter methods private by default and aggregate roots created through a heavy builder pattern.
  • Keeps the domain model persistence-ignorant: all classes are POJOs, with AnemicMessageDTO carrying business data outside the domain so business rules in the aggregate root entity do not leak.
  • Groups primitive attributes into value objects, such as MessageVO, which holds the subject and body attributes for message content.
  • Follows clean/hexagonal architecture with the invoking path presentation -> api -> domain -> spi -> infrastructure, adapted per presentation through models.xml.
  • Applies domain events, event sourcing and CQRS, with a POST command from the presentation layer acting on the createReplyMessage method of forumMessageService.

Who uses it and how

  • Enterprises managing internal knowledge systems, including deployments combined with intelligent agents as an enterprise second brain.
  • Blog and forum operators who want a working Java reference implementation rather than a hosted service.
  • DDD practitioners studying a sample: repository topics include ddd-example, ddd-sample and ddd-cqrs, and the codebase is documented with aggregate, use case and package diagrams.
  • Event-driven and event-sourcing developers examining domain events, CQRS and the customer/supply separation in running code.
  • Readers of the canonical deployment at jdon.com, which runs on NginX, Tomcat, JDK8 and MySQL.

Getting started

No packaged release, Docker image or compose file is documented. The README points to the source repositories at github.com/banq/jivejdon and gitee.com/banqjdon/jivejdon, and the canonical deployment at https://www.jdon.com/ runs on NginX + Tomcat + JDK8 + MySQL.

How it compares

Jivejdon is powered by jdonframework and depends on its customer/supply pub-sub model to separate the domain model from persistence and repositories — that framework relationship, not a stack substitution, is the architectural distinction the README draws. The registry facts name no other comparable notebook or DDD sample project here, so on this page it stands alone among similar tools.

When to use it — and when not to

A self-hoster must operate the full canonical stack — NginX, Tomcat, JDK8 and MySQL — and build and deploy from source, since the README documents no package, image or compose file. Teams wanting a turnkey hosted product, a modern JDK baseline, or a platform with a published release artifact should look elsewhere. The README excerpt is also sparse on operational detail: features, demo and architecture are covered, but install steps, configuration and upgrade paths are not, so expect to read the code.

project readme (upstream, from github) — read inline

Jivejdon

Jivejdon is a chain notebook or chain blog, knowledge graph and knowledge system with DDD + DomainEvents/Event Soucing/CQRS + clean architecture/Hexagonalarchitecture, powered by jdonframework.

Features

When posting, it provides the function of interlinking posts around keywords/topics, organizing posts together in the form of links. these posts are presented to human readers in a time sequence and to AI readers in a knowledge graph like a theme garden. It is suitable for enterprises to manage their internal knowledge systems, and when combined with intelligent agents, it can serve as the enterprise's second brain.

refer: Large language models + graph structures are the ultimate path to enterprise intelligence.

Markdown files themselves are the graph database for intelligent agents!

Demo

You can check out the canonical deployment of Jivejdon at https://www.jdon.com/(NginX+Tomcat+JDK8+MySQL)

github

gitee

avatar

Domain-centric Architecture.

Domain-centric architecture is a new way to design modern world enterprise applications.

avatar

Use Case

avatar

DDD Aggregate Model

avatar

There are two aggregate roots in jivejdon: FormThread and ForumMessage(Root Message).

com.jdon.jivejdon.domain.model.ForumMessage is a rich model, no "public" setter method, all setter methods are "private":

avatar

Domain Model principles:

  1. *High level of encapsulation All members' setter methods are private`` by default, then internal`. need heavy builder pattern to create aggregate root!

  2. *High level of PI (Persistence Ignorance) No dependencies on infrastructure, databases, or other stuff. All classes are POJO.

The customer/supply model from jdonframework can separate the domain model from Persistence/Repository.

All business datas outside of the domain is packed in a DTO anemic model(AnemicMessageDTO), so business rules in the aggregate root entity will not leak outside of the domain.

avatar

These DTO anemic models can also be packed in Command and Domain Events, so they are managed in DDD ubiquitous business language.

  1. Rich in behavior

All business logic is located in Domain Model. No leaks to the application layer or other places.

  1. Low level of primitive obsession

Primitive attributes of Entities grouped together using ValueObjects.

MessageVO is a value Object and has two attributes for message content: subject/body.

Clean architecture/Hexagonal architecture

Why clean architecture/Hexagonal architecture are a better choice for "Implementing Domain Driven Design"

JiveJdon is developed with JdonFramework that supports the Customer/Supply or pub-sub model, this model can separate domain logic from infrastructure, databases, and other stuff.

avatar

JiveJdon Hexagonal_architecture:

avatar

here is the package view of jivejdon:

avatar

Invoking path:

presentation -> api -> domain -> spi ->infrastructure

models.xml is an adapter for presentation:

	<model key="messageId" class="com.jdon.jivejdon.infrastructure.dto.AnemicMessageDTO">
		<actionForm name="messageForm"/>
		<handler>
			<service ref="forumMessageService">

				<createMethod name="createReplyMessage"/>

			</service>
		</handler>
	</model>

When a user post a replies message, a POST command from the presentation will action the createReplyMessage method of forumMessageService in API :

public interface ForumMessageService {

	Long createReplyMessage(EventModel em) throws Exception;
	....

}

The forumMessageService will delegate the responsibility to the aggregate root entity ForumMessage,

The createReplyMessage() method of the forumMessageService will send a command to the addChild() method of ForumMessage that is too a command handler of CQRS:

avatar

@OnCommand("postRepliesMessageCommand") annotation make addChild() being a command handler, the annotation is from pub-sub model of jdonframework, it can make this method executed with a single-writer pattern - no blocked, no lock, high concurrent. only one thread/process invoking this update method.

"event-sourcing.addReplyMessage" will send a "ReplyMessageCreatedEvent" domain Event to infrastructure layer such as Repository. separate domain logic from infrastructure, databases, and other stuff.

Domain event "ReplyMessageCreatedEvent" occurring in the domain is saved in the event store "jiveMessage", this is a message posted events table. the event can be used for reconstructing the latest replies state of a thread, events replay is in ForumThreadState .

CQRS architecture

CQRS addresses separate reads and writes into separate models, using commands to update data, and queries to read data.

avatar

In jivejdon ForumThread and ForumMessage are saved in the cache, the cache is a snapshot of even logs, if an update command activates one of these models, they will send domain events to clear the cache data, the cache is similar to the database for query/read model, the consistency between with cache and the database for command model is maintained by the domain events such as "ReplyMessageCreatedEvent".

The domain event "ReplyMessageCreatedEvent" do three things:

  1. add a new post message to "jiveMessage" (events log)
  2. clear the query cache (CQRS)
  3. update/project the latest replies state of a thread (event project to state)

Event Sourcing

Posting a message is an event, modifying the latest replies status for one thread.

avatar

How to get the latest replies status for one thread? we must iterate all posted events collection.

JiveMessage is a database storing posted events in time order, with one SQL we can reduce them chronologically to get the current state: the latest posted event:


SELECT messageID from jiveMessage WHERE  threadID = ? ORDER BY modifiedDate DESC

This SQL can quickly find the latest replies post, similar to replaying all posted events to project the current state.

In jiveThread table there is no special field for the latest replies state, all states are from posted events projection. (projection can use SQL!)

When a user posts a new ForumMessage, a ReplyMessageCreatedEvent event will be saved to the event store: JiveMessage, simultaneously refreshing the snapshot of the event: ForumThreadState.

In ForumThreadState there is another method for projecting state from the database, if we want to get the count of all message replies, its projectStateFromEventSource() method can do this:


	public void projectStateFromEventSource() {
		DomainMessage dm = this.forumThread.lazyLoaderRole.projectStateFromEventSource(forumThread.getThreadId());
		OneOneDTO oneOneDTO = null;
		try {
			oneOneDTO = (OneOneDTO) dm.getEventResult();
			if (oneOneDTO != null) {
				latestPost = (ForumMessage) oneOneDTO.getParent();
				messageCount = new AtomicLong((Long) oneOneDTO.getChild());
				dm.clear();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

lazyLoaderRole.projectStateFromEventSource will send a "projectStateFromEventSource" message to ThreadStateLoader:

public v

readme truncated — read the full docs on github

Frequently asked questions

Is jivejdon free to use?

jivejdon is open source under the Apache-2.0 licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does jivejdon do?

Jivejdon is a chain notebook with DDD/CQRS/Clean architecture

What is jivejdon written in?

jivejdon is primarily written in Java. Its source is publicly available at https://github.com/banq/jivejdon, and it has 588 GitHub stars.