T. Lorenzini

Thomas Lorenzini — Développeur Fullstack

Portfolio — 2026

Disponible pour projets 2026

00Manifeste

Développeur Fullstack

Je code des sites, des applis web et des bots, de l'interface jusqu'à la base de données. Ce site en est la démo : une seule scène 3D, rendue en caractères.

Défiler

01À propos

Qui je suis

Je m'appelle Thomas, j'ai 20 ans et je suis étudiant. À côté des cours, je code pour de vrais clients : une boutique de prêt-à-porter, un bot commandé sur Fiverr, et ce site.

  • 20 ans
  • Étudiant
  • Est de la France

02/03Je peux reprendre dix fois une animation d'une demi-seconde. Tant qu'un détail cloche, je ne passe pas à la suite, que ce soit un bouton ou une requête.

03/03J'utilise l'IA tous les jours : elle prend ce qui est long et répétitif, je garde l'architecture et les décisions. Plus une erreur coûterait cher, plus je vérifie de près.

+Concrètement

  1. 01

    J’apprends sur le tas

    Vue.js, Three.js, GLSL : chacun appris sur un vrai projet. Votre stack ne me fait pas peur.

  2. 02

    Je découpe le problème

    Un besoin flou, je le découpe jusqu'à ce que chaque morceau soit simple à coder et à tester.

  3. 03

    Je finis ce que je commence

    Ce qui est prévu est livré, dans les délais prévus. Et si quelque chose casse après, je réponds.

  4. 04

    Je sais coder à plusieurs

    GP Explorer s'est fait en équipe : cahier des charges, répartition des tâches, code relu avant de fusionner.

02Stack technique

01 / 05

React

Mon choix par défaut pour les interfaces. Legacy tourne dessus, avec Next.js pour le rendu serveur et Framer Motion pour l'animation.

components/Gallery.tsxextrait
export const Gallery = ({ items }: Props) => (
  <motion.ul layout className="grid">
    {items.map((p) => (
      <Card key={p.id} product={p} />
    ))}
  </motion.ul>
);

AvecNext.js · Framer Motion

Vu surLegacy

glyphes. : ° o O @ ( )

02 / 05

Node.js

Le serveur de GP Explorer : une API REST, l'authentification, et des réservations qui ne dépassent jamais la capacité.

routes/events.jsextrait
router.post('/events/:id/book', auth, async (req, res) => {
  const seat = await book(req.params.id, req.user.id);
  if (!seat) return res.status(409).json({ error: 'full' });
  res.status(201).json(seat);
});

AvecExpress · REST

Vu surGP Explorer

glyphes. : - ~ = > » #

03 / 05

Python

Pour tout ce qui doit tourner sans surveillance : scripts, bots, automatisation. Le bot Bluesky en est fait.

bot/post.pyextrait
for attempt in range(MAX_RETRIES):
    proxy = pool.next()
    try:
        return client.post(text, proxy=proxy)
    except RateLimited as e:
        time.sleep(e.retry_after)

AvecBluesky API · Proxies

Vu surBluesky Bot

glyphes. : ; i 1 l 0 1

04 / 05

SQL

Je modélise les données avant d'écrire la moindre route.

queries/open_events.sqlextrait
SELECT e.title, count(b.id) AS booked
FROM events e
LEFT JOIN bookings b ON b.event_id = e.id
WHERE e.starts_at > now()
GROUP BY e.id
HAVING count(b.id) < e.capacity;

AvecPostgreSQL

Vu surGP Explorer

glyphes· ─ │ ┌ ┐ └ ┼ █

05 / 05

TypeScript

Partout où je peux. Ce site est en TypeScript strict : si ça compile, une bonne partie des bugs est déjà partie.

lib/result.tsextrait
type Result<T, E = Error> =
  | { ok: true; value: T }
  | { ok: false; error: E };
 
type Patch<T> = { [K in keyof T]?: T[K] | null };

AvecNext.js · Vite

Vu surLegacy

glyphes. : / < > { } #

03Rendu

Le rendu est un choix.

Tout ce site est une seule scène 3D calculée en temps réel. Le style n'est qu'un filtre, et je le pilote.

Mode 01/04

ASCII

La scène, réduite à des caractères.

Mode 02/04

Trame

Des points, comme à l'imprimerie.

Mode 03/04

Lisse

L'image telle que le moteur la calcule.

Mode 04/04

Fil de fer

La structure, sans la peau.

04Projets choisis

032026Terminé

Legacy

Boutique de vêtements

Le site d'une boutique de prêt-à-porter haut de gamme. L'idée : qu'en ligne, on ressente la même chose qu'en poussant la porte du magasin.

Défi
Retranscrire l'univers de la boutique, et lui permettre de modifier son site seule, sans avoir à m'appeler.
Solution
Next.js et Framer Motion pour des animations discrètes, plus un petit CMS fait maison pour changer les contenus en deux clics.
Impact
Être trouvée sur Google, et donner envie de passer en boutique.
  • React
  • Next.js
  • Framer Motion
  • TypeScript
Voir le sitelegacy-belfort.fr

022026Terminé

GP Explorer

Gestion évènementielle

Projet d'école, à plusieurs : une plateforme pour découvrir et réserver des événements, avec un back-office pour gérer événements, utilisateurs et réservations.

Défi
Faire tenir ensemble une SPA, une API et une base relationnelle, sans qu'un événement puisse être réservé au-delà de sa capacité.
Solution
Vue.js côté client, une API REST en Node.js et Express, PostgreSQL derrière.
Impact
Un projet mené en équipe du cahier des charges au rendu final : répartition des tâches, relectures, compromis.
  • Vue.js
  • Node.js
  • Express
  • Vite
  • PostgreSQL

012025Terminé

Bluesky Bot

Automatisation

Un bot sur mesure commandé sur Fiverr, qui automatise des actions sur Bluesky selon des règles très précises.

Défi
L'API limite vite et bloque facilement. Il fallait un bot capable de tourner sans surveillance sans se faire couper.
Solution
Un script Python découpé en modules, une rotation de proxys, et des reprises automatiques quand l'API dit stop.
Impact
Livré plus vite que prévu, et noté 5/5 par le client sur la communication, la qualité et la valeur.
  • Python
  • Bluesky API
  • Proxies

05Bonus

Une idée du budget ?

Partie facultative. Si vous voulez situer votre projet avant de m'écrire, les fourchettes de prix sont juste derrière.

06Contact

Statut — disponible pour projets 2026

Un projet en tête ? Racontez-le-moi.

Mission freelance ou poste à temps plein, je réponds à chaque message. Quelques lignes suffisent : ce que vous voulez faire, et pour quand.