Jobbtrawl jobbtrawl.se

Under The Hood

Architecture, patterns, and the decisions behind them.

System Overview

SOURCE

Job Boards

AF, LinkedIn, Indeed

PROCESS

Scrape + Dedup

async, concurrent

STORE

SQLite

normalised schema

AI

LLM Analysis

Ollama (local)

MATCH

Score + Rank

0-100 per job

OUTPUT

Cover Letters

+ interview prep

NordMod: Clean Architecture

API Layer Controllers, DTOs, Middleware
Application Services, Validators, Mappers
Domain Entities, Value Objects, Interfaces
Infrastructure EF Core / JPA, Caching, External APIs

Dependencies point inward. Domain has zero external dependencies.

Same Logic, Two Languages

NordMod was built in Java first, then ported to .NET. Same business rules, different idioms.

Spring Boot

@Service
@RequiredArgsConstructor
public class ContentService {
    private final ContentRepository repo;

    @Cacheable("content")
    public ContentDto findById(Long id) {
        return repo.findById(id)
            .map(mapper::toDto)
            .orElseThrow(() ->
                new NotFoundException(id));
    }
}

ASP.NET Core

public class ContentService(
    IContentRepository repo)
{
    public async Task<Result<ContentDto>>
        GetById(int id)
    {
        var entity = await repo
            .GetByIdAsync(id);
        return entity is null
            ? Result.NotFound(id)
            : Result.Ok(mapper.Map(entity));
    }
}

Patterns

Result<T>

Error handling without exceptions. Every service returns success or failure with typed errors.

Repository

Data access behind domain interfaces. Infrastructure provides EF Core or JPA implementations.

CQRS-Lite

Read/write separation at the service layer. Clear command and query paths without full event sourcing.

Strategy

Moderation rules as interchangeable strategies. Each tenant configures policies without code changes.

Full Stack

C# .NET 8 Java 17 Spring Boot Python Angular PostgreSQL SQLite Redis Docker Azure Ollama EF Core Flyway xUnit JUnit 5