← All projects

PROJECT / Angular

Monde de Devs: learn from what developers build

A community for developers to share practical experience, follow the topics they use and discuss what they are building.

  • Angular
  • NgRx
  • Signals
  • Java
  • Spring Boot
  • PostgreSQL
Monde de Devs homepage

Product context

Monde de Devs is a personal product for developers who want to learn from what others have actually built. It brings practical experience, questions and discussions together around the languages and tools members use.

The core product decision is to organize discovery around followed topics rather than a single global timeline. Members choose what they want to keep up with, and those subscriptions shape their feed.

The product

The main journey connects discovery with participation:

  • Create an account, manage a profile and follow relevant topics.
  • Browse recent posts from those topics in a paginated feed.
  • Publish an experience or question under a topic, then continue the discussion in comments.

Topic subscriptions give members control over what appears in their feed. Posts and comments keep the experience and the conversation together, so readers can move from reading to asking a question in the same place.

Explore Monde de Devs.

Build

Frontend

The Angular 20 frontend uses PrimeNG for UI components. NgRx Signal Store holds shared state such as authentication and followed topics; Angular Signals handle local state, while RxJS drives asynchronous requests. This separates the member’s session and subscriptions from temporary UI state, while keeping the feed reactive when server data changes.

The feed store shows the pattern: state and derived values are signals, and an rxMethod runs the HTTP request. exhaustMap ignores new calls while a request is in flight.

export const FeedStore = signalStore(
  withState(initialState),

  withComputed((store) => ({
    sortedPosts: computed(() => (store.sortOrder() === "default" ? store.posts() : [...store.posts()].reverse())),
  })),

  withMethods((store, postService = inject(PostService)) => ({
    fetchFeedPosts: rxMethod<Partial<{ page: number; size: number }>>(
      pipe(
        tap(() => patchState(store, { isLoading: true, error: null })),
        exhaustMap(({ page = 0, size = 20 } = {}) =>
          postService.getFeedPosts({ page, size }).pipe(
            tap({
              next: (posts) => patchState(store, { posts, isLoading: false }),
              error: (error) => patchState(store, { isLoading: false, error: error.message }),
            }),
          ),
        ),
      ),
    ),
  })),
);

Backend

The REST API uses Java 21 and Spring Boot 3.5. Spring Security protects stateless endpoints with JWT authentication. Spring Data JPA persists users, topics, posts and comments in PostgreSQL, while Flyway versions database changes. The feed query uses Spring pagination to return recent posts from the topics a member follows.

// PostRepository: newest posts first, restricted to the followed topics
Page<Post> findBySubjectInOrderByCreatedAtDesc(List<Subject> subjects, Pageable pageable);

// PostController: 20 posts per page by default
@GetMapping("/feed")
public List<PostDto> getFeedPosts(@AuthenticationPrincipal User currentUser,
        @PageableDefault(size = 20) Pageable pageable) {
    return postService.getFeedPosts(currentUser.getEmail(), pageable);
}

Domain model

Monde de Devs domain model Users subscribe to subjects, write posts under a subject, and author comments on posts. subscriptions 0..* 0..* author 1 0..* topic 1 0..* author 1 0..* comments 1 0..* <<entity>> User username email <<entity>> Subject title description <<entity>> Post title, content createdAt <<entity>> Comment content, createdAt
JPA entities and associations from the current implementation. The subscriptions link is stored as a many-to-many join table.

Outcome

The product is available online, with account flows, topic subscriptions, a personalized feed, publishing and comments implemented in the repository. It connects choosing interests, discovering posts and joining discussions in one product.

Usage and performance have not yet been measured. The next product validation is to check whether new members can follow a topic, find a relevant post and join a discussion without help. Profiling the paginated feed is the next technical check.

The source code for Monde de Devs is available on GitHub.