v8.0 · 8 years shipping, now layering AI agents

I build AI-powered tools on top of 8 years of production fullstack work.

Senior fullstack engineer (PHP / Laravel / Flutter). Now bringing Claude SDK and open-source LLMs to the e-commerce and SMB problems I've been solving for nearly a decade.

$ npm i @anthropic-ai/sdk·Available for FT remote & freelance·FR / EN
app/api/agent/route.ts
import Anthropic from "@anthropic-ai/sdk";

const claude = new Anthropic();

const reply = await claude.messages.create({
  model: "claude-opus-4-7",
  tools: shopTools,        // search_orders, refund...
  system: shopContext(),   // catalog, policies, FAQs
  messages: [{
    role: "user",
    content: "Last week's PrestaShop refunds over €100?",
  }],
});

// → agent reasons, calls tools, returns the answer.
AiSupportController.php
// app/Http/Controllers/AiSupportController.php

public function ask(Request $request): JsonResponse
{
    $answer = $this->claude->messages()->create([
        'model'    => 'claude-sonnet-4-6',
        'system'   => $this->shopContext(),
        'tools'    => $this->shopTools(),
        'messages' => [
            ['role' => 'user', 'content' => $request->prompt],
        ],
    ]);

    return response()->json(['answer' => $answer->content]);
}
claude_scorer.py
# career_os/scorer/claude_scorer.py

def score_job(job: Job) -> JobScore:
    prompt = render_scorer_prompt(job, profile=USER_PROFILE)

    resp = claude.messages.create(
        model="claude-sonnet-4-6",
        system=SYSTEM_PROMPT,
        messages=[{"role": "user", "content": prompt}],
        max_tokens=512,
    )

    return parse_score(resp.content[0].text)
    # → {"fit": 87, "pros": [...], "cons": [...], "angle": "..."}
career-os · cli
$ career-os fetch
  ✓ 224 jobs from 3 sources

$ career-os score
  ✓ scored 224 jobs · top fit: 92

$ career-os draft
  ✓ drafted 4 outreach emails

$ career-os digest --send
  ✓ sent to me@bak-dev.com
0
years_in_production
Shipping PHP / Laravel / Flutter since 2018.
0
active_stacks
PHP · Laravel · Flutter · Vue · Python — daily rotation.
0h
reply_time
First response · email & LinkedIn · business days.
// integrations

Stack I work with daily

Anthropic
OpenAI
Ollama
Hugging Face
Laravel
PHP
Python
PrestaShop
Flutter
Dart
Vue
Next.js
TypeScript
Tailwind
Firebase
SQLite
// what I build

From prompt to production endpoint.

I don't hand you a notebook and a wish. I ship the full stack around the model — typed APIs, queues, observability, deploys.

01

Plug AI into an existing stack

Bolt Claude or an open-source LLM onto your Laravel / PrestaShop / Vue / Flutter app without a rewrite. Tool use, prompt caching, structured output — production patterns.

app/api/agent/route.ts
import Anthropic from "@anthropic-ai/sdk";

const claude = new Anthropic();

const reply = await claude.messages.create({
  model: "claude-opus-4-7",
  tools: shopTools,        // search_orders, refund...
  system: shopContext(),   // catalog, policies, FAQs
  messages: [{
    role: "user",
    content: "Last week's PrestaShop refunds over €100?",
  }],
});

// → agent reasons, calls tools, returns the answer.
02

Build the controller-layer that handles it

Eight years of PHP/Laravel in production. I design the endpoint, the queue, the rate limits, and the failure modes — not just the prompt.

AiSupportController.php
// app/Http/Controllers/AiSupportController.php

public function ask(Request $request): JsonResponse
{
    $answer = $this->claude->messages()->create([
        'model'    => 'claude-sonnet-4-6',
        'system'   => $this->shopContext(),
        'tools'    => $this->shopTools(),
        'messages' => [
            ['role' => 'user', 'content' => $request->prompt],
        ],
    ]);

    return response()->json(['answer' => $answer->content]);
}
03

Ship the full agent system

Career-OS is a working example: Python scrapers, Claude scorer with prompt caching, SQLite store, outreach drafter, CLI. MIT-licensed, every commit public.

claude_scorer.py
# career_os/scorer/claude_scorer.py

def score_job(job: Job) -> JobScore:
    prompt = render_scorer_prompt(job, profile=USER_PROFILE)

    resp = claude.messages.create(
        model="claude-sonnet-4-6",
        system=SYSTEM_PROMPT,
        messages=[{"role": "user", "content": prompt}],
        max_tokens=512,
    )

    return parse_score(resp.content[0].text)
    # → {"fit": 87, "pros": [...], "cons": [...], "angle": "..."}
// why me specifically

Not a prompt jockey, not a generic agency.

CapabilityGeneric AI agencySolo prompt engineerWorking with Akram
8+ years shipping production code
Real e-commerce / SMB domain (PrestaShop, Laravel)
End-to-end ownership (not just prompts)
Claude SDK + OSS LLMs (Ollama, vLLM)
Ships in public — code on GitHub
French + English fluent
Direct line, no account-manager layer
Currently building

Career-OS — an AI-agent dashboard, in public.

Crawls remote + freelance opportunities, scores fit with Claude, drafts outreach, tracks the pipeline end-to-end. Python, Claude SDK, SQLite. MIT-licensed.

pythonclaude-sdksqliteclimit
akrambak/career-os
# quick start
$ pip install -e ".[dev]"
$ career-os fetch
$ career-os score
// get in touch

Let's ship something together.

Hiring for a senior fullstack / AI role, or need a Claude-SDK agent bolted onto your e-commerce stack? Send the brief.

Akram Bakhouche — Fullstack + AI engineer for e-commerce & SMBs