diff --git a/public/assets/images/projects/dns.surf.png b/src/assets/images/projects/dns.surf.png similarity index 100% rename from public/assets/images/projects/dns.surf.png rename to src/assets/images/projects/dns.surf.png diff --git a/public/assets/images/projects/email.ml.png b/src/assets/images/projects/email.ml.png similarity index 100% rename from public/assets/images/projects/email.ml.png rename to src/assets/images/projects/email.ml.png diff --git a/public/assets/images/projects/html.zone.png b/src/assets/images/projects/html.zone.png similarity index 100% rename from public/assets/images/projects/html.zone.png rename to src/assets/images/projects/html.zone.png diff --git a/src/components/about-experience.astro b/src/components/about-experience.astro deleted file mode 100644 index 3bed43d..0000000 --- a/src/components/about-experience.astro +++ /dev/null @@ -1,22 +0,0 @@ ---- -const { logo, dates, role, company, description } = Astro.props; ---- - -
-
- {company} -
- -

- {dates} -

-

{role}

-

{company}

-

- {description} -

-
diff --git a/src/components/code/ExperienceCard.astro b/src/components/code/ExperienceCard.astro new file mode 100644 index 0000000..8211b9f --- /dev/null +++ b/src/components/code/ExperienceCard.astro @@ -0,0 +1,79 @@ +--- +import SkillBadge from './SkillBadge.astro'; + +interface Props { + role: string; + company: string; + companyUrl?: string; + location?: string; + startDate: string; + endDate?: string; + technologies?: string[]; + description: string; + type: string; + locale?: string; +} + +const { role, company, companyUrl, location, startDate, endDate, technologies, description, type, locale = 'fr' } = Astro.props; + +const presentLabel: Record = { fr: "Présent", en: "Present", ar: "الحاضر" }; + +function formatPeriod(start: string, end: string | undefined, lang: string): string { + const formatMonth = (dateStr: string) => { + const [year, month] = dateStr.split('-'); + const date = new Date(parseInt(year), parseInt(month) - 1); + const locales: Record = { fr: 'fr-FR', en: 'en-US', ar: 'ar-SA' }; + return date.toLocaleDateString(locales[lang] || 'fr-FR', { year: 'numeric', month: 'short' }); + }; + const startFormatted = formatMonth(start); + const endFormatted = end ? formatMonth(end) : presentLabel[lang] || presentLabel.fr; + return `${startFormatted} — ${endFormatted}`; +} + +const period = formatPeriod(startDate, endDate, locale); +const isOngoing = !endDate; + +const typeIcons: Record = { + employment: '🏢', + freelance: '💼', + teaching: '🎓', + community: '🤝', + entrepreneurship: '🚀', +}; +--- + +
+
+ {isOngoing &&
} +
+ +
+ {typeIcons[type] || '💼'} {period} + {location && · {location}} +
+ +

+ {role} +

+

+ {companyUrl ? ( + {company} + ) : ( + company + )} +

+ +
+ + {technologies && technologies.length > 0 && ( +
+ {technologies.map((tech) => ( + + {tech} + + ))} +
+ )} +
diff --git a/src/components/code/ExperienceTimeline.astro b/src/components/code/ExperienceTimeline.astro new file mode 100644 index 0000000..dbc0a6b --- /dev/null +++ b/src/components/code/ExperienceTimeline.astro @@ -0,0 +1,39 @@ +--- +import ExperienceCard from './ExperienceCard.astro'; + +interface Experience { + role: string; + company: string; + companyUrl?: string; + location?: string; + startDate: string; + endDate?: string; + technologies?: string[]; + type: string; + renderedHtml: string; +} + +interface Props { + experiences: Experience[]; + locale?: string; +} + +const { experiences, locale = 'fr' } = Astro.props; +--- + +
+ {experiences.map((exp) => ( + + ))} +
diff --git a/src/components/code/FeaturedRecommendation.astro b/src/components/code/FeaturedRecommendation.astro new file mode 100644 index 0000000..e173260 --- /dev/null +++ b/src/components/code/FeaturedRecommendation.astro @@ -0,0 +1,48 @@ +--- +import { Image } from "astro:assets"; +import type { ImageMetadata } from "astro"; + +interface Props { + author: string; + authorRole: string; + company: string; + text: string; + avatar?: ImageMetadata; +} + +const { author, authorRole, company, text, avatar } = Astro.props; + +const truncated = text.length > 200 ? text.slice(0, 200).replace(/\s+\S*$/, '') + '...' : text; + +const initials = author + .split(' ') + .map((n) => n[0]) + .slice(0, 2) + .join('') + .toUpperCase(); +--- + +
+

+ "{truncated}" +

+
+ {avatar ? ( + {author} + ) : ( +
+ {initials} +
+ )} + + {author} + · {authorRole}, {company} + +
+
diff --git a/src/components/code/NavigationCard.astro b/src/components/code/NavigationCard.astro new file mode 100644 index 0000000..2108cee --- /dev/null +++ b/src/components/code/NavigationCard.astro @@ -0,0 +1,23 @@ +--- +interface Props { + title: string; + description: string; + href: string; + icon: string; +} + +const { title, description, href, icon } = Astro.props; +--- + + +
{icon}
+

+ {title} +

+

+ {description} +

+
diff --git a/src/components/code/ProjectCard.astro b/src/components/code/ProjectCard.astro new file mode 100644 index 0000000..a68122e --- /dev/null +++ b/src/components/code/ProjectCard.astro @@ -0,0 +1,57 @@ +--- +interface Props { + title: string; + description: string; + technologies?: string[]; + url?: string; + github?: string; + featured?: boolean; +} + +const { title, description, technologies, url, github, featured = false } = Astro.props; +--- + +
+
+

+ {title} +

+ {featured && ( + + Featured + + )} +
+ +

+ {description} +

+ + {technologies && technologies.length > 0 && ( +
+ {technologies.map((tech) => ( + + {tech} + + ))} +
+ )} + +
+ {url && ( + + Voir le site → + + )} + {github && ( + + GitHub → + + )} +
+
diff --git a/src/components/code/RecommendationCard.astro b/src/components/code/RecommendationCard.astro new file mode 100644 index 0000000..efa2388 --- /dev/null +++ b/src/components/code/RecommendationCard.astro @@ -0,0 +1,66 @@ +--- +import { Image } from "astro:assets"; +import type { ImageMetadata } from "astro"; + +interface Props { + author: string; + authorRole: string; + company: string; + text: string; + date: Date; + avatar?: ImageMetadata; + lang?: string; +} + +const { author, authorRole, company, text, date, avatar, lang = 'fr' } = Astro.props; + +const dateLocales: Record = { fr: 'fr-FR', en: 'en-US', ar: 'ar-SA' }; +const formattedDate = date.toLocaleDateString(dateLocales[lang] || 'fr-FR', { + year: 'numeric', + month: 'long', +}); + +const initials = author + .split(' ') + .map((n) => n[0]) + .slice(0, 2) + .join('') + .toUpperCase(); + +const colors = [ + 'from-violet-400 to-purple-500', + 'from-fuchsia-400 to-pink-500', + 'from-indigo-400 to-blue-500', + 'from-purple-400 to-indigo-500', + 'from-pink-400 to-rose-500', +]; +const colorIndex = author.split('').reduce((acc, c) => acc + c.charCodeAt(0), 0) % colors.length; +const avatarGradient = colors[colorIndex]; +--- + +
+ + +

+ +

+ {avatar ? ( + {author} + ) : ( +
+ {initials} +
+ )} + + {author} + {authorRole} · {company} + {formattedDate} + +
+
diff --git a/src/components/code/SkillBadge.astro b/src/components/code/SkillBadge.astro new file mode 100644 index 0000000..9aaee9f --- /dev/null +++ b/src/components/code/SkillBadge.astro @@ -0,0 +1,11 @@ +--- +interface Props { + name: string; +} + +const { name } = Astro.props; +--- + + + {name} + diff --git a/src/components/code/SkillCategory.astro b/src/components/code/SkillCategory.astro new file mode 100644 index 0000000..16c98ee --- /dev/null +++ b/src/components/code/SkillCategory.astro @@ -0,0 +1,22 @@ +--- +import SkillBadge from './SkillBadge.astro'; + +interface Props { + name: string; + skills: string[]; +} + +const { name, skills } = Astro.props; +--- + +
+

+ + {name} +

+
+ {skills.map((skill) => ( + + ))} +
+
diff --git a/src/components/home/projects.astro b/src/components/home/projects.astro deleted file mode 100644 index ba129fd..0000000 --- a/src/components/home/projects.astro +++ /dev/null @@ -1,37 +0,0 @@ ---- -import projects from "../../data/projects.json"; -import Button from "../button.astro"; -import Project from "../project.astro"; ---- - -
-

- My Projects -

-

- Here are some of my recent projects. I'm always working on something new, so - check back often! -

-
- { - projects.map((project) => { - return ( - - ) - }) - } -
- -
-
-
diff --git a/src/components/home/separator.astro b/src/components/home/separator.astro deleted file mode 100644 index 6f8a92a..0000000 --- a/src/components/home/separator.astro +++ /dev/null @@ -1,37 +0,0 @@ ---- -const { text } = Astro.props; ---- - -
-
-
-
-
-
-
-
-

{text}

-
- -
-
-
diff --git a/src/components/home/writings.astro b/src/components/home/writings.astro deleted file mode 100644 index d3a3ccd..0000000 --- a/src/components/home/writings.astro +++ /dev/null @@ -1,87 +0,0 @@ ---- -import Button from "../button.astro"; -import PostsLoop from "../posts-loop.astro"; - -const feed = "https://feed.miantiao.me/"; ---- - -
-

- My Writings -

-

- Along with coding I also like to write about life and technology. Here are - some of my recent posts. -

- -
-
-
- - -
-
-
-
-
-
- -

- Subscribe my blog -

-
-

- Get my blog updates via Feedly, Inoreader or RSS. -

-
- - -
-
-
-
-
-
diff --git a/src/components/project.astro b/src/components/project.astro deleted file mode 100644 index 12b9ba1..0000000 --- a/src/components/project.astro +++ /dev/null @@ -1,65 +0,0 @@ ---- -const { name, description, url, image } = Astro.props; ---- - - - - - - - - - - - {name} - - - {description} - - - diff --git a/src/content.config.ts b/src/content.config.ts index 06b8dfa..2fd9e39 100644 --- a/src/content.config.ts +++ b/src/content.config.ts @@ -33,12 +33,11 @@ const blogCollection = defineCollection({ }); const projectsCollection = defineCollection({ - loader: glob({ pattern: "**/*.md", base: "./src/content/projects" }), + loader: glob({ pattern: "**/*.md", base: "./src/content/projects", ...stripExtension('md') }), schema: z.object({ title: z.string(), description: z.string(), date: z.date(), - dateFormatted: z.string(), category: z.enum(['dev', 'comedy', 'photo']), technologies: z.array(z.string()).optional(), url: z.string().url().optional(), @@ -48,6 +47,39 @@ const projectsCollection = defineCollection({ featured: z.boolean().default(false), draft: z.boolean().default(false), lang: z.enum(['fr', 'en', 'ar']).default('fr'), + }).transform((data) => ({ + ...data, + dateFormatted: formatDate(data.date, data.lang), + })), +}); + +const experiencesCollection = defineCollection({ + loader: glob({ pattern: "**/*.md", base: "./src/content/experiences", ...stripExtension('md') }), + schema: z.object({ + role: z.string(), + company: z.string(), + companyUrl: z.string().url().optional(), + location: z.string().optional(), + startDate: z.string(), + endDate: z.string().optional(), + technologies: z.array(z.string()).optional(), + type: z.enum(['employment', 'freelance', 'teaching', 'community', 'entrepreneurship']), + featured: z.boolean().default(false), + draft: z.boolean().default(false), + lang: z.enum(['fr', 'en', 'ar']).default('fr'), + }), +}); + +const recommendationsCollection = defineCollection({ + loader: glob({ pattern: "**/*.md", base: "./src/content/recommendations" }), + schema: ({ image }) => z.object({ + author: z.string(), + authorRole: z.string(), + company: z.string(), + avatar: image().optional(), + date: z.date(), + relationship: z.string().optional(), + lang: z.enum(['fr', 'en']).default('fr'), }), }); @@ -97,6 +129,8 @@ const photoCategoriesCollection = defineCollection({ export const collections = { blog: blogCollection, projects: projectsCollection, + experiences: experiencesCollection, + recommendations: recommendationsCollection, talks: talksCollection, photoBlogPosts: photoBlogPostsCollection, photoCategories: photoCategoriesCollection, diff --git a/src/content/experiences/araymond.ar.md b/src/content/experiences/araymond.ar.md new file mode 100644 index 0000000..13c8d53 --- /dev/null +++ b/src/content/experiences/araymond.ar.md @@ -0,0 +1,13 @@ +--- +role: "مهندس معماري للواجهات" +company: "ARaymond" +companyUrl: "https://www.araymond.com/" +location: "غرونوبل" +startDate: "2022-01" +endDate: "2023-01" +technologies: ["TypeScript", "React.js", "Redux", "Nx", "Vite"] +type: "freelance" +lang: "ar" +--- + +مهندس معماري للواجهات الأمامية للتطبيقات الداخلية لشركة رائدة عالميًا في التثبيت الصناعي. إعداد monorepo Nx، الانتقال إلى Vite، تحديد معايير تطوير الواجهات. diff --git a/src/content/experiences/araymond.en.md b/src/content/experiences/araymond.en.md new file mode 100644 index 0000000..171092d --- /dev/null +++ b/src/content/experiences/araymond.en.md @@ -0,0 +1,13 @@ +--- +role: "Frontend Architect" +company: "ARaymond" +companyUrl: "https://www.araymond.com/" +location: "Grenoble" +startDate: "2022-01" +endDate: "2023-01" +technologies: ["TypeScript", "React.js", "Redux", "Nx", "Vite"] +type: "freelance" +lang: "en" +--- + +Frontend architect for internal applications at a world leader in industrial fastening. Set up Nx monorepo, migration to Vite, definition of frontend development standards. diff --git a/src/content/experiences/araymond.md b/src/content/experiences/araymond.md new file mode 100644 index 0000000..1548ee5 --- /dev/null +++ b/src/content/experiences/araymond.md @@ -0,0 +1,13 @@ +--- +role: "Architecte frontend" +company: "ARaymond" +companyUrl: "https://www.araymond.com/" +location: "Grenoble" +startDate: "2022-01" +endDate: "2023-01" +technologies: ["TypeScript", "React.js", "Redux", "Nx", "Vite"] +type: "freelance" +lang: "fr" +--- + +Architecte frontend pour les applications internes d'un leader mondial de la fixation industrielle. Mise en place d'un monorepo Nx, migration vers Vite, définition des standards de développement frontend. diff --git a/src/content/experiences/champollion.ar.md b/src/content/experiences/champollion.ar.md new file mode 100644 index 0000000..e7c1a86 --- /dev/null +++ b/src/content/experiences/champollion.ar.md @@ -0,0 +1,12 @@ +--- +role: "أستاذ هندسة البرمجيات" +company: "جامعة شامبوليون" +companyUrl: "https://www.univ-jfc.fr/" +location: "ألبي" +startDate: "2019-09" +technologies: ["TypeScript", "JavaScript", "Node.js", "TDD", "Clean Code"] +type: "teaching" +lang: "ar" +--- + +أستاذ هندسة البرمجيات في ماستر AMINJ وليسانس معلوماتية. تدريس أفضل ممارسات التطوير، TDD، الكود النظيف، هندسة البرمجيات. diff --git a/src/content/experiences/champollion.en.md b/src/content/experiences/champollion.en.md new file mode 100644 index 0000000..cfac11c --- /dev/null +++ b/src/content/experiences/champollion.en.md @@ -0,0 +1,12 @@ +--- +role: "Software Engineering Professor" +company: "Université Champollion" +companyUrl: "https://www.univ-jfc.fr/" +location: "Albi" +startDate: "2019-09" +technologies: ["TypeScript", "JavaScript", "Node.js", "TDD", "Clean Code"] +type: "teaching" +lang: "en" +--- + +Software engineering professor in Master AMINJ and Bachelor in Computer Science. Teaching development best practices, TDD, Clean Code, software architecture. diff --git a/src/content/experiences/champollion.md b/src/content/experiences/champollion.md new file mode 100644 index 0000000..24dd01b --- /dev/null +++ b/src/content/experiences/champollion.md @@ -0,0 +1,12 @@ +--- +role: "Enseignant en génie logiciel" +company: "Université Champollion" +companyUrl: "https://www.univ-jfc.fr/" +location: "Albi" +startDate: "2019-09" +technologies: ["TypeScript", "JavaScript", "Node.js", "TDD", "Clean Code"] +type: "teaching" +lang: "fr" +--- + +Enseignant en génie logiciel en Master AMINJ et Licence informatique. Cours sur les bonnes pratiques de développement, TDD, Clean Code, architecture logicielle. diff --git a/src/content/experiences/dismoi.ar.md b/src/content/experiences/dismoi.ar.md new file mode 100644 index 0000000..edb66be --- /dev/null +++ b/src/content/experiences/dismoi.ar.md @@ -0,0 +1,13 @@ +--- +role: "حرفي برمجيات / مؤسس مشارك" +company: "DisMoi" +companyUrl: "https://github.com/dis-moi" +location: "عن بُعد" +startDate: "2019-01" +endDate: "2021-06" +technologies: ["TypeScript", "React.js", "Redux", "Web Extension", "Node.js"] +type: "entrepreneurship" +lang: "ar" +--- + +مؤسّس مشارك ومطوّر رئيسي لـ DisMoi، إضافة متصفّح في مجال التكنولوجيا المدنية تتيح إضافة معلومات سياقية على أي صفحة ويب. مشروع مفتوح المصدر مدعوم من منظمات التحقق من المعلومات. diff --git a/src/content/experiences/dismoi.en.md b/src/content/experiences/dismoi.en.md new file mode 100644 index 0000000..1dcc0b4 --- /dev/null +++ b/src/content/experiences/dismoi.en.md @@ -0,0 +1,13 @@ +--- +role: "Software Craftsman / Cofounder" +company: "DisMoi" +companyUrl: "https://github.com/dis-moi" +location: "Remote" +startDate: "2019-01" +endDate: "2021-06" +technologies: ["TypeScript", "React.js", "Redux", "Web Extension", "Node.js"] +type: "entrepreneurship" +lang: "en" +--- + +Cofounder and lead developer of DisMoi, a civic tech browser extension that adds contextual information to any web page. Open source project supported by fact-checking organizations. diff --git a/src/content/experiences/dismoi.md b/src/content/experiences/dismoi.md new file mode 100644 index 0000000..728dd9a --- /dev/null +++ b/src/content/experiences/dismoi.md @@ -0,0 +1,13 @@ +--- +role: "Software Craftsman / Cofondateur" +company: "DisMoi" +companyUrl: "https://github.com/dis-moi" +location: "Remote" +startDate: "2019-01" +endDate: "2021-06" +technologies: ["TypeScript", "React.js", "Redux", "Web Extension", "Node.js"] +type: "entrepreneurship" +lang: "fr" +--- + +Cofondateur et développeur principal de DisMoi, une extension navigateur civic tech permettant d'ajouter de l'information contextuelle sur n'importe quelle page web. Projet open source soutenu par des organisations de vérification des faits. diff --git a/src/content/experiences/esn81.ar.md b/src/content/experiences/esn81.ar.md new file mode 100644 index 0000000..ed2ccf0 --- /dev/null +++ b/src/content/experiences/esn81.ar.md @@ -0,0 +1,13 @@ +--- +role: "مدرّس تطوير" +company: "ESN 81" +companyUrl: "https://www.esn81.fr/" +location: "كاستر" +startDate: "2020-09" +endDate: "2021-06" +technologies: ["JavaScript", "Node.js"] +type: "teaching" +lang: "ar" +--- + +تدريس أفضل ممارسات التطوير وNode.js لطلاب التكوين المهني. diff --git a/src/content/experiences/esn81.en.md b/src/content/experiences/esn81.en.md new file mode 100644 index 0000000..91c4f41 --- /dev/null +++ b/src/content/experiences/esn81.en.md @@ -0,0 +1,13 @@ +--- +role: "Development Teacher" +company: "ESN 81" +companyUrl: "https://www.esn81.fr/" +location: "Castres" +startDate: "2020-09" +endDate: "2021-06" +technologies: ["JavaScript", "Node.js"] +type: "teaching" +lang: "en" +--- + +Teaching development best practices and Node.js to vocational training students. diff --git a/src/content/experiences/esn81.md b/src/content/experiences/esn81.md new file mode 100644 index 0000000..24f5a0b --- /dev/null +++ b/src/content/experiences/esn81.md @@ -0,0 +1,13 @@ +--- +role: "Enseignant en développement" +company: "ESN 81" +companyUrl: "https://www.esn81.fr/" +location: "Castres" +startDate: "2020-09" +endDate: "2021-06" +technologies: ["JavaScript", "Node.js"] +type: "teaching" +lang: "fr" +--- + +Enseignement des bonnes pratiques de développement et de Node.js à des étudiants en formation professionnelle. diff --git a/src/content/experiences/ethemis-junior.ar.md b/src/content/experiences/ethemis-junior.ar.md new file mode 100644 index 0000000..7f3ca75 --- /dev/null +++ b/src/content/experiences/ethemis-junior.ar.md @@ -0,0 +1,12 @@ +--- +role: "مطوّر ويب" +company: "eThemis" +location: "فرساي" +startDate: "2002-06" +endDate: "2002-12" +technologies: ["PHP", "JavaScript", "HTML", "MySQL"] +type: "employment" +lang: "ar" +--- + +أوّل منصب كمطوّر. تطوير ويب لشركة نشر برمجيات قانونية. diff --git a/src/content/experiences/ethemis-junior.en.md b/src/content/experiences/ethemis-junior.en.md new file mode 100644 index 0000000..aa5d4ff --- /dev/null +++ b/src/content/experiences/ethemis-junior.en.md @@ -0,0 +1,12 @@ +--- +role: "Web Developer" +company: "eThemis" +location: "Versailles" +startDate: "2002-06" +endDate: "2002-12" +technologies: ["PHP", "JavaScript", "HTML", "MySQL"] +type: "employment" +lang: "en" +--- + +First developer position. Web development for a legal software publishing company. diff --git a/src/content/experiences/ethemis-junior.md b/src/content/experiences/ethemis-junior.md new file mode 100644 index 0000000..e69ddbe --- /dev/null +++ b/src/content/experiences/ethemis-junior.md @@ -0,0 +1,12 @@ +--- +role: "Développeur web" +company: "eThemis" +location: "Versailles" +startDate: "2002-06" +endDate: "2002-12" +technologies: ["PHP", "JavaScript", "HTML", "MySQL"] +type: "employment" +lang: "fr" +--- + +Premier poste de développeur. Développement web pour une société d'édition de logiciels juridiques. diff --git a/src/content/experiences/ethemis-senior.ar.md b/src/content/experiences/ethemis-senior.ar.md new file mode 100644 index 0000000..9ef62a5 --- /dev/null +++ b/src/content/experiences/ethemis-senior.ar.md @@ -0,0 +1,12 @@ +--- +role: "مهندس برمجيات أول" +company: "eThemis" +location: "فرساي" +startDate: "2011-01" +endDate: "2015-12" +technologies: ["PHP", "Symfony", "JavaScript", "MySQL", "Linux"] +type: "employment" +lang: "ar" +--- + +مطوّر أول في شركة نشر برمجيات قانونية. تصميم وتطوير تطبيقات ويب مهنية لمتخصصي القانون. تطبيق الممارسات الأجايل في الفريق. diff --git a/src/content/experiences/ethemis-senior.en.md b/src/content/experiences/ethemis-senior.en.md new file mode 100644 index 0000000..9d11efd --- /dev/null +++ b/src/content/experiences/ethemis-senior.en.md @@ -0,0 +1,12 @@ +--- +role: "Senior Software Engineer" +company: "eThemis" +location: "Versailles" +startDate: "2011-01" +endDate: "2015-12" +technologies: ["PHP", "Symfony", "JavaScript", "MySQL", "Linux"] +type: "employment" +lang: "en" +--- + +Senior developer at a legal software publishing company. Design and development of business web applications for legal professionals. Implementation of agile practices within the team. diff --git a/src/content/experiences/ethemis-senior.md b/src/content/experiences/ethemis-senior.md new file mode 100644 index 0000000..0e8bcf6 --- /dev/null +++ b/src/content/experiences/ethemis-senior.md @@ -0,0 +1,12 @@ +--- +role: "Ingénieur logiciel senior" +company: "eThemis" +location: "Versailles" +startDate: "2011-01" +endDate: "2015-12" +technologies: ["PHP", "Symfony", "JavaScript", "MySQL", "Linux"] +type: "employment" +lang: "fr" +--- + +Développeur senior dans une société d'édition de logiciels juridiques. Conception et développement d'applications web métier pour les professionnels du droit. Mise en place de pratiques agiles dans l'équipe. diff --git a/src/content/experiences/freelance.ar.md b/src/content/experiences/freelance.ar.md new file mode 100644 index 0000000..3becfab --- /dev/null +++ b/src/content/experiences/freelance.ar.md @@ -0,0 +1,12 @@ +--- +role: "مطوّر ويب وبرمجيات" +company: "مستقل" +location: "إيل دو فرانس" +startDate: "2003-01" +endDate: "2006-12" +technologies: ["PHP", "JavaScript", "HTML", "MySQL", "Linux"] +type: "freelance" +lang: "ar" +--- + +تطوير ويب مستقل. إنشاء مواقع وتطبيقات ويب مخصّصة. تطوير مشاريع شخصية: N.Gine (نظام إدارة محتوى خاص)، ICU (منصة مشاركة صور)، Débats.co (نقاش سياسي تعاوني). أفضل مشروع برمجة لدفعة 2003 في UVSQ. diff --git a/src/content/experiences/freelance.en.md b/src/content/experiences/freelance.en.md new file mode 100644 index 0000000..1b9625b --- /dev/null +++ b/src/content/experiences/freelance.en.md @@ -0,0 +1,12 @@ +--- +role: "Web & Software Developer" +company: "Freelance" +location: "Île-de-France" +startDate: "2003-01" +endDate: "2006-12" +technologies: ["PHP", "JavaScript", "HTML", "MySQL", "Linux"] +type: "freelance" +lang: "en" +--- + +Freelance web development. Creation of custom websites and web applications. Development of personal projects: N.Gine (proprietary CMS), ICU (photo sharing platform), Débats.co (collaborative political debate). Best programming project of the 2003 class at UVSQ. diff --git a/src/content/experiences/freelance.md b/src/content/experiences/freelance.md new file mode 100644 index 0000000..7d8a988 --- /dev/null +++ b/src/content/experiences/freelance.md @@ -0,0 +1,12 @@ +--- +role: "Développeur web & logiciel" +company: "Indépendant" +location: "Île-de-France" +startDate: "2003-01" +endDate: "2006-12" +technologies: ["PHP", "JavaScript", "HTML", "MySQL", "Linux"] +type: "freelance" +lang: "fr" +--- + +Développement web en freelance. Création de sites et applications web sur mesure. Développement de projets personnels : N.Gine (CMS propriétaire), ICU (plateforme de partage photo), Débats.co (débat politique collaboratif). Meilleur projet de programmation de la promo 2003 à l'UVSQ. diff --git a/src/content/experiences/go-decision.ar.md b/src/content/experiences/go-decision.ar.md new file mode 100644 index 0000000..8d4fa75 --- /dev/null +++ b/src/content/experiences/go-decision.ar.md @@ -0,0 +1,13 @@ +--- +role: "مدير تقني" +company: "GoBuild (Go-Decision)" +companyUrl: "https://www.gobuild.fr" +location: "ليون" +startDate: "2020-06" +endDate: "2022-01" +technologies: ["TypeScript", "React.js", "Elixir", "PostgreSQL", "Docker"] +type: "employment" +lang: "ar" +--- + +مدير تقني لشركة ناشئة متخصصة في نمذجة المباني. مسؤول عن الهندسة التقنية والتوظيف ومرافقة فريق التطوير. تطبيق ممارسات Software Craftsmanship. diff --git a/src/content/experiences/go-decision.en.md b/src/content/experiences/go-decision.en.md new file mode 100644 index 0000000..f5c9900 --- /dev/null +++ b/src/content/experiences/go-decision.en.md @@ -0,0 +1,13 @@ +--- +role: "CTO" +company: "GoBuild (Go-Decision)" +companyUrl: "https://www.gobuild.fr" +location: "Lyon" +startDate: "2020-06" +endDate: "2022-01" +technologies: ["TypeScript", "React.js", "Elixir", "PostgreSQL", "Docker"] +type: "employment" +lang: "en" +--- + +CTO of a startup specializing in building modeling. Responsible for technical architecture, recruitment and mentoring of the development team. Implementation of Software Craftsmanship practices. diff --git a/src/content/experiences/go-decision.md b/src/content/experiences/go-decision.md new file mode 100644 index 0000000..6ab148d --- /dev/null +++ b/src/content/experiences/go-decision.md @@ -0,0 +1,13 @@ +--- +role: "CTO" +company: "GoBuild (Go-Decision)" +companyUrl: "https://www.gobuild.fr" +location: "Lyon" +startDate: "2020-06" +endDate: "2022-01" +technologies: ["TypeScript", "React.js", "Elixir", "PostgreSQL", "Docker"] +type: "employment" +lang: "fr" +--- + +CTO d'une startup spécialisée dans la modélisation de bâtiments. Responsable de l'architecture technique, du recrutement et de l'accompagnement de l'équipe de développement. Mise en place des pratiques Software Craftsmanship. diff --git a/src/content/experiences/libeo.ar.md b/src/content/experiences/libeo.ar.md new file mode 100644 index 0000000..d10a484 --- /dev/null +++ b/src/content/experiences/libeo.ar.md @@ -0,0 +1,13 @@ +--- +role: "مهندس برمجيات fullstack" +company: "Libeo" +companyUrl: "https://www.libeo.io/" +location: "عن بُعد" +startDate: "2021-01" +endDate: "2021-06" +technologies: ["TypeScript", "React.js", "Node.js", "GraphQL"] +type: "freelance" +lang: "ar" +--- + +تطوير منصة دفع B2B. تحسين جودة الكود وتطبيق ممارسات TDD. diff --git a/src/content/experiences/libeo.en.md b/src/content/experiences/libeo.en.md new file mode 100644 index 0000000..8326bd7 --- /dev/null +++ b/src/content/experiences/libeo.en.md @@ -0,0 +1,13 @@ +--- +role: "Fullstack Software Engineer" +company: "Libeo" +companyUrl: "https://www.libeo.io/" +location: "Remote" +startDate: "2021-01" +endDate: "2021-06" +technologies: ["TypeScript", "React.js", "Node.js", "GraphQL"] +type: "freelance" +lang: "en" +--- + +Development of a B2B payment platform. Code quality improvement and implementation of TDD practices. diff --git a/src/content/experiences/libeo.md b/src/content/experiences/libeo.md new file mode 100644 index 0000000..25733c8 --- /dev/null +++ b/src/content/experiences/libeo.md @@ -0,0 +1,13 @@ +--- +role: "Ingénieur logiciel fullstack" +company: "Libeo" +companyUrl: "https://www.libeo.io/" +location: "Remote" +startDate: "2021-01" +endDate: "2021-06" +technologies: ["TypeScript", "React.js", "Node.js", "GraphQL"] +type: "freelance" +lang: "fr" +--- + +Développement d'une plateforme de paiement B2B. Amélioration de la qualité du code et mise en place de pratiques TDD. diff --git a/src/content/experiences/obat.ar.md b/src/content/experiences/obat.ar.md new file mode 100644 index 0000000..0cbaea6 --- /dev/null +++ b/src/content/experiences/obat.ar.md @@ -0,0 +1,13 @@ +--- +role: "مهندس برمجيات أول" +company: "Obat" +companyUrl: "https://www.obat.fr/" +location: "عن بُعد" +startDate: "2023-02" +endDate: "2024-01" +technologies: ["TypeScript", "React.js", "Node.js", "NestJS", "PostgreSQL"] +type: "freelance" +lang: "ar" +--- + +تطوير تطبيق SaaS لإدارة قطاع البناء. تحسين الهندسة المعمارية وتطبيق أفضل الممارسات (TDD، الكود النظيف). diff --git a/src/content/experiences/obat.en.md b/src/content/experiences/obat.en.md new file mode 100644 index 0000000..cd856e7 --- /dev/null +++ b/src/content/experiences/obat.en.md @@ -0,0 +1,13 @@ +--- +role: "Senior Software Engineer" +company: "Obat" +companyUrl: "https://www.obat.fr/" +location: "Remote" +startDate: "2023-02" +endDate: "2024-01" +technologies: ["TypeScript", "React.js", "Node.js", "NestJS", "PostgreSQL"] +type: "freelance" +lang: "en" +--- + +Development of a SaaS management application for the construction industry. Architecture improvement and implementation of best practices (TDD, Clean Code). diff --git a/src/content/experiences/obat.md b/src/content/experiences/obat.md new file mode 100644 index 0000000..ba7c7bd --- /dev/null +++ b/src/content/experiences/obat.md @@ -0,0 +1,13 @@ +--- +role: "Ingénieur logiciel senior" +company: "Obat" +companyUrl: "https://www.obat.fr/" +location: "Remote" +startDate: "2023-02" +endDate: "2024-01" +technologies: ["TypeScript", "React.js", "Node.js", "NestJS", "PostgreSQL"] +type: "freelance" +lang: "fr" +--- + +Développement d'une application SaaS de gestion pour le secteur du bâtiment. Amélioration de l'architecture et mise en place de bonnes pratiques (TDD, Clean Code). diff --git a/src/content/experiences/team-logics.ar.md b/src/content/experiences/team-logics.ar.md new file mode 100644 index 0000000..c0f8d3f --- /dev/null +++ b/src/content/experiences/team-logics.ar.md @@ -0,0 +1,13 @@ +--- +role: "مؤسّس ومدير عام" +company: "Team Logics" +location: "فرساي" +startDate: "2007-01" +endDate: "2011-12" +technologies: ["PHP", "CakePHP", "JavaScript", "MySQL", "Linux"] +type: "entrepreneurship" +featured: true +lang: "ar" +--- + +مؤسّس ومدير وكالة ويب. إدارة فريق من 6 أشخاص. عملاء: ALD Automotive، Joué Club، Consuel، وغيرهم. تصميم وتطوير وإدارة مشاريع ويب مخصّصة. diff --git a/src/content/experiences/team-logics.en.md b/src/content/experiences/team-logics.en.md new file mode 100644 index 0000000..f9b17b6 --- /dev/null +++ b/src/content/experiences/team-logics.en.md @@ -0,0 +1,13 @@ +--- +role: "Founder & CEO" +company: "Team Logics" +location: "Versailles" +startDate: "2007-01" +endDate: "2011-12" +technologies: ["PHP", "CakePHP", "JavaScript", "MySQL", "Linux"] +type: "entrepreneurship" +featured: true +lang: "en" +--- + +Founded and led a web agency. Managed a team of 6. Clients: ALD Automotive, Joué Club, Consuel, and others. Design, development and management of custom web projects. diff --git a/src/content/experiences/team-logics.md b/src/content/experiences/team-logics.md new file mode 100644 index 0000000..db8cb19 --- /dev/null +++ b/src/content/experiences/team-logics.md @@ -0,0 +1,13 @@ +--- +role: "Fondateur & CEO" +company: "Team Logics" +location: "Versailles" +startDate: "2007-01" +endDate: "2011-12" +technologies: ["PHP", "CakePHP", "JavaScript", "MySQL", "Linux"] +type: "entrepreneurship" +featured: true +lang: "fr" +--- + +Fondateur et dirigeant d'une agence web. Direction d'une équipe de 6 personnes. Clients : ALD Automotive, Joué Club, Consuel, et d'autres. Conception, développement et gestion de projets web sur mesure. diff --git a/src/content/experiences/urssaf.ar.md b/src/content/experiences/urssaf.ar.md new file mode 100644 index 0000000..1630b47 --- /dev/null +++ b/src/content/experiences/urssaf.ar.md @@ -0,0 +1,15 @@ +--- +role: "مطوّر رئيسي" +company: "Urssaf Caisse nationale" +companyUrl: "https://www.urssaf.fr/" +location: "عن بُعد / باريس" +startDate: "2024-02" +technologies: ["TypeScript", "React.js", "Publicodes", "Node.js", "GitHub"] +type: "freelance" +featured: true +lang: "ar" +--- + +مطوّر رئيسي لموقع [mon-entreprise.urssaf.fr](https://mon-entreprise.urssaf.fr/)، المساعد الرسمي لروّاد الأعمال في فرنسا. أكثر من 20 محاكيًا منشورًا على المواقع العامّة، مليون مستخدم شهريًا. + +هندسة وتطوير باستخدام لغة [Publicodes](https://publi.codes/) لنمذجة قواعد الحساب الاجتماعي-الضريبي. تعاون مع فريق beta.gouv. diff --git a/src/content/experiences/urssaf.en.md b/src/content/experiences/urssaf.en.md new file mode 100644 index 0000000..c2c800b --- /dev/null +++ b/src/content/experiences/urssaf.en.md @@ -0,0 +1,15 @@ +--- +role: "Lead Developer" +company: "Urssaf Caisse nationale" +companyUrl: "https://www.urssaf.fr/" +location: "Remote / Paris" +startDate: "2024-02" +technologies: ["TypeScript", "React.js", "Publicodes", "Node.js", "GitHub"] +type: "freelance" +featured: true +lang: "en" +--- + +Lead developer of [mon-entreprise.urssaf.fr](https://mon-entreprise.urssaf.fr/), the official assistant for entrepreneurs in France. Over 20 simulators deployed on public websites, one million users per month. + +Architecture and development with the [Publicodes](https://publi.codes/) language for modeling socio-fiscal calculation rules. Collaboration with the beta.gouv team. diff --git a/src/content/experiences/urssaf.md b/src/content/experiences/urssaf.md new file mode 100644 index 0000000..a85d9b8 --- /dev/null +++ b/src/content/experiences/urssaf.md @@ -0,0 +1,15 @@ +--- +role: "Lead Developer" +company: "Urssaf Caisse nationale" +companyUrl: "https://www.urssaf.fr/" +location: "Remote / Paris" +startDate: "2024-02" +technologies: ["TypeScript", "React.js", "Publicodes", "Node.js", "GitHub"] +type: "freelance" +featured: true +lang: "fr" +--- + +Lead developer de [mon-entreprise.urssaf.fr](https://mon-entreprise.urssaf.fr/), l'assistant officiel des créateurs d'entreprise en France. Plus de 20 simulateurs diffusés sur les sites publics, un million d'usagers par mois. + +Architecture et développement avec le langage [Publicodes](https://publi.codes/) pour la modélisation des règles de calcul socio-fiscales. Collaboration avec l'équipe beta.gouv. diff --git a/src/content/experiences/veepee-dev.ar.md b/src/content/experiences/veepee-dev.ar.md new file mode 100644 index 0000000..3574e10 --- /dev/null +++ b/src/content/experiences/veepee-dev.ar.md @@ -0,0 +1,13 @@ +--- +role: "مطوّر واجهات رئيسي Travel" +company: "Veepee" +companyUrl: "https://www.veepee.com/" +location: "باريس" +startDate: "2016-02" +endDate: "2018-01" +technologies: ["JavaScript", "React.js", "Redux", "Webpack", "RxJS"] +type: "employment" +lang: "ar" +--- + +مطوّر واجهات رئيسي لفريق Travel. ترحيل تطبيق قديم إلى React/Redux. تطبيق الاختبارات الآلية وأفضل ممارسات التطوير. diff --git a/src/content/experiences/veepee-dev.en.md b/src/content/experiences/veepee-dev.en.md new file mode 100644 index 0000000..d8bb600 --- /dev/null +++ b/src/content/experiences/veepee-dev.en.md @@ -0,0 +1,13 @@ +--- +role: "Travel Front Lead Developer" +company: "Veepee" +companyUrl: "https://www.veepee.com/" +location: "Paris" +startDate: "2016-02" +endDate: "2018-01" +technologies: ["JavaScript", "React.js", "Redux", "Webpack", "RxJS"] +type: "employment" +lang: "en" +--- + +Frontend lead developer for the Travel team. Migration from a legacy application to React/Redux. Implementation of automated testing and development best practices. diff --git a/src/content/experiences/veepee-dev.md b/src/content/experiences/veepee-dev.md new file mode 100644 index 0000000..3eb6278 --- /dev/null +++ b/src/content/experiences/veepee-dev.md @@ -0,0 +1,13 @@ +--- +role: "Travel Front Lead Developer" +company: "Veepee" +companyUrl: "https://www.veepee.com/" +location: "Paris" +startDate: "2016-02" +endDate: "2018-01" +technologies: ["JavaScript", "React.js", "Redux", "Webpack", "RxJS"] +type: "employment" +lang: "fr" +--- + +Lead developer frontend de l'équipe Travel. Migration d'une application legacy vers React/Redux. Mise en place des tests automatisés et des bonnes pratiques de développement. diff --git a/src/content/experiences/veepee-lead.ar.md b/src/content/experiences/veepee-lead.ar.md new file mode 100644 index 0000000..2edb17d --- /dev/null +++ b/src/content/experiences/veepee-lead.ar.md @@ -0,0 +1,14 @@ +--- +role: "قائد تقني Travel" +company: "Veepee" +companyUrl: "https://www.veepee.com/" +location: "باريس" +startDate: "2018-01" +endDate: "2019-06" +technologies: ["TypeScript", "React.js", "Redux", "redux-saga", "Node.js"] +type: "employment" +featured: true +lang: "ar" +--- + +قائد تقني لفريق Travel (8 مطوّرين) في Veepee (سابقًا vente-privee.com). إشراف تقني، مراجعة الكود، تحديد الهندسة. مؤسّس مشارك لبرنامج التدريب الداخلي React Academy. diff --git a/src/content/experiences/veepee-lead.en.md b/src/content/experiences/veepee-lead.en.md new file mode 100644 index 0000000..2e64265 --- /dev/null +++ b/src/content/experiences/veepee-lead.en.md @@ -0,0 +1,14 @@ +--- +role: "Travel Tech Lead" +company: "Veepee" +companyUrl: "https://www.veepee.com/" +location: "Paris" +startDate: "2018-01" +endDate: "2019-06" +technologies: ["TypeScript", "React.js", "Redux", "redux-saga", "Node.js"] +type: "employment" +featured: true +lang: "en" +--- + +Tech Lead of the Travel team (8 developers) at Veepee (formerly vente-privee.com). Technical mentoring, code reviews, architecture definition. Co-founded the internal React Academy training program. diff --git a/src/content/experiences/veepee-lead.md b/src/content/experiences/veepee-lead.md new file mode 100644 index 0000000..a29255c --- /dev/null +++ b/src/content/experiences/veepee-lead.md @@ -0,0 +1,14 @@ +--- +role: "Travel Tech Lead" +company: "Veepee" +companyUrl: "https://www.veepee.com/" +location: "Paris" +startDate: "2018-01" +endDate: "2019-06" +technologies: ["TypeScript", "React.js", "Redux", "redux-saga", "Node.js"] +type: "employment" +featured: true +lang: "fr" +--- + +Tech Lead de l'équipe Travel (8 développeurs) chez Veepee (ex vente-privee.com). Encadrement technique, revues de code, définition de l'architecture. Cofondateur du programme de formation interne React Academy. diff --git a/src/content/projects/debats.ar.md b/src/content/projects/debats.ar.md new file mode 100644 index 0000000..3128e02 --- /dev/null +++ b/src/content/projects/debats.ar.md @@ -0,0 +1,12 @@ +--- +title: "Débats.co" +description: "منصّة تعاونية لتلخيص النقاشات المجتمعية. ويكيبيديا المواقف." +date: 2015-01-01 +category: "dev" +technologies: ["PHP", "JavaScript", "MySQL"] +url: "https://debats.co" +featured: true +lang: "ar" +--- + +منصّة تعاونية لرسم خريطة الحجج المؤيدة والمعارضة حول القضايا المجتمعية الكبرى. كل نقاش مُهيكل بمواقف الشخصيات العامّة، موثّقة وقابلة للتحقق. diff --git a/src/content/projects/debats.en.md b/src/content/projects/debats.en.md new file mode 100644 index 0000000..c0b03b5 --- /dev/null +++ b/src/content/projects/debats.en.md @@ -0,0 +1,12 @@ +--- +title: "Débats.co" +description: "Collaborative platform for synthesizing public debates. The Wikipedia of public stances." +date: 2015-01-01 +category: "dev" +technologies: ["PHP", "JavaScript", "MySQL"] +url: "https://debats.co" +featured: true +lang: "en" +--- + +Collaborative platform for mapping arguments for and against on major societal issues. Each debate is structured with public figures' positions, sourced and verifiable. diff --git a/src/content/projects/debats.md b/src/content/projects/debats.md new file mode 100644 index 0000000..1dcbf4d --- /dev/null +++ b/src/content/projects/debats.md @@ -0,0 +1,12 @@ +--- +title: "Débats.co" +description: "Plateforme collaborative de synthèse des débats de société. Le Wikipédia des prises de position." +date: 2015-01-01 +category: "dev" +technologies: ["PHP", "JavaScript", "MySQL"] +url: "https://debats.co" +featured: true +lang: "fr" +--- + +Plateforme collaborative permettant de cartographier les arguments pour et contre sur les grands sujets de société. Chaque débat est structuré avec les positions des personnalités publiques, sourcées et vérifiables. diff --git a/src/content/projects/dismoi.ar.md b/src/content/projects/dismoi.ar.md new file mode 100644 index 0000000..44f211d --- /dev/null +++ b/src/content/projects/dismoi.ar.md @@ -0,0 +1,14 @@ +--- +title: "DisMoi" +description: "إضافة متصفّح في مجال التكنولوجيا المدنية تضيف معلومات سياقية على أي صفحة ويب." +date: 2019-01-01 +category: "dev" +technologies: ["TypeScript", "React.js", "Redux", "Web Extension", "Node.js"] +github: "https://github.com/dis-moi" +featured: true +lang: "ar" +--- + +إضافة متصفّح مفتوحة المصدر تتيح لمساهمين موثوقين (صحفيون، جمعيات، مدقّقو حقائق) إضافة معلومات سياقية مباشرة على صفحات الويب التي يزورها المستخدمون. + +مشروع شارك في تأسيسه وتطويره من 2019 إلى 2021، مدعوم من منظمات التحقق من المعلومات. diff --git a/src/content/projects/dismoi.en.md b/src/content/projects/dismoi.en.md new file mode 100644 index 0000000..7924536 --- /dev/null +++ b/src/content/projects/dismoi.en.md @@ -0,0 +1,14 @@ +--- +title: "DisMoi" +description: "Civic tech browser extension that adds contextual information to any web page." +date: 2019-01-01 +category: "dev" +technologies: ["TypeScript", "React.js", "Redux", "Web Extension", "Node.js"] +github: "https://github.com/dis-moi" +featured: true +lang: "en" +--- + +Open source browser extension allowing trusted contributors (journalists, associations, fact-checkers) to add contextual information directly on web pages visited by users. + +Project co-founded and developed from 2019 to 2021, supported by fact-checking organizations. diff --git a/src/content/projects/dismoi.md b/src/content/projects/dismoi.md new file mode 100644 index 0000000..040ed26 --- /dev/null +++ b/src/content/projects/dismoi.md @@ -0,0 +1,14 @@ +--- +title: "DisMoi" +description: "Extension navigateur civic tech pour ajouter de l'information contextuelle sur n'importe quelle page web." +date: 2019-01-01 +category: "dev" +technologies: ["TypeScript", "React.js", "Redux", "Web Extension", "Node.js"] +github: "https://github.com/dis-moi" +featured: true +lang: "fr" +--- + +Extension navigateur open source permettant à des contributeurs de confiance (journalistes, associations, fact-checkers) d'ajouter des informations contextuelles directement sur les pages web visitées par les utilisateurs. + +Projet cofondé et développé de 2019 à 2021, soutenu par des organisations de vérification des faits. diff --git a/src/content/projects/dns-surf.ar.md b/src/content/projects/dns-surf.ar.md new file mode 100644 index 0000000..283f310 --- /dev/null +++ b/src/content/projects/dns-surf.ar.md @@ -0,0 +1,11 @@ +--- +title: "DNS.Surf" +description: "أداة استعلام DNS عالمية. استعلام خوادم DNS من مناطق مختلفة." +date: 2023-01-01 +category: "dev" +technologies: ["JavaScript"] +url: "https://dns.surf" +lang: "ar" +--- + +أداة عبر الإنترنت للتحقق من استعلام DNS لنطاق من مناطق مختلفة حول العالم. مفيدة لتشخيص مشاكل انتشار DNS. diff --git a/src/content/projects/dns-surf.en.md b/src/content/projects/dns-surf.en.md new file mode 100644 index 0000000..329fd7a --- /dev/null +++ b/src/content/projects/dns-surf.en.md @@ -0,0 +1,11 @@ +--- +title: "DNS.Surf" +description: "Worldwide DNS resolution tool. Query DNS servers from different regions." +date: 2023-01-01 +category: "dev" +technologies: ["JavaScript"] +url: "https://dns.surf" +lang: "en" +--- + +Online tool to check DNS resolution of a domain from different regions worldwide. Useful for diagnosing DNS propagation issues. diff --git a/src/content/projects/dns-surf.md b/src/content/projects/dns-surf.md new file mode 100644 index 0000000..47c7a4b --- /dev/null +++ b/src/content/projects/dns-surf.md @@ -0,0 +1,11 @@ +--- +title: "DNS.Surf" +description: "Outil de résolution DNS mondiale. Interroge les serveurs DNS de différentes régions." +date: 2023-01-01 +category: "dev" +technologies: ["JavaScript"] +url: "https://dns.surf" +lang: "fr" +--- + +Outil en ligne permettant de vérifier la résolution DNS d'un domaine depuis différentes régions du monde. Utile pour diagnostiquer les problèmes de propagation DNS. diff --git a/src/content/projects/email-ml.ar.md b/src/content/projects/email-ml.ar.md new file mode 100644 index 0000000..27a6d4b --- /dev/null +++ b/src/content/projects/email-ml.ar.md @@ -0,0 +1,11 @@ +--- +title: "Email.ML" +description: "خدمة بريد إلكتروني مؤقت بتصميم بسيط." +date: 2023-01-01 +category: "dev" +technologies: ["JavaScript"] +url: "https://email.ml" +lang: "ar" +--- + +خدمة بريد إلكتروني مؤقت بتصميم أنيق. استقبال رسائل على عنوان يُمكن التخلّص منه، بدون تسجيل. diff --git a/src/content/projects/email-ml.en.md b/src/content/projects/email-ml.en.md new file mode 100644 index 0000000..6ca1aa0 --- /dev/null +++ b/src/content/projects/email-ml.en.md @@ -0,0 +1,11 @@ +--- +title: "Email.ML" +description: "Minimalist temporary email service." +date: 2023-01-01 +category: "dev" +technologies: ["JavaScript"] +url: "https://email.ml" +lang: "en" +--- + +Temporary email service with a clean design. Receive emails on a disposable address, no signup required. diff --git a/src/content/projects/email-ml.md b/src/content/projects/email-ml.md new file mode 100644 index 0000000..1c29adb --- /dev/null +++ b/src/content/projects/email-ml.md @@ -0,0 +1,11 @@ +--- +title: "Email.ML" +description: "Service d'email temporaire minimaliste." +date: 2023-01-01 +category: "dev" +technologies: ["JavaScript"] +url: "https://email.ml" +lang: "fr" +--- + +Service d'email temporaire au design épuré. Permet de recevoir des emails sur une adresse jetable, sans inscription. diff --git a/src/content/projects/gobuild.ar.md b/src/content/projects/gobuild.ar.md new file mode 100644 index 0000000..929682b --- /dev/null +++ b/src/content/projects/gobuild.ar.md @@ -0,0 +1,11 @@ +--- +title: "GoBuild" +description: "SaaS لنمذجة المباني للمهنيين في قطاع البناء." +date: 2020-06-01 +category: "dev" +technologies: ["TypeScript", "React.js", "Elixir", "PostgreSQL", "Docker"] +url: "https://www.gobuild.fr" +lang: "ar" +--- + +تطبيق SaaS يتيح لمهنيي البناء نمذجة وتقدير مشاريعهم. طُوّر بصفتي مديرًا تقنيًا من 2020 إلى 2022. diff --git a/src/content/projects/gobuild.en.md b/src/content/projects/gobuild.en.md new file mode 100644 index 0000000..144adb3 --- /dev/null +++ b/src/content/projects/gobuild.en.md @@ -0,0 +1,11 @@ +--- +title: "GoBuild" +description: "SaaS building modeling platform for construction professionals." +date: 2020-06-01 +category: "dev" +technologies: ["TypeScript", "React.js", "Elixir", "PostgreSQL", "Docker"] +url: "https://www.gobuild.fr" +lang: "en" +--- + +SaaS application enabling construction professionals to model and estimate their building projects. Developed as CTO from 2020 to 2022. diff --git a/src/content/projects/gobuild.md b/src/content/projects/gobuild.md new file mode 100644 index 0000000..1ba2b4d --- /dev/null +++ b/src/content/projects/gobuild.md @@ -0,0 +1,11 @@ +--- +title: "GoBuild" +description: "SaaS de modélisation de bâtiments pour les professionnels du BTP." +date: 2020-06-01 +category: "dev" +technologies: ["TypeScript", "React.js", "Elixir", "PostgreSQL", "Docker"] +url: "https://www.gobuild.fr" +lang: "fr" +--- + +Application SaaS permettant aux professionnels du bâtiment de modéliser et chiffrer leurs projets de construction. Développé en tant que CTO de 2020 à 2022. diff --git a/src/content/projects/icu.ar.md b/src/content/projects/icu.ar.md new file mode 100644 index 0000000..20ab084 --- /dev/null +++ b/src/content/projects/icu.ar.md @@ -0,0 +1,10 @@ +--- +title: "ICU" +description: "منصة مشاركة صور عبر الإنترنت، مشروع شخصي تاريخي." +date: 2005-01-01 +category: "dev" +technologies: ["PHP", "JavaScript", "MySQL"] +lang: "ar" +--- + +منصة مشاركة صور طُوّرت في 2005، قبل عصر الشبكات الاجتماعية بكثير. أحد أوّل المشاريع الشخصية التي علّمتني تطوير الويب بعمق. diff --git a/src/content/projects/icu.en.md b/src/content/projects/icu.en.md new file mode 100644 index 0000000..f34f02b --- /dev/null +++ b/src/content/projects/icu.en.md @@ -0,0 +1,10 @@ +--- +title: "ICU" +description: "Online photo sharing platform, a historical personal project." +date: 2005-01-01 +category: "dev" +technologies: ["PHP", "JavaScript", "MySQL"] +lang: "en" +--- + +Photo sharing platform developed in 2005, well before the social media era. One of the first personal projects that taught me web development in depth. diff --git a/src/content/projects/icu.md b/src/content/projects/icu.md new file mode 100644 index 0000000..61b52dc --- /dev/null +++ b/src/content/projects/icu.md @@ -0,0 +1,10 @@ +--- +title: "ICU" +description: "Plateforme de partage de photos en ligne, projet personnel historique." +date: 2005-01-01 +category: "dev" +technologies: ["PHP", "JavaScript", "MySQL"] +lang: "fr" +--- + +Plateforme de partage de photos développée en 2005, bien avant l'ère des réseaux sociaux. Un des premiers projets personnels qui m'a permis d'apprendre le développement web en profondeur. diff --git a/src/content/projects/mon-entreprise.ar.md b/src/content/projects/mon-entreprise.ar.md new file mode 100644 index 0000000..6d98320 --- /dev/null +++ b/src/content/projects/mon-entreprise.ar.md @@ -0,0 +1,15 @@ +--- +title: "mon-entreprise.urssaf.fr" +description: "المساعد الرسمي لروّاد الأعمال في فرنسا. أكثر من 20 محاكيًا اجتماعيًا-ضريبيًا، مليون مستخدم شهريًا." +date: 2024-01-01 +category: "dev" +technologies: ["TypeScript", "React.js", "Publicodes", "Node.js"] +url: "https://mon-entreprise.urssaf.fr/" +github: "https://github.com/betagouv/mon-entreprise" +featured: true +lang: "ar" +--- + +محاكيات اشتراكات اجتماعية وضرائب ومساعدات لمؤسسي الشركات. مشروع مفتوح المصدر تقوده Urssaf وbeta.gouv.fr، يستخدمه أكثر من مليون شخص شهريًا. + +يعتمد محرّك الحساب على [Publicodes](https://publi.codes/)، لغة تصريحية لنمذجة القواعد الاجتماعية-الضريبية الفرنسية. diff --git a/src/content/projects/mon-entreprise.en.md b/src/content/projects/mon-entreprise.en.md new file mode 100644 index 0000000..829782b --- /dev/null +++ b/src/content/projects/mon-entreprise.en.md @@ -0,0 +1,15 @@ +--- +title: "mon-entreprise.urssaf.fr" +description: "The official assistant for entrepreneurs in France. Over 20 socio-fiscal simulators, one million users per month." +date: 2024-01-01 +category: "dev" +technologies: ["TypeScript", "React.js", "Publicodes", "Node.js"] +url: "https://mon-entreprise.urssaf.fr/" +github: "https://github.com/betagouv/mon-entreprise" +featured: true +lang: "en" +--- + +Social contribution, tax and startup aid simulators. Open source project led by Urssaf and beta.gouv.fr, used by over one million people every month. + +The calculation engine relies on [Publicodes](https://publi.codes/), a declarative language for modeling French socio-fiscal rules. diff --git a/src/content/projects/mon-entreprise.md b/src/content/projects/mon-entreprise.md new file mode 100644 index 0000000..cde83ac --- /dev/null +++ b/src/content/projects/mon-entreprise.md @@ -0,0 +1,15 @@ +--- +title: "mon-entreprise.urssaf.fr" +description: "L'assistant officiel des créateurs d'entreprise en France. Plus de 20 simulateurs socio-fiscaux, un million d'usagers par mois." +date: 2024-01-01 +category: "dev" +technologies: ["TypeScript", "React.js", "Publicodes", "Node.js"] +url: "https://mon-entreprise.urssaf.fr/" +github: "https://github.com/betagouv/mon-entreprise" +featured: true +lang: "fr" +--- + +Simulateurs de cotisations sociales, d'impôts et d'aides aux créateurs d'entreprise. Projet open source porté par l'Urssaf et beta.gouv.fr, utilisé par plus d'un million de personnes chaque mois. + +Le moteur de calcul repose sur [Publicodes](https://publi.codes/), un langage déclaratif pour modéliser les règles socio-fiscales françaises. diff --git a/src/content/projects/ngine.ar.md b/src/content/projects/ngine.ar.md new file mode 100644 index 0000000..8555ccb --- /dev/null +++ b/src/content/projects/ngine.ar.md @@ -0,0 +1,10 @@ +--- +title: "N.Gine" +description: "نظام إدارة محتوى خاص بُني من الصفر، استُخدم للعديد من مشاريع العملاء." +date: 2004-01-01 +category: "dev" +technologies: ["PHP", "JavaScript", "MySQL"] +lang: "ar" +--- + +نظام إدارة محتوى (CMS) بُني من الصفر. استُخدم كأساس تقني لعديد من مواقع عملاء وكالة Team Logics. مشروع تكويني علّمني هندسة البرمجيات عبر الممارسة. diff --git a/src/content/projects/ngine.en.md b/src/content/projects/ngine.en.md new file mode 100644 index 0000000..305a610 --- /dev/null +++ b/src/content/projects/ngine.en.md @@ -0,0 +1,10 @@ +--- +title: "N.Gine" +description: "Proprietary CMS built from scratch, used for many client projects." +date: 2004-01-01 +category: "dev" +technologies: ["PHP", "JavaScript", "MySQL"] +lang: "en" +--- + +Content management system (CMS) built from scratch. Used as the technical foundation for many client websites at the Team Logics agency. A formative project that taught me software architecture through practice. diff --git a/src/content/projects/ngine.md b/src/content/projects/ngine.md new file mode 100644 index 0000000..e9e81b0 --- /dev/null +++ b/src/content/projects/ngine.md @@ -0,0 +1,10 @@ +--- +title: "N.Gine" +description: "CMS propriétaire développé de zéro, utilisé pour de nombreux projets clients." +date: 2004-01-01 +category: "dev" +technologies: ["PHP", "JavaScript", "MySQL"] +lang: "fr" +--- + +Système de gestion de contenu (CMS) développé de zéro. Utilisé comme base technique pour de nombreux sites clients de l'agence Team Logics. Un projet formateur qui m'a enseigné l'architecture logicielle par la pratique. diff --git a/src/content/recommendations/anne-marchadier.md b/src/content/recommendations/anne-marchadier.md new file mode 100644 index 0000000..83d2df1 --- /dev/null +++ b/src/content/recommendations/anne-marchadier.md @@ -0,0 +1,8 @@ +--- +author: "Anne Marchadier Valmont" +authorRole: "Responsable administratif" +company: "4CAD Group" +date: 2009-08-19 +lang: "fr" +--- +Jalil et son équipe de Team Logics savent accompagner l'entreprise dans ses projets et être force de proposition grâce à leur sens de la créativité et leur expertise dans le web. En plus de ces qualités, le sens du service est un maître mot pour l'équipe. Anne Marchadier ; ex Responsable Administrative d'e-THEMIS. diff --git a/src/content/recommendations/antoine-wolff.md b/src/content/recommendations/antoine-wolff.md new file mode 100644 index 0000000..95b359e --- /dev/null +++ b/src/content/recommendations/antoine-wolff.md @@ -0,0 +1,8 @@ +--- +author: "Antoine Wolff" +authorRole: "Développeur, graphiste et chef de projet" +company: "LeCollectif" +date: 2020-12-07 +lang: "fr" +--- +J'ai travaillé avec Jalil sur différents projets de développements web (JS, React, PHP,...) et d'applications mobiles. Passionné, consciencieux et efficace, c'est toujours un plaisir de travailler en équipe avec lui. J'ai beaucoup appris à ces côtés. diff --git a/src/content/recommendations/benoit-sarda.md b/src/content/recommendations/benoit-sarda.md new file mode 100644 index 0000000..4ff888d --- /dev/null +++ b/src/content/recommendations/benoit-sarda.md @@ -0,0 +1,8 @@ +--- +author: "Benoit Sarda" +authorRole: "Sr Solution Architect, Manuf" +company: "Amazon Web Services (AWS)" +date: 2011-12-07 +lang: "fr" +--- +Jalil est sérieux, déterminé, diligent, très agréable et ouvert. Ses nombreuses compétences et domaines d'expertise lui permettent de mener à bien nombre de projets développement et web. Il est également un très bon manager, à l'écoute de tous, encadrant et dirigeant ses équipes avec efficacité et sérénité. diff --git a/src/content/recommendations/benoit-talbot.md b/src/content/recommendations/benoit-talbot.md new file mode 100644 index 0000000..05f2b01 --- /dev/null +++ b/src/content/recommendations/benoit-talbot.md @@ -0,0 +1,8 @@ +--- +author: "Benoit Talbot" +authorRole: "Consultant technico-fonctionel Sage ERP X3" +company: "Concept ERP" +date: 2015-01-29 +lang: "fr" +--- +Toujours disponible et hautement compétant techniquement, Jalil est un collègue très précieux et humainement très agréable. L'essayer c'est l'adopter! Benoit diff --git a/src/content/recommendations/bouchra-ghaoui.md b/src/content/recommendations/bouchra-ghaoui.md new file mode 100644 index 0000000..ecc09f0 --- /dev/null +++ b/src/content/recommendations/bouchra-ghaoui.md @@ -0,0 +1,8 @@ +--- +author: "Bouchra Ghaoui" +authorRole: "Senior Engagement Manager" +company: "Capgemini" +date: 2011-12-09 +lang: "fr" +--- +Jalil est un très bon manager toujours à l'écoute de ses équipes et de ses clients afin de mener à bien tous ses projets. il est également très compétent sur le plan technique pour ce qui est du développement d'applications Web ou Winform avec différent langages de programmation (C# .Net, JAVA, PHP, ASP .Net, HTML, CSS...) diff --git a/src/content/recommendations/daniel-gall.md b/src/content/recommendations/daniel-gall.md new file mode 100644 index 0000000..04ce22d --- /dev/null +++ b/src/content/recommendations/daniel-gall.md @@ -0,0 +1,8 @@ +--- +author: "Daniel Gall" +authorRole: "Consultant" +company: "Taos Conseil" +date: 2011-12-07 +lang: "fr" +--- +Nous avons fait développer par jalil un site Web dont les spécifications étaient floues. Il a su s'adapter et adapter la conception, et faire évoluer son produit au fur et à mesure de l'avancement et des découvertes que nous faisions. il est resté serein devant les difficultés, etcela a permis de mener à bien le projet. diff --git a/src/content/recommendations/gregoire-lacoste.md b/src/content/recommendations/gregoire-lacoste.md new file mode 100644 index 0000000..69a6f81 --- /dev/null +++ b/src/content/recommendations/gregoire-lacoste.md @@ -0,0 +1,8 @@ +--- +author: "Grégoire Lacoste" +authorRole: "Chief Product Officer" +company: "CertifiCall" +date: 2020-12-08 +lang: "fr" +--- +J'ai eu la chance de travailler avec Jalil sur plusieurs projets d'applications react/node ou php, son expérience, sa vision claire et sa pédagogie a toute épreuve en font un partenaire incontournable pour un projet réussi diff --git a/src/content/recommendations/guillaume-gendrillon.md b/src/content/recommendations/guillaume-gendrillon.md new file mode 100644 index 0000000..39839c2 --- /dev/null +++ b/src/content/recommendations/guillaume-gendrillon.md @@ -0,0 +1,8 @@ +--- +author: "Guillaume Gendrillon" +authorRole: "Lead designer Information Voyageur et signalétique" +company: "RATPgroup" +date: 2011-12-05 +lang: "fr" +--- +Jalil est une personne de confiance, efficace et rigoureux ayant l'amour de son travail. diff --git a/src/content/recommendations/laurent-perez.md b/src/content/recommendations/laurent-perez.md new file mode 100644 index 0000000..0f4a4d2 --- /dev/null +++ b/src/content/recommendations/laurent-perez.md @@ -0,0 +1,8 @@ +--- +author: "Laurent Perez" +authorRole: "Senior Developer" +company: "itk" +date: 2009-09-07 +lang: "en" +--- +Open minded and very professional diff --git a/src/content/recommendations/matthieu-diouron.md b/src/content/recommendations/matthieu-diouron.md new file mode 100644 index 0000000..75227be --- /dev/null +++ b/src/content/recommendations/matthieu-diouron.md @@ -0,0 +1,8 @@ +--- +author: "Matthieu Diouron" +authorRole: "Director of Business Development" +company: "T-Systems France" +date: 2009-09-09 +lang: "fr" +--- +Jalil est un prestataire qui sait maitriser les dernières technologies du web sans jamais perdre de vue l'objectif final du client. Cette valeur ajoutée s'est donc révélée être une clé du succès du site que nous avons mis en place pour un groupement de cinémas. diff --git a/src/content/recommendations/maxime-boudier.md b/src/content/recommendations/maxime-boudier.md new file mode 100644 index 0000000..0177628 --- /dev/null +++ b/src/content/recommendations/maxime-boudier.md @@ -0,0 +1,8 @@ +--- +author: "Maxime Boudier" +authorRole: "Staff Web Engineer" +company: "SNCF Connect & Tech" +date: 2020-12-12 +lang: "fr" +--- +Une des personnes avec qui j'ai préféré travailler. En plus d'être passionné, très bon techniquement et j'en passe.. Jalil est une personne qu'on apprécie pour ses qualités humaines. J'ai beaucoup appris de toi Jalil, sur plusieurs plans, j'espère que nos chemin se re-croiseront. diff --git a/src/content/recommendations/olivier-cornudet.md b/src/content/recommendations/olivier-cornudet.md new file mode 100644 index 0000000..79e5087 --- /dev/null +++ b/src/content/recommendations/olivier-cornudet.md @@ -0,0 +1,8 @@ +--- +author: "Olivier Cornudet" +authorRole: "Consultant manager" +company: "e-THEMIS" +date: 2015-02-11 +lang: "fr" +--- +En plus de ses qualités techniques, Jalil combine un bon relationnel des qualités d'écoutes et une bonne capacité à se mettre à la place des utilisateurs des solutions qu'il réalise. diff --git a/src/content/recommendations/pascal-gentil.md b/src/content/recommendations/pascal-gentil.md new file mode 100644 index 0000000..20d2db1 --- /dev/null +++ b/src/content/recommendations/pascal-gentil.md @@ -0,0 +1,8 @@ +--- +author: "Pascal Gentil" +authorRole: "Chef de projet Sage X3" +company: "YOUR PARTNER" +date: 2015-02-08 +lang: "fr" +--- +J'ai le plaisir de travailler avec Jalil dans le cadre de déploiements de solutions chez nos clients. Il est toujours de bonne composition, disponible et prêt à rendre service. Ses qualités professionnelles sont reconnues par tous. diff --git a/src/content/recommendations/vanessa-boissard.md b/src/content/recommendations/vanessa-boissard.md new file mode 100644 index 0000000..d482c65 --- /dev/null +++ b/src/content/recommendations/vanessa-boissard.md @@ -0,0 +1,8 @@ +--- +author: "Vanessa Boissard" +authorRole: "Psychologue sociale" +company: "AlterAlliance" +date: 2011-12-05 +lang: "fr" +--- +Jalil est un excellent manager et responsable de mission. Il fait à la fois du très bon travail et dirige merveilleusement ses équipes. diff --git a/src/data/experiences.json b/src/data/experiences.json deleted file mode 100644 index ba05410..0000000 --- a/src/data/experiences.json +++ /dev/null @@ -1,37 +0,0 @@ -[ - { - "dates": "2023 · Présent", - "role": "Consultant Développeur Senior", - "company": "Urssaf Caisse nationale", - "description": "Mission freelance - Architecture et développement d'applications métier.", - "logo": "" - }, - { - "dates": "2018 · Présent", - "role": "Organisateur", - "company": "Software Crafters Albi", - "description": "Animation de la communauté locale de développeurs passionnés par le craft.", - "logo": "" - }, - { - "dates": "2015 · 2016", - "role": "Fondateur", - "company": "while42", - "description": "Réseau mondial de développeurs expatriés - communauté d'entraide et de partage.", - "logo": "" - }, - { - "dates": "2003 · 2006", - "role": "Créateur", - "company": "Projets personnels", - "description": "N.Gine (CMS propriétaire), ICU (plateforme de partage photo), Débats.co (débat politique collaboratif).", - "logo": "" - }, - { - "dates": "2001 · 2003", - "role": "Étudiant", - "company": "UVSQ - Université de Versailles", - "description": "Meilleur projet de programmation de l'année 2003.", - "logo": "" - } -] \ No newline at end of file diff --git a/src/data/projects.json b/src/data/projects.json deleted file mode 100644 index cd8861e..0000000 --- a/src/data/projects.json +++ /dev/null @@ -1,14 +0,0 @@ -[ - { - "name": "Email.ML", - "description": "Minimalist temporary Email.", - "image": "/assets/images/projects/email.ml.png", - "url": "https://email.ml" - }, - { - "name": "DNS.Surf", - "description": "Querying DNS Resolution Results in Different Regions Worldwide.", - "image": "/assets/images/projects/dns.surf.png", - "url": "https://dns.surf" - } -] diff --git a/src/data/skills.json b/src/data/skills.json new file mode 100644 index 0000000..26d8ba8 --- /dev/null +++ b/src/data/skills.json @@ -0,0 +1,28 @@ +{ + "categories": [ + { + "name": { "fr": "Langages", "en": "Languages", "ar": "اللغات" }, + "skills": ["TypeScript", "JavaScript", "PHP", "Elixir", "Kotlin", "Haskell", "Java", "C#", "SQL", "HTML"] + }, + { + "name": { "fr": "Frameworks & Librairies", "en": "Frameworks & Libraries", "ar": "الأطر والمكتبات" }, + "skills": ["React.js", "Redux", "Node.js", "NestJS", "Symfony", "CakePHP", "Eleventy", "RxJS", "Ramda", "redux-saga", "Publicodes"] + }, + { + "name": { "fr": "Pratiques", "en": "Practices", "ar": "الممارسات" }, + "skills": ["TDD", "Clean Code", "Software Craftsmanship", "Domain Driven Design", "Hexagonal Architecture", "Functional Programming", "OOP"] + }, + { + "name": { "fr": "Outils & Infrastructure", "en": "Tools & Infrastructure", "ar": "الأدوات والبنية التحتية" }, + "skills": ["Docker", "Git", "Webpack", "Vite", "Nx", "GNU Make", "Linux", "GitHub", "PostgreSQL", "MongoDB", "Subversion"] + }, + { + "name": { "fr": "APIs & Protocoles", "en": "APIs & Protocols", "ar": "واجهات وبروتوكولات" }, + "skills": ["REST", "GraphQL"] + }, + { + "name": { "fr": "Autres", "en": "Other", "ar": "أخرى" }, + "skills": ["Team Lead", "Project Management", "Training", "E-commerce", "Web Extension", "Android", "Photography"] + } + ] +} diff --git a/src/layouts/main.astro b/src/layouts/main.astro index c642197..fc10c0c 100644 --- a/src/layouts/main.astro +++ b/src/layouts/main.astro @@ -48,45 +48,56 @@ const locale = pathname.startsWith("/en") diff --git a/src/pages/ar/برمجة.astro b/src/pages/ar/برمجة.astro deleted file mode 100644 index c596f1e..0000000 --- a/src/pages/ar/برمجة.astro +++ /dev/null @@ -1,138 +0,0 @@ ---- -import { Image } from "astro:assets"; -import PageHeading from "../../components/page-heading.astro"; -import Layout from "../../layouts/main.astro"; -import Link from "../../components/Link.astro"; -import logoTiqa from "../../assets/images/logo-tiqa-blanc.png"; ---- - - -
- - -

ما أفعله

-
-

- مطوّر مستقل مقيم في ألبي، فرنسا، أرافق الفرق كمطوّر أول، أو قائد تقني، أو مدرب تقني. أفضّل البرمجيات الحرّة والأدوات التي تلبي احتياجات حقيقية. -

-

- أبرمج بعناية تطبيقات مدروسة تستجيب لاحتياجات حقيقية. أقود فريقي نحو أفضل الحلول والتطبيقات الأكثر فعالية لكل حالة استخدام. -

-
- -

نقاط قوّتي

-
-
    -
  • كتابة كود مستقر، تشغيلي، قابل للصيانة، قابل للتطوير ومُختبَر جيّدًا
  • -
  • التعلّم، ونقل المعرفة
  • -
  • العمل ضمن فريق
  • -
  • المساهمة في تحسين الفريق بطرح المشاكل واقتراح الحلول
  • -
  • الاستقلالية: معرفة ما يجب فعله والقيام به
  • -
-
- -

قيَمي

-
-
    -
  • حركة Software Craftsmanship
  • -
  • الفائدة الاجتماعية للمطوّر
  • -
  • الفخر بالعمل، دون غرور
  • -
  • التسيير الذاتي، الاستقلالية والمسؤولية
  • -
  • منهج Domain Driven Design
  • -
  • تنظيم أجايل: التكرار والتحسين المستمر
  • -
-
- -

ما أقدّمه

-
-
    -
  • 20 سنة من الخبرة في تصميم البرمجيات
  • -
  • التزام قوي بجودة وفائدة إنجازاتي
  • -
  • تطوير محوره المستخدم
  • -
-
- -

ما أبحث عنه

-
-
    -
  • مهمّة في خدمة المصلحة العامّة
  • -
  • أثر اجتماعي و/أو بيئي إيجابي
  • -
  • يُفضَّل أن تكون المنظمة غير ربحية
  • -
  • يُفضَّل أن يكون المشروع مفتوح المصدر أو برمجيات حرّة
  • -
  • فريق جيّد يريد رفع المستوى
  • -
-
- -

المهارات

-
-

- اللغات — TypeScript/JavaScript، PHP، Elixir -

-

- الممارسات — TDD، الكود النظيف، تصميم المجالات، العمارة السداسية، إعادة الهيكلة المستمرّة -

-
- -

مشاريع مفتوحة المصدر

-
-

- Débats.co — منصّة تعاونية لتلخيص النقاشات المجتمعية. -

-

- DisMoi — إضافة للمتصفّح في مجال التكنولوجيا المدنية، تضيف معلومات سياقية على الويب. -

-

- mon-entreprise — المساعد الرسمي لروّاد الأعمال في فرنسا، مشروع beta.gouv. -

-
- -

المجتمع

-
-

- أنشّط مجتمع Software Crafters Albi منذ 2018. نلتقي بانتظام للحديث عن الكود والممارسات وحرفة البرمجة. -

-
- -

التدريس

-
-

- أستاذ هندسة البرمجيات في جامعة شامبوليون في ألبي منذ 2019 (ماستر AMINJ وليسانس معلوماتية). درّست أيضًا في ESN 81 في كاستر (أفضل الممارسات في التطوير، Node.js). -

-
- -

المسار

-
-

- حاليًا مطوّر رئيسي في mon-entreprise.urssaf.fr لدى Urssaf Caisse nationale — أكثر من 20 محاكيًا منشورًا على المواقع العامّة، مليون مستخدم شهريًا. -

-

- قبل ذلك: مدير تقني في GoBuild (نمذجة المباني، ليون)، مهندس معماري للواجهات في ARaymond (غرونوبل)، قائد تقني في Veepee (سابقًا vente-privee) حيث قدت فريقًا من 8 مطوّرين وشاركت في تأسيس برنامج التدريب الداخلي React Academy. -

-

- مؤسّس مشارك لـDisMoi، إضافة متصفّح في مجال التكنولوجيا المدنية. مؤسّس Team Logics (2007-2011)، وكالة ويب أدرت فيها فريقًا من 6 أشخاص لعملاء مثل ALD Automotive وJoué Club وConsuel. -

-

- مطوّر عصامي منذ 2003. أفضل مشروع برمجة لدفعة 2003 في UVSQ. -

-
-

على الإنترنت

-
-

- LinkedIn · Malt · Stack Overflow · GitHub · Framagit · Forge شخصية -

-
- شعار Tiqa -

- SAS Tiqa
- 12, rue Fabre d'Églantine — 81 000 Albi, France
- 811 917 871 RCS Albi -

-
-
diff --git a/src/pages/ar/برمجة/index.astro b/src/pages/ar/برمجة/index.astro new file mode 100644 index 0000000..7440eec --- /dev/null +++ b/src/pages/ar/برمجة/index.astro @@ -0,0 +1,175 @@ +--- +import { getCollection } from "astro:content"; +import { Image } from "astro:assets"; +import Layout from "../../../layouts/main.astro"; +import Link from "../../../components/Link.astro"; +import NavigationCard from "../../../components/code/NavigationCard.astro"; +import FeaturedRecommendation from "../../../components/code/FeaturedRecommendation.astro"; +import logoTiqa from "../../../assets/images/logo-tiqa-blanc.png"; + +const locale = "ar"; + +const experiences = (await getCollection("experiences")) + .filter((e) => e.data.lang === locale && !e.data.draft) + .sort((a, b) => (b.data.startDate > a.data.startDate ? 1 : -1)); + +const currentPosition = experiences.find((e) => !e.data.endDate); + +const recommendations = (await getCollection("recommendations")) + .sort((a, b) => b.data.date.getTime() - a.data.date.getTime()) + .slice(0, 3); + +const recommendationTexts = recommendations.map((rec) => ({ + ...rec, + text: rec.body || '', +})); +--- + + +
+
+

برمجة

+

+ أكثر من 20 سنة في بناء البرمجيات. Craftsmanship، TDD، DDD — وهاجس التحيّزات التي نضعها في الكود دون أن ندري. +

+
+ +
+

+ مطوّر مستقل مقيم في ألبي، فرنسا، أرافق الفرق كمطوّر أول، أو قائد تقني، أو مدرب تقني. أفضّل البرمجيات الحرّة والأدوات التي تلبي احتياجات حقيقية. +

+
+ +
+ + + + +
+ + {currentPosition && ( +
+

المنصب الحالي

+

{currentPosition.data.role}

+

+ {currentPosition.data.companyUrl ? ( + {currentPosition.data.company} + ) : ( + currentPosition.data.company + )} + {currentPosition.data.location && ` · ${currentPosition.data.location}`} +

+
+ )} + + {recommendationTexts.length > 0 && ( +
+
+

التوصيات

+ ← عرض الكل +
+
+ {recommendationTexts.map((rec) => ( + + ))} +
+
+ )} + +

القيم والمنهج

+
+
    +
  • + + حركة Software Craftsmanship +
  • +
  • + + الفائدة الاجتماعية للمطوّر +
  • +
  • + + الفخر بالعمل، دون غرور +
  • +
  • + + منهج Domain Driven Design +
  • +
  • + + تنظيم أجايل: التكرار والتحسين المستمر +
  • +
+
+ +

المجتمع والتدريس

+
+

+ أنشّط مجتمع Software Crafters Albi منذ 2018. أستاذ هندسة البرمجيات في جامعة شامبوليون في ألبي منذ 2019. +

+
+ +

على الإنترنت

+
+ {[ + { label: 'LinkedIn', href: 'https://www.linkedin.com/in/jalil' }, + { label: 'Malt', href: 'https://www.malt.fr/profile/jalilarfaoui' }, + { label: 'Stack Overflow', href: 'https://stackexchange.com/users/54164/jalil' }, + { label: 'GitHub', href: 'https://github.com/JalilArfaoui' }, + { label: 'Framagit', href: 'https://framagit.org/jalil' }, + { label: 'Forge شخصية', href: 'https://forge.tiqa.fr' }, + ].map((link) => ( + + {link.label} + + + + + ))} +
+ +
+ شعار Tiqa +

+ SAS Tiqa
+ 12, rue Fabre d'Églantine — 81 000 Albi, France
+ 811 917 871 RCS Albi +

+
+
+
diff --git a/src/pages/ar/برمجة/توصيات.astro b/src/pages/ar/برمجة/توصيات.astro new file mode 100644 index 0000000..bc21436 --- /dev/null +++ b/src/pages/ar/برمجة/توصيات.astro @@ -0,0 +1,43 @@ +--- +import { getCollection } from "astro:content"; +import Layout from "../../../layouts/main.astro"; +import RecommendationCard from "../../../components/code/RecommendationCard.astro"; + +const recommendations = (await getCollection("recommendations")) + .sort((a, b) => b.data.date.getTime() - a.data.date.getTime()); +--- + + +
+
+ + برمجة + + + + +

التوصيات

+

ما يقوله الأشخاص الذين عملت معهم.

+
+ +
+ {recommendations.map((rec) => ( +
+ +
+ ))} +
+
+
diff --git a/src/pages/ar/برمجة/مسار.astro b/src/pages/ar/برمجة/مسار.astro new file mode 100644 index 0000000..f33324e --- /dev/null +++ b/src/pages/ar/برمجة/مسار.astro @@ -0,0 +1,94 @@ +--- +import { getCollection, render } from "astro:content"; +import Layout from "../../../layouts/main.astro"; + +const locale = "ar"; + +const experiences = (await getCollection("experiences")) + .filter((e) => e.data.lang === locale && !e.data.draft) + .sort((a, b) => (b.data.startDate > a.data.startDate ? 1 : -1)); + +const typeIcons: Record = { + employment: '🏢', freelance: '💼', teaching: '🎓', + community: '🤝', entrepreneurship: '🚀', +}; + +function formatMonth(dateStr: string) { + const [year, month] = dateStr.split('-'); + return new Date(parseInt(year), parseInt(month) - 1) + .toLocaleDateString('ar-SA', { year: 'numeric', month: 'short' }); +} +--- + + +
+
+ + برمجة + + + + +

المسار

+

أكثر من 20 سنة من الخبرة في تطوير البرمجيات.

+
+ +
+ {experiences.map(async (exp) => { + const { Content } = await render(exp); + const isOngoing = !exp.data.endDate; + const start = formatMonth(exp.data.startDate); + const end = exp.data.endDate ? formatMonth(exp.data.endDate) : 'الحاضر'; + + return ( +
+
+ {isOngoing &&
} +
+ +
+
+ + {typeIcons[exp.data.type] || '💼'} {start} — {end} + + {exp.data.location && · {exp.data.location}} +
+ +

{exp.data.role}

+

+ {exp.data.companyUrl ? ( + {exp.data.company} + ) : exp.data.company} +

+ +
+ +
+ + {exp.data.technologies && exp.data.technologies.length > 0 && ( +
+ {exp.data.technologies.map((tech: string) => ( + + {tech} + + ))} +
+ )} +
+
+ ); + })} +
+
+
diff --git a/src/pages/ar/برمجة/مشاريع.astro b/src/pages/ar/برمجة/مشاريع.astro new file mode 100644 index 0000000..0a9b907 --- /dev/null +++ b/src/pages/ar/برمجة/مشاريع.astro @@ -0,0 +1,46 @@ +--- +import { getCollection } from "astro:content"; +import Layout from "../../../layouts/main.astro"; +import ProjectCard from "../../../components/code/ProjectCard.astro"; + +const locale = "ar"; + +const projects = (await getCollection("projects")) + .filter((p) => p.data.lang === locale && !p.data.draft && p.data.category === "dev") + .sort((a, b) => { + if (a.data.featured !== b.data.featured) return a.data.featured ? -1 : 1; + return b.data.date.getTime() - a.data.date.getTime(); + }); +--- + + +
+
+ + برمجة + + + + +

المشاريع

+

برمجيات مفتوحة المصدر، أدوات ومشاريع شخصية.

+
+ +
+ {projects.map((project) => ( + + ))} +
+
+
diff --git a/src/pages/ar/برمجة/مهارات.astro b/src/pages/ar/برمجة/مهارات.astro new file mode 100644 index 0000000..bd2047e --- /dev/null +++ b/src/pages/ar/برمجة/مهارات.astro @@ -0,0 +1,35 @@ +--- +import Layout from "../../../layouts/main.astro"; +import SkillCategory from "../../../components/code/SkillCategory.astro"; +import skillsData from "../../../data/skills.json"; + +const locale = "ar"; +--- + + +
+
+ + برمجة + + + + +

المهارات

+

لغات، أطر عمل، ممارسات وأدوات أستخدمها يوميًا.

+
+ +
+ {skillsData.categories.map((category) => ( + + ))} +
+
+
diff --git a/src/pages/code.astro b/src/pages/code.astro deleted file mode 100644 index 32a2833..0000000 --- a/src/pages/code.astro +++ /dev/null @@ -1,138 +0,0 @@ ---- -import { Image } from "astro:assets"; -import PageHeading from "../components/page-heading.astro"; -import Layout from "../layouts/main.astro"; -import Link from "../components/Link.astro"; -import logoTiqa from "../assets/images/logo-tiqa-blanc.png"; ---- - - -
- - -

Ce que je fais

-
-

- Développeur freelance basé à Albi, j'accompagne les équipes comme développeur senior, tech lead ou coach technique. Je privilégie le logiciel libre et les outils qui répondent à de vrais besoins. -

-

- Je code soigneusement des applications bien pensées qui répondent à des besoins réels. Je mène mon équipe vers les meilleures solutions et les implémentations les plus efficaces pour chaque cas d'usage. -

-
- -

Mes points forts

-
-
    -
  • Écrire du code stable, opérationnel, maintenable, évolutif et bien testé
  • -
  • Apprendre, et transmettre
  • -
  • Travailler en équipe
  • -
  • Participer à l'amélioration de l'équipe en soulevant les problèmes et en proposant des solutions
  • -
  • Autonomie : savoir ce que j'ai à faire et le faire
  • -
-
- -

Mes valeurs

-
-
    -
  • Le mouvement Software Craftsmanship
  • -
  • L'utilité sociale du développeur
  • -
  • Être fier de son travail, mais sans égo
  • -
  • Autogestion, autonomie et responsabilité
  • -
  • Approche Domain Driven Design
  • -
  • Organisation agile : itération et amélioration continue
  • -
-
- -

Ce que j'offre

-
-
    -
  • 20 ans d'expérience en conception logicielle
  • -
  • Une forte implication dans la qualité et l'utilité de mes réalisations
  • -
  • Développement centré sur l'utilisateur
  • -
-
- -

Ce que je recherche

-
-
    -
  • Une mission dans le sens de l'intérêt général
  • -
  • Un impact social et/ou environnemental positif
  • -
  • Idéalement à but non lucratif
  • -
  • Idéalement open-source voire logiciel libre
  • -
  • Une bonne équipe qui veut élever le niveau
  • -
-
- -

Compétences

-
-

- Langages — TypeScript/JavaScript, PHP, Elixir -

-

- Pratiques — TDD, Clean Code, Domain-Driven Design, architecture hexagonale, refactoring continu -

-
- -

Projets open source

-
-

- Débats.co — Plateforme collaborative de synthèse des débats de société. -

-

- DisMoi — Extension navigateur civic tech, pour ajouter de l'information contextuelle sur le web. -

-

- mon-entreprise — L'assistant officiel des entrepreneurs, un projet beta.gouv. -

-
- -

Communauté

-
-

- J'anime les Software Crafters d'Albi depuis 2018. On se retrouve régulièrement pour parler code, pratiques et artisanat logiciel. -

-
- -

Enseignement

-
-

- Enseignant en génie logiciel à l'université Champollion d'Albi depuis 2019 (Master AMINJ et Licence informatique). Également intervenu à l'ESN 81 à Castres (bonnes pratiques de développement, Node.js). -

-
- -

Parcours

-
-

- Actuellement lead developer de mon-entreprise.urssaf.fr à l'Urssaf Caisse nationale — plus de 20 simulateurs diffusés sur les sites publics, un million d'usagers par mois. -

-

- Avant ça : CTO de GoBuild (modélisation de bâtiments, Lyon), architecte front-end chez ARaymond (Grenoble), tech lead chez Veepee (ex vente-privee) où j'ai encadré une équipe de 8 développeurs et cofondé le programme de formation interne React Academy. -

-

- Cofondateur de DisMoi, extension navigateur civic tech. Fondateur de Team Logics (2007-2011), agence web où j'ai dirigé une équipe de 6 personnes pour des clients comme ALD Automotive, Joué Club ou Consuel. -

-

- Développeur autodidacte depuis 2003. Meilleur projet de programmation de la promo 2003 à l'UVSQ. -

-
-

En ligne

-
-

- LinkedIn · Malt · Stack Overflow · GitHub · Framagit · Forge personnelle -

-
- Logo Tiqa -

- SAS Tiqa
- 12, rue Fabre d'Églantine — 81 000 Albi
- 811 917 871 RCS Albi -

-
-
diff --git a/src/pages/code/competences.astro b/src/pages/code/competences.astro new file mode 100644 index 0000000..cbbf4e0 --- /dev/null +++ b/src/pages/code/competences.astro @@ -0,0 +1,35 @@ +--- +import Layout from "../../layouts/main.astro"; +import SkillCategory from "../../components/code/SkillCategory.astro"; +import skillsData from "../../data/skills.json"; + +const locale = "fr"; +--- + + +
+
+ + + + + Code + +

Compétences

+

Langages, frameworks, pratiques et outils que j'utilise au quotidien.

+
+ +
+ {skillsData.categories.map((category) => ( + + ))} +
+
+
diff --git a/src/pages/code/index.astro b/src/pages/code/index.astro new file mode 100644 index 0000000..971bcff --- /dev/null +++ b/src/pages/code/index.astro @@ -0,0 +1,175 @@ +--- +import { getCollection } from "astro:content"; +import { Image } from "astro:assets"; +import Layout from "../../layouts/main.astro"; +import Link from "../../components/Link.astro"; +import NavigationCard from "../../components/code/NavigationCard.astro"; +import FeaturedRecommendation from "../../components/code/FeaturedRecommendation.astro"; +import logoTiqa from "../../assets/images/logo-tiqa-blanc.png"; + +const locale = "fr"; + +const experiences = (await getCollection("experiences")) + .filter((e) => e.data.lang === locale && !e.data.draft) + .sort((a, b) => (b.data.startDate > a.data.startDate ? 1 : -1)); + +const currentPosition = experiences.find((e) => !e.data.endDate); + +const recommendations = (await getCollection("recommendations")) + .sort((a, b) => b.data.date.getTime() - a.data.date.getTime()) + .slice(0, 3); + +const recommendationTexts = recommendations.map((rec) => ({ + ...rec, + text: rec.body || '', +})); +--- + + +
+
+

Code

+

+ Plus de 20 ans à construire du logiciel. Craftsmanship, TDD, DDD — et une obsession pour les biais qu'on met dans le code sans le savoir. +

+
+ +
+

+ Développeur freelance basé à Albi, j'accompagne les équipes comme développeur senior, tech lead ou coach technique. Je privilégie le logiciel libre et les outils qui répondent à de vrais besoins. +

+
+ +
+ + + + +
+ + {currentPosition && ( +
+

Poste actuel

+

{currentPosition.data.role}

+

+ {currentPosition.data.companyUrl ? ( + {currentPosition.data.company} + ) : ( + currentPosition.data.company + )} + {currentPosition.data.location && ` · ${currentPosition.data.location}`} +

+
+ )} + + {recommendationTexts.length > 0 && ( +
+
+

Recommandations

+ Voir toutes → +
+
+ {recommendationTexts.map((rec) => ( + + ))} +
+
+ )} + +

Valeurs & Approche

+
+
    +
  • + + Le mouvement Software Craftsmanship +
  • +
  • + + L'utilité sociale du développeur +
  • +
  • + + Être fier de son travail, mais sans égo +
  • +
  • + + Approche Domain Driven Design +
  • +
  • + + Organisation agile : itération et amélioration continue +
  • +
+
+ +

Communauté & Enseignement

+
+

+ J'anime les Software Crafters d'Albi depuis 2018. Enseignant en génie logiciel à l'université Champollion d'Albi depuis 2019. +

+
+ +

En ligne

+
+ {[ + { label: 'LinkedIn', href: 'https://www.linkedin.com/in/jalil' }, + { label: 'Malt', href: 'https://www.malt.fr/profile/jalilarfaoui' }, + { label: 'Stack Overflow', href: 'https://stackexchange.com/users/54164/jalil' }, + { label: 'GitHub', href: 'https://github.com/JalilArfaoui' }, + { label: 'Framagit', href: 'https://framagit.org/jalil' }, + { label: 'Forge personnelle', href: 'https://forge.tiqa.fr' }, + ].map((link) => ( + + {link.label} + + + + + ))} +
+ +
+ Logo Tiqa +

+ SAS Tiqa
+ 12, rue Fabre d'Églantine — 81 000 Albi
+ 811 917 871 RCS Albi +

+
+
+
diff --git a/src/pages/code/parcours.astro b/src/pages/code/parcours.astro new file mode 100644 index 0000000..7c23059 --- /dev/null +++ b/src/pages/code/parcours.astro @@ -0,0 +1,94 @@ +--- +import { getCollection, render } from "astro:content"; +import Layout from "../../layouts/main.astro"; + +const locale = "fr"; + +const experiences = (await getCollection("experiences")) + .filter((e) => e.data.lang === locale && !e.data.draft) + .sort((a, b) => (b.data.startDate > a.data.startDate ? 1 : -1)); + +const typeIcons: Record = { + employment: '🏢', freelance: '💼', teaching: '🎓', + community: '🤝', entrepreneurship: '🚀', +}; + +function formatMonth(dateStr: string) { + const [year, month] = dateStr.split('-'); + return new Date(parseInt(year), parseInt(month) - 1) + .toLocaleDateString('fr-FR', { year: 'numeric', month: 'short' }); +} +--- + + +
+
+ + + + + Code + +

Parcours

+

Plus de 20 ans d'expérience en développement logiciel.

+
+ +
+ {experiences.map(async (exp) => { + const { Content } = await render(exp); + const isOngoing = !exp.data.endDate; + const start = formatMonth(exp.data.startDate); + const end = exp.data.endDate ? formatMonth(exp.data.endDate) : 'Présent'; + + return ( +
+
+ {isOngoing &&
} +
+ +
+
+ + {typeIcons[exp.data.type] || '💼'} {start} — {end} + + {exp.data.location && · {exp.data.location}} +
+ +

{exp.data.role}

+

+ {exp.data.companyUrl ? ( + {exp.data.company} + ) : exp.data.company} +

+ +
+ +
+ + {exp.data.technologies && exp.data.technologies.length > 0 && ( +
+ {exp.data.technologies.map((tech: string) => ( + + {tech} + + ))} +
+ )} +
+
+ ); + })} +
+
+
diff --git a/src/pages/code/projets.astro b/src/pages/code/projets.astro new file mode 100644 index 0000000..a591eea --- /dev/null +++ b/src/pages/code/projets.astro @@ -0,0 +1,46 @@ +--- +import { getCollection } from "astro:content"; +import Layout from "../../layouts/main.astro"; +import ProjectCard from "../../components/code/ProjectCard.astro"; + +const locale = "fr"; + +const projects = (await getCollection("projects")) + .filter((p) => p.data.lang === locale && !p.data.draft && p.data.category === "dev") + .sort((a, b) => { + if (a.data.featured !== b.data.featured) return a.data.featured ? -1 : 1; + return b.data.date.getTime() - a.data.date.getTime(); + }); +--- + + +
+
+ + + + + Code + +

Projets

+

Logiciels open source, outils et projets personnels.

+
+ +
+ {projects.map((project) => ( + + ))} +
+
+
diff --git a/src/pages/code/recommandations.astro b/src/pages/code/recommandations.astro new file mode 100644 index 0000000..19386c5 --- /dev/null +++ b/src/pages/code/recommandations.astro @@ -0,0 +1,43 @@ +--- +import { getCollection } from "astro:content"; +import Layout from "../../layouts/main.astro"; +import RecommendationCard from "../../components/code/RecommendationCard.astro"; + +const recommendations = (await getCollection("recommendations")) + .sort((a, b) => b.data.date.getTime() - a.data.date.getTime()); +--- + + +
+
+ + + + + Code + +

Recommandations

+

Ce que disent les gens avec qui j'ai travaillé.

+
+ +
+ {recommendations.map((rec) => ( +
+ +
+ ))} +
+
+
diff --git a/src/pages/en/code.astro b/src/pages/en/code.astro deleted file mode 100644 index dc5f34b..0000000 --- a/src/pages/en/code.astro +++ /dev/null @@ -1,138 +0,0 @@ ---- -import { Image } from "astro:assets"; -import PageHeading from "../../components/page-heading.astro"; -import Layout from "../../layouts/main.astro"; -import Link from "../../components/Link.astro"; -import logoTiqa from "../../assets/images/logo-tiqa-blanc.png"; ---- - - -
- - -

What I do

-
-

- Freelance developer based in Albi, France, I work with teams as a senior developer, tech lead or technical coach. I favor free software and tools that address real needs. -

-

- I carefully code well-thought-out applications that meet real needs. I lead my team toward the best solutions and most effective implementations for each use case. -

-
- -

My strengths

-
-
    -
  • Writing stable, operational, maintainable, scalable and well-tested code
  • -
  • Learning, and passing it on
  • -
  • Working as a team
  • -
  • Helping improve the team by raising issues and proposing solutions
  • -
  • Autonomy: knowing what needs to be done and doing it
  • -
-
- -

My values

-
-
    -
  • The Software Craftsmanship movement
  • -
  • The social usefulness of the developer
  • -
  • Taking pride in your work, without ego
  • -
  • Self-management, autonomy and responsibility
  • -
  • Domain Driven Design approach
  • -
  • Agile organization: iteration and continuous improvement
  • -
-
- -

What I offer

-
-
    -
  • 20 years of experience in software design
  • -
  • A strong commitment to the quality and usefulness of my work
  • -
  • User-centered development
  • -
-
- -

What I'm looking for

-
-
    -
  • A mission serving the public interest
  • -
  • A positive social and/or environmental impact
  • -
  • Ideally non-profit
  • -
  • Ideally open-source or free software
  • -
  • A great team that wants to raise the bar
  • -
-
- -

Skills

-
-

- Languages — TypeScript/JavaScript, PHP, Elixir -

-

- Practices — TDD, Clean Code, Domain-Driven Design, hexagonal architecture, continuous refactoring -

-
- -

Open source projects

-
-

- Débats.co — A collaborative platform for synthesizing public debates. -

-

- DisMoi — A civic tech browser extension that adds contextual information to the web. -

-

- mon-entreprise — The official assistant for entrepreneurs in France, a beta.gouv project. -

-
- -

Community

-
-

- I've been running the Software Crafters Albi meetup since 2018. We gather regularly to discuss code, practices and software craftsmanship. -

-
- -

Teaching

-
-

- Software engineering professor at Université Champollion in Albi since 2019 (Master AMINJ and Bachelor in Computer Science). Also taught at ESN 81 in Castres (development best practices, Node.js). -

-
- -

Background

-
-

- Currently lead developer of mon-entreprise.urssaf.fr at Urssaf Caisse nationale — 20+ simulators deployed on public websites, one million users per month. -

-

- Previously: CTO at GoBuild (building modeling, Lyon), frontend architect at ARaymond (Grenoble), tech lead at Veepee (formerly vente-privee) where I led a team of 8 developers and co-founded the internal React Academy training program. -

-

- Co-founder of DisMoi, a civic tech browser extension. Founder of Team Logics (2007-2011), a web agency where I led a team of 6 for clients like ALD Automotive, Joué Club and Consuel. -

-

- Self-taught developer since 2003. Best programming project of the 2003 class at UVSQ. -

-
-

Online

-
-

- LinkedIn · Malt · Stack Overflow · GitHub · Framagit · Personal forge -

-
- Tiqa logo -

- SAS Tiqa
- 12, rue Fabre d'Églantine — 81 000 Albi, France
- 811 917 871 RCS Albi -

-
-
diff --git a/src/pages/en/code/career.astro b/src/pages/en/code/career.astro new file mode 100644 index 0000000..0bec84b --- /dev/null +++ b/src/pages/en/code/career.astro @@ -0,0 +1,94 @@ +--- +import { getCollection, render } from "astro:content"; +import Layout from "../../../layouts/main.astro"; + +const locale = "en"; + +const experiences = (await getCollection("experiences")) + .filter((e) => e.data.lang === locale && !e.data.draft) + .sort((a, b) => (b.data.startDate > a.data.startDate ? 1 : -1)); + +const typeIcons: Record = { + employment: '🏢', freelance: '💼', teaching: '🎓', + community: '🤝', entrepreneurship: '🚀', +}; + +function formatMonth(dateStr: string) { + const [year, month] = dateStr.split('-'); + return new Date(parseInt(year), parseInt(month) - 1) + .toLocaleDateString('en-US', { year: 'numeric', month: 'short' }); +} +--- + + +
+
+ + + + + Code + +

Career

+

Over 20 years of experience in software development.

+
+ +
+ {experiences.map(async (exp) => { + const { Content } = await render(exp); + const isOngoing = !exp.data.endDate; + const start = formatMonth(exp.data.startDate); + const end = exp.data.endDate ? formatMonth(exp.data.endDate) : 'Present'; + + return ( +
+
+ {isOngoing &&
} +
+ +
+
+ + {typeIcons[exp.data.type] || '💼'} {start} — {end} + + {exp.data.location && · {exp.data.location}} +
+ +

{exp.data.role}

+

+ {exp.data.companyUrl ? ( + {exp.data.company} + ) : exp.data.company} +

+ +
+ +
+ + {exp.data.technologies && exp.data.technologies.length > 0 && ( +
+ {exp.data.technologies.map((tech: string) => ( + + {tech} + + ))} +
+ )} +
+
+ ); + })} +
+
+
diff --git a/src/pages/en/code/index.astro b/src/pages/en/code/index.astro new file mode 100644 index 0000000..66b84b5 --- /dev/null +++ b/src/pages/en/code/index.astro @@ -0,0 +1,175 @@ +--- +import { getCollection } from "astro:content"; +import { Image } from "astro:assets"; +import Layout from "../../../layouts/main.astro"; +import Link from "../../../components/Link.astro"; +import NavigationCard from "../../../components/code/NavigationCard.astro"; +import FeaturedRecommendation from "../../../components/code/FeaturedRecommendation.astro"; +import logoTiqa from "../../../assets/images/logo-tiqa-blanc.png"; + +const locale = "en"; + +const experiences = (await getCollection("experiences")) + .filter((e) => e.data.lang === locale && !e.data.draft) + .sort((a, b) => (b.data.startDate > a.data.startDate ? 1 : -1)); + +const currentPosition = experiences.find((e) => !e.data.endDate); + +const recommendations = (await getCollection("recommendations")) + .sort((a, b) => b.data.date.getTime() - a.data.date.getTime()) + .slice(0, 3); + +const recommendationTexts = recommendations.map((rec) => ({ + ...rec, + text: rec.body || '', +})); +--- + + +
+
+

Code

+

+ Over 20 years building software. Craftsmanship, TDD, DDD — and an obsession with the biases we unknowingly put into code. +

+
+ +
+

+ Freelance developer based in Albi, France, I work with teams as a senior developer, tech lead or technical coach. I favor free software and tools that address real needs. +

+
+ +
+ + + + +
+ + {currentPosition && ( +
+

Current position

+

{currentPosition.data.role}

+

+ {currentPosition.data.companyUrl ? ( + {currentPosition.data.company} + ) : ( + currentPosition.data.company + )} + {currentPosition.data.location && ` · ${currentPosition.data.location}`} +

+
+ )} + + {recommendationTexts.length > 0 && ( +
+
+

Recommendations

+ See all → +
+
+ {recommendationTexts.map((rec) => ( + + ))} +
+
+ )} + +

Values & Approach

+
+
    +
  • + + The Software Craftsmanship movement +
  • +
  • + + The social usefulness of the developer +
  • +
  • + + Taking pride in your work, without ego +
  • +
  • + + Domain Driven Design approach +
  • +
  • + + Agile organization: iteration and continuous improvement +
  • +
+
+ +

Community & Teaching

+
+

+ I've been running the Software Crafters Albi meetup since 2018. Software engineering professor at Université Champollion in Albi since 2019. +

+
+ +

Online

+
+ {[ + { label: 'LinkedIn', href: 'https://www.linkedin.com/in/jalil' }, + { label: 'Malt', href: 'https://www.malt.fr/profile/jalilarfaoui' }, + { label: 'Stack Overflow', href: 'https://stackexchange.com/users/54164/jalil' }, + { label: 'GitHub', href: 'https://github.com/JalilArfaoui' }, + { label: 'Framagit', href: 'https://framagit.org/jalil' }, + { label: 'Personal forge', href: 'https://forge.tiqa.fr' }, + ].map((link) => ( + + {link.label} + + + + + ))} +
+ +
+ Tiqa logo +

+ SAS Tiqa
+ 12, rue Fabre d'Églantine — 81 000 Albi, France
+ 811 917 871 RCS Albi +

+
+
+
diff --git a/src/pages/en/code/projects.astro b/src/pages/en/code/projects.astro new file mode 100644 index 0000000..148da25 --- /dev/null +++ b/src/pages/en/code/projects.astro @@ -0,0 +1,46 @@ +--- +import { getCollection } from "astro:content"; +import Layout from "../../../layouts/main.astro"; +import ProjectCard from "../../../components/code/ProjectCard.astro"; + +const locale = "en"; + +const projects = (await getCollection("projects")) + .filter((p) => p.data.lang === locale && !p.data.draft && p.data.category === "dev") + .sort((a, b) => { + if (a.data.featured !== b.data.featured) return a.data.featured ? -1 : 1; + return b.data.date.getTime() - a.data.date.getTime(); + }); +--- + + +
+
+ + + + + Code + +

Projects

+

Open source software, tools and personal projects.

+
+ +
+ {projects.map((project) => ( + + ))} +
+
+
diff --git a/src/pages/en/code/recommendations.astro b/src/pages/en/code/recommendations.astro new file mode 100644 index 0000000..09fd84b --- /dev/null +++ b/src/pages/en/code/recommendations.astro @@ -0,0 +1,43 @@ +--- +import { getCollection } from "astro:content"; +import Layout from "../../../layouts/main.astro"; +import RecommendationCard from "../../../components/code/RecommendationCard.astro"; + +const recommendations = (await getCollection("recommendations")) + .sort((a, b) => b.data.date.getTime() - a.data.date.getTime()); +--- + + +
+
+ + + + + Code + +

Recommendations

+

What people I've worked with say about me.

+
+ +
+ {recommendations.map((rec) => ( +
+ +
+ ))} +
+
+
diff --git a/src/pages/en/code/skills.astro b/src/pages/en/code/skills.astro new file mode 100644 index 0000000..67dead6 --- /dev/null +++ b/src/pages/en/code/skills.astro @@ -0,0 +1,35 @@ +--- +import Layout from "../../../layouts/main.astro"; +import SkillCategory from "../../../components/code/SkillCategory.astro"; +import skillsData from "../../../data/skills.json"; + +const locale = "en"; +--- + + +
+
+ + + + + Code + +

Skills

+

Languages, frameworks, practices and tools I use daily.

+
+ +
+ {skillsData.categories.map((category) => ( + + ))} +
+
+
diff --git a/src/pages/projects.astro b/src/pages/projects.astro deleted file mode 100644 index aba8346..0000000 --- a/src/pages/projects.astro +++ /dev/null @@ -1,32 +0,0 @@ ---- -import projects from "../data/projects.json"; -import PageHeading from "../components/page-heading.astro"; -import Project from "../components/project.astro"; -import Layout from "../layouts/main.astro"; ---- - - -
- - -
- { - projects.map((project) => { - return ( - - ) - }) - } -
-
-
diff --git a/src/utils/i18n.ts b/src/utils/i18n.ts index b626c3f..801c9bb 100644 --- a/src/utils/i18n.ts +++ b/src/utils/i18n.ts @@ -45,6 +45,9 @@ export const translations = { shows: { fr: 'Spectacles', en: 'Shows', ar: 'عروض' }, now: { fr: 'Maintenant', en: 'Now', ar: 'الآن' }, uses: { fr: 'Utilise', en: 'Uses', ar: 'يستخدم' }, + career: { fr: 'Parcours', en: 'Career', ar: 'المسار' }, + skills: { fr: 'Compétences', en: 'Skills', ar: 'المهارات' }, + recommendations: { fr: 'Recommandations', en: 'Recommendations', ar: 'التوصيات' }, }, common: { siteName: { fr: 'Jalil Arfaoui', en: 'Jalil Arfaoui', ar: 'جليل عرفاوي' }, @@ -120,6 +123,38 @@ export const translations = { en: 'Capturing the moment, telling a story', ar: 'التقاط اللحظة، سرد قصة' } + }, + career: { + title: { fr: 'Parcours', en: 'Career', ar: 'المسار المهني' }, + description: { + fr: 'Plus de 20 ans d\'expérience en développement logiciel', + en: 'Over 20 years of experience in software development', + ar: 'أكثر من 20 سنة من الخبرة في تطوير البرمجيات' + } + }, + skills: { + title: { fr: 'Compétences', en: 'Skills', ar: 'المهارات' }, + description: { + fr: 'Langages, frameworks, pratiques et outils', + en: 'Languages, frameworks, practices and tools', + ar: 'لغات، أطر عمل، ممارسات وأدوات' + } + }, + recommendations: { + title: { fr: 'Recommandations', en: 'Recommendations', ar: 'التوصيات' }, + description: { + fr: 'Ce que disent les gens avec qui j\'ai travaillé', + en: 'What people I\'ve worked with say about me', + ar: 'ما يقوله الأشخاص الذين عملت معهم' + } + }, + projects: { + title: { fr: 'Projets', en: 'Projects', ar: 'المشاريع' }, + description: { + fr: 'Logiciels open source et projets personnels', + en: 'Open source software and personal projects', + ar: 'برمجيات مفتوحة المصدر ومشاريع شخصية' + } } } }; diff --git a/src/utils/page-translations.ts b/src/utils/page-translations.ts index d58e599..df469dd 100644 --- a/src/utils/page-translations.ts +++ b/src/utils/page-translations.ts @@ -8,6 +8,10 @@ const translationGroups: Record[] = [ { fr: "/", en: "/en", ar: "/ar" }, { fr: "/a-propos", en: "/en/about", ar: "/ar/نبذة-عني" }, { fr: "/code", en: "/en/code", ar: "/ar/برمجة" }, + { fr: "/code/parcours", en: "/en/code/career", ar: "/ar/برمجة/مسار" }, + { fr: "/code/projets", en: "/en/code/projects", ar: "/ar/برمجة/مشاريع" }, + { fr: "/code/recommandations", en: "/en/code/recommendations", ar: "/ar/برمجة/توصيات" }, + { fr: "/code/competences", en: "/en/code/skills", ar: "/ar/برمجة/مهارات" }, { fr: "/theatre", en: "/en/acting", ar: "/ar/مسرح" }, { fr: "/photo", en: "/en/photo", ar: "/ar/تصوير" }, ];