Skip to content
View SitrakaRasata's full-sized avatar

Block or report SitrakaRasata

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
SitrakaRasata/README.md
Sitraka Rasatarivony, full-stack TypeScript developer, Antananarivo. Three years of experience, internship included.

Full-stack developer in Antananarivo, Madagascar, with three years of experience, internship included. I mostly work with NestJS and Node.js on the server, React and Next.js on the client, and PostgreSQL underneath.

The three projects below each started with a problem I did not know how to solve. I read, compared what others had done, and picked the idea that fit. None of it is my invention. What I can explain is the problem, the idea, and why it fit.


cine-taste · a "trending" ranking that keeps itself up to date

Every view or like a movie gets counts a little less as time passes, the same way yesterday's news slips down a front page. While reading about how sites build their trending lists, I came across exponential decay: each interaction loses half its weight after a fixed delay, called the half-life.

The useful part is what it removes. The ranking stays correct on its own, so there is no nightly job recomputing it. Three half-lives run side by side, which gives three lists from the same data: right now, today, this week.

Three decay curves over fourteen days, with half-lives of one hour, one day and one week. Each loses half its score at its own half-life.

Next.js 16 · Postgres · Drizzle  ·  repo  ·  live

immo-grant · access rules kept in the database

A real estate app where the database itself decides who can see or edit a listing, using PostgreSQL row-level security. The application code does not repeat those rules.

The case I cared about was delegation. An agent can manage a listing they do not own, under a mandate, and that right ends by itself when the mandate expires. Each cell of this table is a test:

see create edit delete
visitor, published listing yes — — —
visitor, draft — — — —
client yes — — —
owning agent yes yes yes yes
mandated agent yes — yes —
other agent — — — —

The tests run against a real PostgreSQL started in memory (PGlite), so there is nothing to install. Row-level security has a few well-known traps. I ran into them one by one, and the tests now check them.

SvelteKit · Supabase · PGlite  ·  repo  ·  live

tournament-engine · one description per tournament format

Each format is written once, as a small map of matches: where the winner goes next, and where the loser goes.

graph LR
  M1[Match 1] --> SF[Semi final]
  M2[Match 2] --> SF
  M1 -.-> LB[Losers bracket]
  M2 -.-> LB
  SF --> F[Final]
  LB --> F
  classDef signal fill:#FF4F6E,stroke:#0A1628,stroke-width:2px,color:#0A1628;
  class F signal;
Loading

Solid arrows carry the winner, dashed ones the loser. The rest of the app only reads that map. Recording a result, fixing a wrong score, knowing when the tournament is over: none of it needs to know which format is being played. Adding a format means adding one file.

The app also shows each player's chances of winning, based on Elo ratings, the system chess uses.

NestJS · React · SQLite  ·  249 tests  ·  repo  ·  no public demo, it runs with one Docker command


Where I have worked

Co-founder and full-stack developer · NEXTRI Antananarivo · May 2026 – present

NEXTRI is a collective of three software engineers. Together we designed and built a modular management application: users, groups and permissions, invoicing with PDF output, dashboards. The API is in NestJS and TypeScript on Fastify, with PostgreSQL through Prisma and a Redis cache. The interface is in Next.js and React. It is not deployed yet and has no users.

Application developer · Stellar-IX (Axian Group) Antananarivo · September 2022 – January 2025

I rewrote the backend of a VMware monitoring application in FastAPI, with caching, and its average data load dropped from 4s to 300–500ms. Routine operations went through the vSphere REST API, and pyVmomi covered what only the SOAP SDK could do.

I built the time-series statistics for virtual machines in ClickHouse, and a generic table-and-chart module (AG Grid) for the internal dashboard. The codebase ran on legacy ejs and Node, and I argued for TypeScript on every new module. It took several team discussions before it was accepted. With the team, I then put Docker and CI/CD pipelines on every project, in a team of eleven.

Developer, internship · Ingenosya Madagascar Antananarivo · August 2021 – February 2022

In a team of eight, I built the administration space and the web services of an audio-visual e-learning platform for a client in Paris. We started from scratch and took it to pre-production. I attended the client meetings.

Education and training

Master MIAGE, Mobiquity, Databases and Systems Integration (MBDS). Université Côte d'Azur & IT University, Antananarivo · 2022 – 2024. Bachelor in computer science, Web and Design. IT University, Antananarivo · 2018 – 2022.

DevSecOps Professional, Practical DevSecOps, January 2024. A three-day course with an instructor and no exam, so a course rather than a certification.

The stack

Main · TypeScript · Node.js · NestJS · React · Next.js · PostgreSQL Backend and API · Express · REST API design · WebSocket · OpenAPI Frontend · Angular · Tailwind CSS Databases and ORMs · MongoDB · MySQL · ClickHouse · Redis · Prisma · Mongoose DevOps · Docker · CI/CD (GitHub Actions) Quality · unit and integration tests Other languages · Python (FastAPI) · Java (Spring Boot, Jakarta EE) AI · AI-assisted development (Claude Code; aider with local models through Ollama)


Median response time of the two live demos, measured every six hours from GitHub's servers.

Both live demos are checked every six hours from GitHub's servers. The chart shows the median of five requests, and a failed check leaves a gap in the line instead of a fake fast response. The workflow does the measuring.


LinkedIn  ·  sitraka.rasatarivony@gmail.com

Malagasy (native) · French (fluent) · English (intermediate to professional, written)

Pinned Loading

  1. immo-grant immo-grant Public

    Property listing platform where every access rule lives in the Postgres schema, expiring mandates included - SvelteKit 2 (Svelte 5) + Supabase RLS.

    TypeScript

  2. tournament-engine tournament-engine Public

    Multi-format tournament engine with live championship odds over WebSocket - NestJS 11 + React 19 + SQLite.

    TypeScript

  3. cine-taste cine-taste Public

    Movie discovery app whose trending ranking is driven by an exponentially decaying attention score - Next.js 16 + Postgres + Drizzle.

    TypeScript

  4. NextriMG/nextrimg.github.io NextriMG/nextrimg.github.io Public

    macOS-style desktop portfolio for the NEXTRI collective — React 19 + TypeScript, draggable windows, dock & boot sequence.

    TypeScript