T. Lorenzini

Thomas Lorenzini — Fullstack Developer

Portfolio — 2026

Available for 2026 projects

00Manifesto

Fullstack Developer

I build websites, web apps and bots, from the interface down to the database. This site is the demo: one 3D scene, rendered in characters.

Scroll

01About

Who I am

I'm Thomas, 19, a student. Alongside my classes I write code for real clients: a ready-to-wear boutique, a bot ordered on Fiverr, and this site, written line by line.

  • 19 years old
  • Student
  • Eastern France

02/03I'll redo a half-second animation ten times. As long as a detail feels off, I don't move on, whether it's a button or a query.

03/03I use AI every day to write faster. The architecture calls stay mine, and nothing goes live until I've read it and understood it.

+In practice

  1. 01

    I learn on the job

    Vue.js, Three.js, GLSL: each one learned on a real project. Your stack doesn’t scare me.

  2. 02

    I break problems down

    A fuzzy need gets cut down until every piece is simple to build and to test.

  3. 03

    I finish what I start

    What was planned ships, on the agreed timeline. And if something breaks afterwards, I pick up.

  4. 04

    I work well in a team

    GP Explorer was a team effort: a spec, split tasks, code reviewed before merging.

02Technical stack

01 / 05

React

My default for interfaces. Legacy runs on it, with Next.js for server rendering and Framer Motion for animation.

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

WithNext.js · Framer Motion

Seen inLegacy

glyphs. : ° o O @ ( )

02 / 05

Node.js

The server behind GP Explorer: a REST API, authentication, and bookings that never go over capacity.

routes/events.jssample
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);
});

WithExpress · REST

Seen inGP Explorer

glyphs. : - ~ = > » #

03 / 05

Python

For anything that has to run unattended: scripts, bots, automation. The Bluesky bot is made of it.

bot/post.pysample
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)

WithBluesky API · Proxies

Seen inBluesky Bot

glyphs. : ; i 1 l 0 1

04 / 05

SQL

I model the data before writing a single route, and I write my queries by hand.

queries/open_events.sqlsample
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;

WithPostgreSQL

Seen inGP Explorer

glyphs· ─ │ ┌ ┐ └ ┼ █

05 / 05

TypeScript

Wherever I can. This site is strict TypeScript: if it compiles, a good share of the bugs are already gone.

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

WithNext.js · Vite

Seen inLegacy

glyphs. : / < > { } #

03Render

Rendering is a choice.

This whole site is a single 3D scene computed in real time. The style is only a filter, and I drive it.

Mode 01/04

ASCII

The scene, reduced to characters.

Mode 02/04

Halftone

Dots, like a printing press.

Mode 03/04

Shaded

The image as the engine computes it.

Mode 04/04

Wireframe

The structure, without the skin.

04Selected work

032026Completed

Legacy

Clothing store

The site of a high-end ready-to-wear boutique. The idea: browsing it should feel like walking through the shop door.

Challenge
Carry the boutique’s world online, and let the shop edit its own site without having to call me.
Solution
Next.js and Framer Motion for quiet animations, plus a small home-made CMS to change content in two clicks.
Impact
Get found on Google, and make people want to drop by the shop.
  • React
  • Next.js
  • Framer Motion
  • TypeScript
Visit the sitelegacy-belfort.fr

022026Completed

GP Explorer

Event management

A school project, built as a team: a platform to discover and book events, with a back office to manage events, users and bookings.

Challenge
Make a SPA, an API and a relational database hold together, without any event ever being booked past its capacity.
Solution
Vue.js on the client, a REST API in Node.js and Express, PostgreSQL behind it.
Impact
A team project taken from spec to final delivery: split tasks, code reviews, trade-offs.
  • Vue.js
  • Node.js
  • Express
  • Vite
  • PostgreSQL

012025Completed

Bluesky Bot

Automation

A custom bot ordered on Fiverr, automating actions on Bluesky under very precise rules.

Challenge
The API rate-limits fast and blocks easily. The bot had to run unattended without getting cut off.
Solution
A Python script split into modules, rotating proxies, and automatic retries whenever the API says stop.
Impact
Delivered ahead of schedule, and rated 5/5 by the client for communication, quality and value.
  • Python
  • Bluesky API
  • Proxies

05Bonus

Curious about budget?

This part is optional. If you'd like to place your project before writing to me, the price ranges are right behind this.

06Contact

Status — available for 2026 projects

Got a project in mind? Tell me about it.

Freelance work or a full-time role, I answer every message. A few lines are enough: what you want to build, and by when.