Hedi Bannour

Hedi Bannour · AI product engineer and founder

I build AI products. This site is one.

The robot on the right is Player 2. It started learning table tennis when you opened this page, and it answers questions about me. Play it, or ask it.The robot below is Player 2. It started learning table tennis when you opened this page, and it answers questions about me. Play it, or ask it.

  • NowSoftware engineering at Epitech, France, class of 2028. Internship at SN Perfect.
  • NextCal State San Marcos, California: January 18 to August 13, 2027
  • GoalMeet founders and engineering teams who build with AI
Ask Player 2

Play against Player 2, my AI

Autopilot 0 : 0 Player 2

Move your mouse over the table to play

Player 2 is 00:00 old. Skill: newborn

Player 2 was born when you opened this page. Nobody taught it the game: it learns by practising on its own, 0 balls so far. It starts terrible. Give it 20 seconds. First to 3 wins.

Player 2 is a 57-weight neural network: 5 inputs, 8 tanh units, 1 output for the paddle speed. It trains in your browser with the cross-entropy method: 16 candidates per generation, the best 4 define the next one. No data set, no server.

Generation
0
Returns in a row
0.0 / 20
Practice balls
0

Reduced motion is on, so the games wait for you: click or tap a screen to start it.

3companies startedFounder log55clinics surveyed in the field for one of themTabeebi5internships, two of them in AIWork33projects, 14 playable on this pageProjects

Ask Player 2 about me

It answers only from the fact cards on this site, and shows which card it used. No source, no answer.

Right now: card search, without a language model.

Hi. I know what Hedi founded, where he worked, what he built and when he is in California. I don't guess the rest.

Founder log

Every company I have started, with its status. Two stopped, and I left one.

  1. Aug – Oct 2026Left

    Nearchon

    Co-founder and CTO

    An AI learning system for AP Physics C: Mechanics. It follows the student's reasoning step by step instead of only checking the final answer.

    • Product and architecture
    • The system around the language model: context, tools, evaluation
    • Customer discovery, finding tutors, early tests with students

    Why I left I left after co-founding the team and helping build and test the first version of the AI tutor. The team is still active; I do not know where the product stands today.

  2. Apr – Aug 2026Stopped

    Tabeebi

    Founder

    Clinic management software for private doctors in Tunisia.

    • Surveyed 55 clinics in the field
    • Built the product close to complete: Next.js, Supabase, background jobs, the Claude API

    Why it stopped I was carrying almost all of the work. After a lot of time and money, and no change in how the work was shared, I chose to stop before trying to sell it.

  3. Nov 2025 – Apr 2026Stopped

    Émile

    Founder

    A pricing engine, a CRM and an operations dashboard for short-term rental agencies.

    • Built and deployed it end to end: FastAPI, Supabase
    • Called many short-term rental agencies to test the idea

    Why it stopped None of the agencies we called wanted to go further, and when our internships started we no longer had the time to continue. Tabeebi came next.

  4. 2024 – 2025

    Earlier experiments

    Online stores on Shopify that I built and ran: product pages, checkout, acquisition campaigns. And a voice agent for phone calls that qualifies the caller and handles objections, built with Rasa, speech recognition and speech synthesis.

Continue?9Three runs ended. I pressed Continue each time.

Work

Five internships and freelance work, described as on my public LinkedIn profile.

  1. Sep 2026 – now

    SN Perfect

    Software engineering intern

    I am building the company's internal ERP for a multi-site cleaning business: staff and contracts, client sites, a mobile space for field supervisors, monthly closing. Built on Frappe, ERPNext and Frappe HR. Next: AI features.

    FrappeERPNextPython

  2. Apr – Aug 2026

    Meosis

    Software engineering intern · Horbourg-Wihr, France

    I built a tool that generates website mockups with AI, used in meetings with prospects, and set up an AI-assisted path from a client brief to a WordPress site. Also: fixes on the in-house CRM and ERP in PHP, WordPress multisite, server migrations.

    LLM promptingFigma MakeWordPressPHP

  3. Sep 2025 – Jan 2026

    DataScale AI

    AI engineering intern · startup, team of three

    Real-time tracking of what shoppers do on an online store (pages, clicks, cart), a hot-or-cold intent score, a scraper that structures the client's catalogue, and a chatbot that adapts to the visitor.

    PythonLangFlowDocker

  4. Sep – Dec 2024

    Infolog

    .NET developer intern

    An industrial CRM in .NET Core and C# for a medical dressing manufacturer: the data model and the business logic of the production chain, from reception to quality control.

    .NET CoreC#Entity Framework

  5. Jul – Sep 2024

    SN Perfect

    Internal tools intern · Paris

    Tools that pull data out of images and export it to Excel, and automatic form filling, to replace manual entry.

  6. 2023 – now

    Freelance

    Independent developer

    WordPress sites and web tools for private clients and small businesses: features, integrations, automations.

Projects

One product built outside school, then Epitech: a five-year French engineering school where you learn by building. I picked 33 projects. 14 are playable here.

Product · built outside school

ZooPass

A phone guide for the Mulhouse zoo. It plans your visit, draws the route on the map, and a chatbot answers your questions and shows where each answer comes from.

A PWA in React and TypeScript on Cloudflare Pages. The chatbot is a RAG pipeline: vector search in Astra DB plus keyword search, a similarity threshold of 0.70, and the sources returned with every answer.

TypeScriptTeam of 22025–26

Player 2's answers on this site follow the same idea.

What I built

  • Created the project and put it online
  • The chatbot's brain: how it searches, and how it answers
  • Reworked the chatbot's page
  • Created the project and deployed it on Cloudflare Pages
  • The chat function and most of the RAG: Astra DB, the similarity threshold, the system prompts
  • Contextual actions and quick suggestions in the API, and a reworked AI page

Try a mini guideA made-up map, not the real zoo plan.

Walk–On foot–Closed paths0

Dijkstra on the path graph · answer only if the word match reaches 0.50

Ask the guideIt answers only from its cards and shows which one.

    The guide cards
    • LanguagesZooPass speaks four languages: French, English, German and Spanish.
    • Your visit planZooPass suggests a visit plan from your profile and how long you can stay.
    • Walk on the mapThe map draws your walk along the zoo paths and picks the shortest one.
    • EventsA page lists the events of the day.
    • SourcesEvery chatbot answer comes with the documents it was written from.
    • This demo mapThe map on this page is made up: an entrance and zones A to F. It is not the real zoo plan.

    How to play

    1. Pick a start and a goal on the map or in the lists. The shortest walk is drawn.
    2. Tap a path to close it. The walk goes around it.
    3. Ask the guide a question. Below the match threshold, it says it does not know.

    Rebuilt in the browser with a made-up map. In ZooPass my teammate built the map and the route planner; my part was the chatbot. It searches the official documents and keeps only passages with a similarity of 0.70 or more. This box only compares words with six cards.

    School project · playable

    R-Type

    A space shooter for several players, made by a team of five. I built the level editor: the tool that decides where the enemies appear.

    A networked remake of the arcade shooter in C++20, by a team of five: custom ECS engine, a server with authority over the game, a binary UDP protocol.

    C++Team of 5Epitech, 2025–26

    You0Player 20Wave01

    Level editorDraw enemies here. They fly in above, right to left.

    wave.json0 enemies, simplified format

    How to play

    1. Move over the screen to fly the white ship.
    2. Player 2, in orange, covers you.
    3. Draw enemies in the grid: they arrive in that shape.

    What I built

    • The level editor, and loading its levels in the game
    • Automatic checks every time the team changed the code
    • The written guide to how players talk to the server
    • The map editor in Python, with JSON export
    • JSON level loading on the game and on the server
    • The CI pipeline on GitHub Actions
    • Protocol and editor documentation, and the server-side speed boost

    The grid is a browser version of the editor I wrote. The real one is a desktop tool.

    School project · playable

    Arcade

    A games console written as software. The same game can change its look while you play. I wrote the Snake game and its three looks.

    A retro game platform in C++17. Games and graphics back ends are shared libraries, loaded with dlopen while the program runs.

    C++Team of 2Epitech, 2024–25

    Drawing with SFML
    Apples0Best0

    How to play

    1. Click a look: Smooth, Pixel or Text. The game doesn't stop.
    2. Player 2 is playing. Press an arrow key to take over.
    3. On a phone, swipe on the screen.

    What I built

    • The Snake game
    • The first version of its three looks
    • The pictures, and the guide for other developers
    • Snake: keyboard control, wrapping edges, score
    • The first version of all three renderers: SFML, SDL2, ncurses
    • Sprites for SFML and SDL2, and the interface documentation

    The dotted line is the route Player 2 has planned to the apple.Redrawn for the browser: one game state, three renderers. Player 2 plans its route with a breadth-first search.

    School project · playable

    Jetpack

    A two-player race over the network. I wrote the referee: the server that knows where each player is, who took which coin and who hit what.

    A multiplayer runner. A TCP server in C runs the game with poll(), and a graphical client in C++ displays it.

    CTeam of 3Epitech, 2024–25

    Coins0Levels cleared0

    What the referee knows right now

    Position
    0, 0
    Coins
    0
    Status
    Flying

    Map filee = obstacle, c = coin

    Server logone tick every 100 ms

    How to play

    1. Hold the mouse button on the screen, or the space bar, to fly up.
    2. Let go to drop.
    3. Grab the coins, avoid the lasers.

    What I built

    • The server and its connections to the players
    • Reading the level file
    • Coins, obstacles and collisions
    • Deciding who wins and who loses
    • The server: connections and players, with poll()
    • Loading the ASCII map and scaling it to 1920 by 1080
    • Coins, obstacles, collisions and scrolling
    • Win and lose conditions

    The box under the game shows the referee's numbers, live.The panels under the game are the server's side. Message names are the real ones; the values are computed here.

    School project · playable

    Zappy

    A network game: AI players walk on a small round world, pick up food and talk to each other. Every move is a text command sent to one server.

    A TCP server in C with a poll() loop, AI clients in C++ and a 3D client with raylib. Each client has a queue of up to 10 commands, each one run after a delay set by the frequency (-f).

    CTeam of 5Epitech, 2024–25

    Server viewOne queue per client, 10 places. The first command runs when its bar is full.

    Server speed
    Your food0Player 2 food0Time units0

    Server log← from a client · → to a client · GUI = line for the 3D view

    How to play

    1. Press an arrow key or a button: your command joins the blue queue.
    2. The server runs it when its time is up. Walk to the gold food and take it.
    3. Send more than 10 commands at once and the server answers ko.

    What I built

    • The server that every AI player and the 3D view connect to.
    • The waiting line of commands for each player, with its timing.
    • Walking forward, and sending a message to all the other players.
    • Server structures, the socket and poll() loop, client connection and team checks, argument parsing.
    • Graphical protocol commands: msz, tna, bct, mct, ppo, pnw.
    • The deferred command queue of each client: 10 places, run time from the frequency.
    • Forward, Broadcast and Connect_nbr, memory leak fixes, and a network class in the 3D client.

    Rebuilt for the browser: a simplified copy of the server rules runs in this page. The real server is a C program that talks to its clients over TCP.

    School project · playable

    Corewar

    Two small programs, called champions, share one block of memory and try to outlast each other. A program that stops saying "live" is out.

    A virtual machine in C: it loads compiled champions (.cor), places them in a shared circular arena and runs their instructions cycle by cycle, with a delay per instruction and a periodic live check.

    CTeam of 2Epitech, 2023–24

    Your champion

    Instruction under your first process

    Address
    -
    Bytes
    -

    -

    Cycle0Cycles to die0Processes0Last live-

    Memory around your process

    How to play

    1. Pick a champion. Player 2 picks the other one.
    2. Watch both write into the shared memory. A program that stops saying live is removed.
    3. Pause, then Step, to read the instruction your program runs next.

    What I built

    • Loading each champion from its file and placing it in the shared memory.
    • Reading each instruction from the bytes, then running it after its delay.
    • Keeping track of who said live, to know who is still in the game.
    • Reading the .cor champions and converting between decimal and hexadecimal.
    • Creating the arena and placing the champions in it.
    • Decoding instructions, saving each live, and the and, or, xor and aff instructions.
    • Instruction delays and error handling.

    Rebuilt for the browser with a smaller instruction set and three champions written for this page. The real machine is in C and runs compiled .cor files.

    School project · playable

    Whanos

    A machine that builds apps by itself. Push your code, it finds the language, builds a Docker image and stores it, ready to run.

    A CI/CD setup: Jenkins detects the language of a repository on each new commit, builds an image from a base or standalone Dockerfile, and pushes it to a private registry. Ansible installs Jenkins and the registry.

    DockerJenkinsTeam of 2Epitech, 2025–26

    Images0Stopped0

    Your repositoryPick a language, or tick files yourself.

    Files in the repository

    Jenkins log

    How to play

    1. Pick a language card, or tick the files of your repository.
    2. Push a commit and watch each step, with the Jenkins log.
    3. Try two languages at once, no language file, or the same commit twice.

    What I built

    • The ten Docker images: one base and one standalone image for each of the five languages
    • The Befunge image, which builds its own interpreter from source
    • The guide that explains how to build and use the images
    • Ten Dockerfiles, Dockerfile.base and Dockerfile.standalone, for C, Java, JavaScript, Python and Befunge
    • Multi-stage builds: compile in one image, run in a smaller one; cfunge built with cmake for Befunge
    • docs/docker_image.md: build commands, rules for each image, repository layout

    Replayed in your browser: nothing is really built. The detection rules, the build choice and the Dockerfile steps come from the project. The Kubernetes deployment step is not shown because it was not finished.

    School project · playable

    Raytracer

    A program that draws 3D pictures by following rays of light. You describe a scene in a text file; it reads it and paints the image pixel by pixel.

    A C++20 ray tracer. A libconfig++ scene file (camera, primitives, lights) is read into a Scene; each pixel sends a ray, finds the closest object and lights it with ambient and directional lights. The output is a PPM image.

    C++20libconfig++Team of 4Epitech, 2024–25

    Pass1/4Rays0

    scene.cfgEdit it: the picture follows.

    How to play

    1. Change a number in the scene file. The picture redraws, rough first, then sharp.
    2. Break the file on purpose: the error shows the line and what is wrong.
    3. Player 2 moves the light, a sphere and the camera until you start typing.

    What I built

    • The part that reads the scene file: camera, spheres, planes and lights
    • The Scene class that holds the camera, the shapes and the lights
    • Scene parsing with libconfig++: camera (resolution, position, rotation, field of view), spheres, planes, ambient and directional lights
    • The Scene class: one container for the camera, the primitives and the lights
    • Shapes created through the team's PrimitiveBuilder

    Rebuilt in the browser. The scene format follows the project's parser. The extra checks and the small renderer drawing the picture were written for this page, with shadows the original did not have.

    School project · playable

    Minishell

    A command line shell, like the one in a terminal. Type a command: the shell finds the program, runs it and shows the result.

    A tcsh-like shell in C: a getline prompt loop, programs found through PATH and run with fork, execve and waitpid, built-ins, redirections and a pipe with dup2.

    CSoloEpitech, 2023–24

    Tab completes · ↑ ↓ history · Ctrl+L clears

    Built-inscd · env · setenv · unsetenv · exit

    Programs in /binls · cat · echo · pwd · grep · wc · head · sort · clear

    How to play

    1. Click the terminal, type a command and press Enter.
    2. Send output to a file with > or >>, or into another command with |.
    3. Type cat << END, a few lines, then END: the shell reads them as input.

    What I built

    • The prompt loop: read a line, run it, show the prompt again.
    • Finding programs in the folders of PATH and running them.
    • The built-in commands: cd, env, setenv, unsetenv, exit.
    • Sending output to files, reading text typed after <<, and passing one command's output to the next.
    • Prompt "$> " read with getline; fork, execve and waitpid; a message when the program crashes (Segmentation fault, Floating exception).
    • cd with a path, no argument (HOME) and cd -, updating PWD and OLDPWD; setenv with name checks, unsetenv, env, exit.
    • Redirections > and >> and the << heredoc with dup2 and pipe; the ; separator.
    • A pipe between two commands, and my own printf library.

    Rebuilt for the browser: a small copy of the shell rules runs in this page, with a pretend file system and a few programs. The real shells are C programs that run real ones.

    School project · playable

    Wolfram

    A row of cells where each cell lives or dies from its two neighbours. One number, the rule, decides everything, and simple rules draw surprising patterns.

    An elementary cellular automaton in Haskell: command line options (--rule, --start, --lines, --window, --move), the next generation from each rule, and a centred display with "*".

    HaskellSoloEpitech, 2024–25

    Rule30

    The rule, cell by cellFor each group of three cells, the cell below lives or not. Click one to flip it.

    Try

    What the terminal prints (first lines)

    How to play

    1. Move the slider or pick a rule: 30 looks random, 90 draws triangles, 110 grows structures.
    2. Click the small boxes to flip one part of the rule.
    3. Or type the command yourself, with the same options as the real program.

    What I built

    • Reading the options typed after the program name, and refusing wrong ones.
    • Computing each new line of cells from the line above.
    • Printing the lines centred in the window, with stars.
    • Argument parsing: --rule (required), --start, --lines, --window (80 by default), --move; exit code 84 on a bad argument.
    • The next generation for rules 30, 90 and 110.
    • The display loop, and the Stack project setup.

    Rebuilt for the browser. The original Haskell program accepts rules 30, 90 and 110; this page runs any rule from 0 to 255.

    School project · playable

    myPaint

    A small paint program, made by two. You draw with a pencil on a dark board, pick a colour and a size, erase, open the help and save the drawing as an image.

    C with CSFML. A 1920 by 1080 window with a toolbar. The pencil stacks circles while the button is held; the eraser paints with the board colour. The board is saved to an image file.

    CCSFMLTeam of 2Epitech, 2023–24

    Strokes0

    How to play

    1. Draw on the board: Player 2 steps aside.
    2. Change colour, size or take the eraser in the toolbar.
    3. Save as PNG to keep your drawing.

    What I built

    • The window and the toolbar buttons
    • The colour and pencil size choices, and the eraser
    • The help screen and saving the drawing as an image
    • CSFML window and toolbar: one sprite per button, hit test on click
    • Eight colours, three pencil radii (5, 18, 35 px), an eraser that paints rgb(22, 22, 22)
    • Help overlay shown or hidden, board copied from the window to an image file

    Rebuilt for the browser in TypeScript from the C version: same colours, sizes and eraser. Here the pencil fills the gaps between circles, and the file is a dated PNG instead of test.jpg.

    School project · playable

    Cryptography

    A command-line tool in C that encrypts and decrypts text with three algorithms, made by three. My part: XOR, the hexadecimal conversions and the entry point that picks the algorithm.

    my_pgp in C reads standard input. I wrote XOR in block and stream mode with little-endian byte order, hex to bytes and back, the input reader, and main, which routes to XOR, AES or RSA.

    CTeam of 3Epitech, 2025–26

    Byte by byte: message byte (reversed in its block) XOR key byte

      Encrypted (hex)

      —

      How to play

      1. Type a message and a key.
      2. Switch between block and stream mode, and watch each byte change.
      3. Decrypt it back: XOR with the same key gives the message again.

      What I built

      • XOR encryption, in block mode and in stream mode
      • Turning text into hexadecimal and back
      • The entry point that sends each command to the right algorithm
      • xor_block and xor_stream: bytes reversed per block (little endian), then XOR with the key
      • Stream mode pads the last block with zeros and strips them when decrypting
      • hex_to_bytes and print_hex, a dynamic stdin reader, main routing xor, aes and rsa

      Rebuilt for the browser from the C version, XOR only. XOR with a short repeated key is a classroom cipher: it does not protect real secrets.

      Hackathon · playable

      Nuit de l'Info

      A hackathon night with a team of eight: a web game about the ocean and the human body. I made the login screen's Morse-code input, on purpose a little annoying.

      Angular 19, standalone components. In the login component I wrote the Morse input: key down and key up times give a dot, a dash or a letter gap, decoded live with a Morse table. I also wired the route.

      AngularTypeScriptTeam of 82024–25

      Toy login (nothing is sent or stored)

      Name, in Morse

      Hold the key to type

      Morse table

      • A·–
      • B–···
      • C–·–·
      • D–··
      • E·
      • F··–·
      • G––·
      • H····
      • I··
      • J·–––
      • K–·–
      • L·–··
      • M––
      • N–·
      • O–––
      • P·––·
      • Q––·–
      • R·–·
      • S···
      • T–
      • U··–
      • V···–
      • W·––
      • X–··–
      • Y–·––
      • Z––··

      How to play

      1. Hold the key: short for a dot, longer for a dash.
      2. Hold it one second or more to end the letter.
      3. Read your name in the field, then log in (it is a toy).

      What I built

      • The Morse-code input on the login screen
      • Short press for a dot, long press for a dash, very long for the next letter
      • The live translation into letters, and Backspace to fix a mistake
      • keydown and keyup on Space measure the press: under 200 ms a dot, under 800 ms a dash, 1 s or more a letter gap
      • A Morse table reversed into a lookup, decoding letter by letter on every press
      • The component template and style, and the route, later moved to provideRouter

      Rebuilt for the browser from the Angular version, with the same timings. The Dot, Dash and Next letter buttons are extra on this page. There is no account and no password.

      All 33 projects

      What each one is and the part I wrote.

        Hedi Bannour

        About me

        I like the whole road: finding the problem, building the thing, and putting it in people's hands.

        I studied maths and computer science at the University of Strasbourg, then joined Epitech in 2023 to learn by building. Since then: 33 projects, five internships, freelance work, and three companies started. I speak French, Arabic and English.

        Before code In high school at Lycée Pierre Mendès France in Tunis, I ran a small online shop: orders through Facebook, delivered by hand, products sourced on request through my network. After my baccalaureate in science in 2020, I started maths and computer science at the University of Strasbourg.

        1. 2016–20Lycée Pierre Mendès France, Tunis, and a first online shop
        2. 2020–23University of Strasbourg, maths and computer science
        3. 2023–Epitech, software engineering, class of 2028
        4. 2023–Freelance developer
        5. 2024–26Five internships: SN Perfect, Infolog, DataScale AI, Meosis, SN Perfect again
        6. 2025–26Founder: Émile, then Tabeebi; co-founder of Nearchon
        7. 2027Exchange at Cal State San Marcos, California
        StackTypeScript, Python, C, C++, C#, Haskell, SQL. Next.js and React, FastAPI, Supabase and PostgreSQL, Cloudflare, Docker, GitHub Actions.
        AIThe system around the model: retrieval with sources (RAG), agents and tools, context management, evaluation.
        SecuritySix security units at Epitech, including two solo security projects (a CTF and TryHackMe rooms). HackTheBox Season 9: Silver tier, 3 machines fully compromised.

        Let's talk.

        I'm at Cal State San Marcos, north of San Diego, from January 18 to August 13, 2027. Tell me what you're building.

        The 60-second version

        Hedi Bannour

        AI product engineer and founder. I take an AI product from the idea to a working system: the interface, the back end, and everything around the language model.

        Founder

        Work

        Projects

        Stack

        TypeScript, Python, C, C++, C#, Haskell, SQL. Next.js and React, FastAPI, Supabase and PostgreSQL, Cloudflare, Docker, GitHub Actions. RAG, agents and tools, evaluation. French, Arabic, English.

        Message me on LinkedIn
        Player 2