AI / Reputation management
RepuTrust — turning what the internet says about you into a number
RepuTrust is an AI-powered reputation-management platform built for Ealixir. It scans the web for articles and links about a person or company, classifies each finding into risk categories using Claude, and produces a 0–100 reputation score. Four services, two audiences, one shared backend — and I lead it.
- Role
- Full-stack Lead — architecture, implementation, review, direction across services
- Client
- Ealixir — reputation-management company
- Backend
- FastAPI · SQLAlchemy 2 · PostgreSQL 16 · Alembic · Docker
- Web
- Next.js 16 · React 19 · TypeScript
- Mobile
- React Native on Expo, with Apple authentication
- AI
- Claude — classification and analysis
- Timeline
- May 2026 — present
The problem: reputation is diffuse, decisions are not
What the internet says about a person or a company is scattered across news articles, directories, forums and search results, in wildly varying tone and credibility. A reputation-management firm has to turn that sprawl into something a client can act on — and into something the firm's own staff can work through systematically rather than case by case.
That's really two products. Clients want to understand where they stand. Operators want a queue, a workflow and a way to see progress. The platform serves both from the same data.
The score is the product's whole proposition. Everything upstream exists to make a single number defensible.
Four services, one system
RepuTrust is deliberately split rather than monolithic, and the boundaries follow the audiences:
- The customer portal — Next.js 16 and React 19, where clients see their standing
- The operator dashboard — the internal tool agency staff work in, with charting and geographic visualisation
- The API — FastAPI over PostgreSQL 16, the shared backend both frontends read from, containerised with Docker
- The mobile app — React Native on Expo, with Apple authentication
Keeping one API behind several clients is what stops the two audiences drifting into two truths. A score shown to a client and a score shown to the operator working their case have to be the same score, computed once.
Classification: where the AI actually sits
Findings are classified with Claude into four risk bands — good, mediocre, poor and negative — and that classification feeds the 0–100 score.
The engineering judgement here is about where to put the model. Classification is a genuinely good fit for an LLM: it's nuanced, contextual, and the alternative is keyword rules that break on sarcasm and context. Scoring, by contrast, is arithmetic that has to be reproducible — a client asking "why did my score drop" deserves an answer that doesn't depend on a sampling temperature. Drawing that line in the right place is most of the design.
Link classification is its own concern, with its own logic for deciding what a given result actually is before it gets weighed.
Leading it
As Full-stack Lead my responsibility spans the services rather than sitting in one of them — the architecture across the split, the shape of the API both frontends depend on, and review as the team builds into it.
The measurable evidence of that discipline is in the repository rather than anything I can assert: 48 data models across 18 modules, 98 database migrations and 75 test files. Ninety-eight migrations is a schema that has been evolved deliberately under real usage, not rewritten whenever it got inconvenient.
Building in a domain where the data is people
Reputation data is personal data. The system holds findings about identifiable individuals, which changes how you treat everything: what gets logged, who can see which record, what leaves the system, and how much lands in a screenshot.
It also sets the bar for correctness differently from most CRUD work. A misclassified article isn't a rendering bug — it's a claim about a person. That is the right pressure to feel when you're the one deciding how the pipeline behaves.
Hiring a full-stack engineer who ships?
Jakarta (GMT+7), fluent in remote-first work across timezones. Usually replies within a day.