@base <https://michielvandevelde.com/> .

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix schema: <http://schema.org/> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix portfolio: <https://michielvandevelde.com/vocab#> .

# ============================================================================
# Michiel Van de Velde: the knowledge graph behind michielvandevelde.com
#
# Single source of truth: the homepage is rendered from this file at build time,
# and the same file is published as is at /data/site.ttl.
# ============================================================================


# ---- Person ------------------------------------------------------------------

<id/me>
    a foaf:Person, schema:Person ;
    foaf:name "Michiel Van de Velde" ;
    schema:name "Michiel Van de Velde" ;
    foaf:givenName "Michiel" ;
    foaf:familyName "Van de Velde" ;

    portfolio:tagline "I started in networks. I ended up caring about data." ;
    portfolio:headline "Engineer from Belgium: infrastructure, linked data and AI." ;
    schema:description "Engineer from Belgium. I keep infrastructure running, and build with linked data and AI." ;

    schema:email "michiel.vdvelde@outlook.com" ;
    foaf:homepage <https://michielvandevelde.com/> ;
    schema:url <https://michielvandevelde.com/> ;
    schema:sameAs
        <https://www.linkedin.com/in/michiel-van-de-velde-1a9962388/> ,
        <https://gitlab.com/michiel.vdvelde> ,
        <https://github.com/Michiel-VandeVelde> ,
        <https://mastodon.social/@michielvandevelde> ;

    # Bachelor ICT, Network & Security Engineer, cum laude.
    # TODO(michiel): add the graduation year.
    schema:alumniOf <org/odisee> ;
    schema:memberOf <roles/okbe-board> ;
    portfolio:role <roles/odisee-bachelor>, <roles/student-organisations>, <roles/dengue-devops>, <roles/idlab-internship>,
        <roles/idlab-student-job>, <roles/okbe-board>, <roles/idlab-ai-engineer> ;

    portfolio:researchInterest <topics/data-sovereignty>, <topics/knowledge-graphs>, <topics/grounded-ai> ;
    portfolio:skillLayer <skills/ai-systems>, <skills/knowledge-graphs>, <skills/data-sovereignty>, <skills/data-streaming>,
        <skills/identity-access>, <skills/platform-devops>, <skills/infrastructure-security> ;

    schema:knowsAbout
        "Knowledge graphs", "RDF", "SPARQL", "Solid", "JSON-LD", "Linked Data Fragments",
        "TypeScript", "Python", "GraphQL",
        "Docker", "Kubernetes", "CI/CD", "Infrastructure as code",
        "Linux system administration", "Network and security infrastructure",
        "Keycloak", "OAuth / OIDC", "OpenFGA",
        "WCAG accessibility" ;

    foaf:currentProject <projects/this-site> ;
    foaf:pastProject <projects/whose-data>, <projects/hudson>, <projects/ldf-server-ts>, <projects/tropical-disease-mapping> .


# ---- Research interests ------------------------------------------------------
# Open questions rather than claims. portfolio:context says, in one line, why each matters to me.

<topics/data-sovereignty>
    a schema:DefinedTerm ;
    schema:name "Data sovereignty" ;
    portfolio:shortName "Data sovereignty" ;
    portfolio:question "Owning your own data" ;
    portfolio:context "You decide who gets it, and you can take it back." ;
    portfolio:order 1 .

<topics/knowledge-graphs>
    a schema:DefinedTerm ;
    schema:name "Knowledge graph infrastructure" ;
    portfolio:shortName "Knowledge graphs" ;
    portfolio:question "Systems that understand each other" ;
    portfolio:context "Linked data carries its meaning along, so different services can use it." ;
    portfolio:order 2 .

<topics/grounded-ai>
    a schema:DefinedTerm ;
    schema:name "Self-hosted AI" ;
    portfolio:shortName "Self-hosted AI" ;
    portfolio:question "Open-source AI you run yourself" ;
    portfolio:context "Open models on your own hardware keep your data private. I run mine at home." ;
    portfolio:order 3 .


# ---- Skill stack ---------------------------------------------------------------
# From the model down to the server. Each layer names the projects that prove it.

<skills/ai-systems>
    a portfolio:SkillLayer ;
    schema:name "AI systems" ;
    portfolio:summary "LLMs in production: self-hosted and commercial models, AI-assisted workflows, routing each task for cost and privacy." ;
    portfolio:technology "Self-hosted LLMs", "OpenClaw", "GitHub Apps" ;
    portfolio:provenBy <projects/hudson> ;
    portfolio:pattern "mesh" ;
    portfolio:order 1 .

<skills/knowledge-graphs>
    a portfolio:SkillLayer ;
    schema:name "Knowledge graphs" ;
    portfolio:summary "Modelling, publishing and querying linked data." ;
    portfolio:technology "RDF", "SPARQL", "JSON-LD", "Linked Data Fragments", "Comunica" ;
    portfolio:provenBy <projects/ldf-server-ts>, <projects/whose-data>, <projects/this-site> ;
    portfolio:pattern "nodes" ;
    portfolio:order 2 .

<skills/data-sovereignty>
    a portfolio:SkillLayer ;
    schema:name "Data sovereignty" ;
    portfolio:summary "Architectures where people keep their own data, with shared vocabularies for interoperability." ;
    portfolio:technology "Solid", "Shared vocabularies", "Interoperability" ;
    portfolio:provenBy <projects/whose-data> ;
    portfolio:pattern "rings" ;
    portfolio:order 3 .

<skills/data-streaming>
    a portfolio:SkillLayer ;
    schema:name "Data and streaming" ;
    portfolio:summary "APIs and event-driven pipelines that move and analyse data." ;
    portfolio:technology "Python", "GraphQL", "Redpanda", "ClickHouse" ;
    portfolio:provenBy <projects/whose-data> ;
    portfolio:pattern "lines" ;
    portfolio:order 4 .

<skills/identity-access>
    a portfolio:SkillLayer ;
    schema:name "Identity and access" ;
    portfolio:summary "Authentication and fine-grained authorisation: who may see which data." ;
    portfolio:technology "Keycloak", "OAuth / OIDC", "OpenFGA" ;
    portfolio:provenBy <projects/whose-data> ;
    portfolio:pattern "grid" ;
    portfolio:order 5 .

<skills/platform-devops>
    a portfolio:SkillLayer ;
    schema:name "Platform and DevOps" ;
    portfolio:summary "Deploying and running services: containers, pipelines, monitoring and backups." ;
    portfolio:technology "Docker", "Kubernetes", "CI/CD", "Infrastructure as code", "Monitoring", "Backups" ;
    portfolio:provenBy <projects/tropical-disease-mapping>, <projects/hudson>, <projects/this-site> ;
    portfolio:pattern "columns" ;
    portfolio:order 6 .

<skills/infrastructure-security>
    a portfolio:SkillLayer ;
    schema:name "Infrastructure and security" ;
    portfolio:summary "The foundation: Linux servers, networks, security hardening and accessible web delivery." ;
    portfolio:technology "Linux", "Networking", "nginx", "TLS", "WCAG" ;
    portfolio:provenBy <projects/this-site>, <projects/tropical-disease-mapping> ;
    portfolio:pattern "dots" ;
    portfolio:order 7 .


# ---- Organisations -------------------------------------------------------------

<org/imec> a schema:ResearchOrganization ;
    schema:name "imec" ;
    schema:url <https://www.imec-int.com/> .

<org/idlab> a schema:ResearchOrganization ;
    schema:name "imec-IDLab" ;
    schema:parentOrganization <org/imec>, <org/ugent> .

<org/ugent> a schema:CollegeOrUniversity ;
    schema:name "Ghent University" .

<org/itm> a schema:ResearchOrganization ;
    schema:name "Institute of Tropical Medicine" ;
    schema:url <https://www.itg.be/> .

<org/odisee> a schema:CollegeOrUniversity ;
    schema:name "Odisee" .

<org/okbe> a schema:NGO ;
    schema:name "Open Knowledge Belgium" ;
    schema:url <https://openknowledge.be/> .


# ---- Roles ---------------------------------------------------------------------
# My work experience, as shown in the git graph on the homepage. Each role is a
# portfolio:role of me, in date order; portfolio:alongside marks the ones that ran next to
# the main line (a side branch). schema:description is the line under the title; without
# it the organisations are listed. A role without an end date is ongoing.

<roles/odisee-bachelor> a schema:OrganizationRole ;
    schema:roleName "Bachelor ICT, Network & Security Engineer" ;
    portfolio:kind "Education" ;
    portfolio:organization <org/odisee> ;
    schema:description "Odisee, cum laude" .

<roles/student-organisations> a schema:OrganizationRole ;
    schema:roleName "IT for student organisations" ;
    schema:startDate "2021"^^xsd:gYear ;
    schema:endDate "2025"^^xsd:gYear ;
    schema:description "Websites, databases and security" ;
    portfolio:alongside true .

<roles/dengue-devops> a schema:OrganizationRole ;
    schema:roleName "DevOps, dengue early warning" ;
    schema:startDate "2025-09"^^xsd:gYearMonth ;
    schema:endDate "2026-03"^^xsd:gYearMonth ;
    portfolio:organization <org/ugent>, <org/itm> ;
    schema:description "Ghent University and ITM Antwerp" ;
    portfolio:project <projects/tropical-disease-mapping> .

<roles/idlab-internship> a schema:OrganizationRole ;
    schema:roleName "Internship and bachelor's thesis" ;
    schema:startDate "2026-02"^^xsd:gYearMonth ;
    schema:endDate "2026-05"^^xsd:gYearMonth ;
    portfolio:organization <org/idlab>, <org/odisee> ;
    schema:description "imec-IDLab, with Odisee" ;
    portfolio:project <projects/whose-data> .

<roles/idlab-student-job> a schema:OrganizationRole ;
    schema:roleName "Student job: AI and open source" ;
    schema:startDate "2026-07"^^xsd:gYearMonth ;
    schema:endDate "2026-09"^^xsd:gYearMonth ;
    portfolio:organization <org/idlab> ;
    portfolio:project <projects/hudson>, <projects/ldf-server-ts> .

<roles/okbe-board> a schema:OrganizationRole ;
    schema:memberOf <org/okbe> ;
    schema:roleName "Board member" ;
    schema:startDate "2026-09"^^xsd:gYearMonth ;
    portfolio:organization <org/okbe> ;
    portfolio:alongside true .

<roles/idlab-ai-engineer> a schema:OrganizationRole ;
    schema:roleName "AI engineer" ;
    schema:startDate "2026-11-15"^^xsd:date ;
    portfolio:organization <org/idlab> .


# ---- People --------------------------------------------------------------------

<people/bart-delrue> a schema:Person ; schema:name "Bart Delrue" .
<people/pieter-colpaert> a schema:Person ; schema:name "Pieter Colpaert" .
<people/ben-de-meester> a schema:Person ; schema:name "Ben De Meester" .


# ---- Projects ------------------------------------------------------------------

<projects/whose-data>
    a schema:Project, schema:Thesis ;
    schema:name "Whose Data Is It Anyway?" ;
    portfolio:shortName "Thesis: data sovereignty" ;
    dct:title "Whose Data Is It Anyway? Designing a User-Centric and Sovereign Architecture for Media Consumption in the European Digital Space" ;
    portfolio:kind "Bachelor's thesis" ;
    portfolio:summary "Keeping your data outside the platforms." ;
    portfolio:pitch "Your Spotify, YouTube and SoundCloud history in a Solid pod you control. Graded 18/20." ;
    schema:description "A proof of concept: you collect what you listened to and watched on Spotify, YouTube and SoundCloud, put it together, and decide who gets to use it." ;
    portfolio:approach "I modelled the data in RDF and JSON-LD on Solid, wrote the APIs in Python and GraphQL, processed the events with Redpanda and ClickHouse, and handled login and permissions with Keycloak, OAuth/OIDC and OpenFGA." ;
    portfolio:outcome "It works: your data can live with you instead of with the platform. Graded 18/20." ;
    portfolio:grade "18/20" ;
    schema:startDate "2026-02"^^xsd:gYearMonth ;
    schema:endDate "2026-05"^^xsd:gYearMonth ;
    portfolio:organization <org/idlab>, <org/odisee> ;
    portfolio:supervisor <people/bart-delrue>, <people/pieter-colpaert>, <people/ben-de-meester> ;
    schema:url <https://michiel-vandevelde.github.io/Thesis/> ;
    portfolio:topic <topics/data-sovereignty>, <topics/knowledge-graphs> ;
    portfolio:technology "Solid", "RDF", "JSON-LD", "Python", "GraphQL", "Redpanda", "ClickHouse", "Keycloak", "OpenFGA" ;
    portfolio:order 1 .

# TODO(michiel): confirm Hudson may be named publicly, and add a link if there is one.
<projects/hudson>
    a schema:Project ;
    schema:name "Hudson" ;
    portfolio:shortName "Hudson: AI assistant" ;
    portfolio:kind "AI workflow assistant" ;
    portfolio:summary "Hudson: an AI assistant for a research group." ;
    portfolio:pitch "Reviews code and picks up tasks from GitHub, on local models where possible." ;
    portfolio:background "It started in my homelab. Running local LLMs there taught me what they're good at, and what they cost." ;
    schema:description "Anyone in the group can ask for a code review, hand off a task or get a pull request, straight from a GitHub issue, a comment or the web UI." ;
    portfolio:approach "Built on OpenClaw. I deployed it with Docker, as code, through GitHub Actions; wrote a GitHub App that checks every webhook and only gets the access it needs; and connected it over a private network to our own AMD GPU servers." ;
    portfolio:outcome "Each task goes to a local or a commercial model, depending on what it costs, how private the data is and what the task needs. Better, and cheaper." ;
    schema:startDate "2026-07"^^xsd:gYearMonth ;
    schema:endDate "2026-09"^^xsd:gYearMonth ;
    portfolio:organization <org/idlab> ;
    portfolio:topic <topics/grounded-ai> ;
    portfolio:technology "OpenClaw", "Docker", "GitHub Actions", "GitHub Apps", "Infrastructure as code", "Self-hosted LLMs" ;
    portfolio:order 2 .

<projects/ldf-server-ts>
    a schema:Project ;
    schema:name "Linked Data Fragments Server: TypeScript migration" ;
    portfolio:shortName "LDF Server migration" ;
    portfolio:kind "Open-source contribution" ;
    portfolio:summary "Moving an open-source linked data server to TypeScript." ;
    portfolio:pitch "A large part of moving the Linked Data Fragments Server, 12 packages, to strict TypeScript." ;
    schema:description "The server publishes RDF data on the web, and keeps the server cheap to run while doing it." ;
    portfolio:approach "Turned on strict type checking, package by package, and replaced the old build, lint and test setup with Vitest and ESLint." ;
    portfolio:outcome "Mistakes show up before the code runs, and it's easier for someone new to start contributing." ;
    schema:startDate "2026-07"^^xsd:gYearMonth ;
    schema:endDate "2026-09"^^xsd:gYearMonth ;
    portfolio:organization <org/idlab> ;
    schema:codeRepository <https://github.com/LinkedDataFragments/Server.js> ;
    portfolio:topic <topics/knowledge-graphs> ;
    portfolio:technology "TypeScript", "Linked Data Fragments", "Vitest", "ESLint" ;
    portfolio:order 3 .

<projects/tropical-disease-mapping>
    a schema:Project ;
    schema:name "Tropical Disease Mapping" ;
    portfolio:shortName "Tropical Disease Mapping" ;
    portfolio:kind "International research project" ;
    portfolio:summary "Getting outbreak data to doctors in time." ;
    portfolio:pitch "Case reports went from days by hand to a web app. I kept it running." ;
    schema:description "A project of Ghent University, the Institute of Tropical Medicine in Antwerp and Cuban medical institutions, building software to map and fight dengue." ;
    portfolio:approach "I did the DevOps: deployments, monitoring and backups, on Linux and Kubernetes." ;
    portfolio:challenge "When I joined, almost nothing worked. There was code, but a lot of tech debt, so most of my work was cleaning up until the platform stayed up, also under load." ;
    portfolio:outcome "The team could deploy it, see when something broke, and restore it. Case data reached hospitals, doctors and non-profits much faster than by hand." ;
    schema:url <https://hes4sd.be/project/towards-a-real-time-dengue-early-warning-system-in-cuba-for-outbreak-prediction-and-public-health-decision-making/> ;
    schema:startDate "2025-09"^^xsd:gYearMonth ;
    schema:endDate "2026-03"^^xsd:gYearMonth ;
    portfolio:organization <org/ugent>, <org/itm> ;
    portfolio:technology "Kubernetes", "Linux", "CI/CD", "Monitoring", "Backups" ;
    portfolio:order 4 .

<projects/this-site>
    a schema:Project ;
    schema:name "michielvandevelde.com" ;
    portfolio:shortName "This site" ;
    portfolio:kind "Personal knowledge graph" ;
    portfolio:summary "This site, built from a knowledge graph." ;
    schema:description "Every fact on the homepage comes from one Turtle file, published next to the page at /data/site.ttl." ;
    portfolio:topic <topics/knowledge-graphs> ;
    schema:codeRepository <https://gitlab.com/michiel.vdvelde/webserver> ;
    portfolio:technology "RDF", "TypeScript", "Vite", "nginx" ;
    portfolio:order 5 .


# ---- Vocabulary ----------------------------------------------------------------

portfolio:tagline a rdf:Property ; rdfs:label "tagline" ; rdfs:comment "Short statement used as the homepage headline." .
portfolio:headline a rdf:Property ; rdfs:label "headline" ; rdfs:comment "One-line professional summary." .
portfolio:researchInterest a rdf:Property ; rdfs:label "research interest" .
portfolio:question a rdf:Property ; rdfs:label "research question" .
portfolio:context a rdf:Property ; rdfs:label "context" ; rdfs:comment "Why a research question matters to me." .
portfolio:pitch a rdf:Property ; rdfs:label "pitch" ; rdfs:comment "One line on what the project is, shown on the homepage." .
portfolio:background a rdf:Property ; rdfs:label "background" ; rdfs:comment "Where a project came from." .
portfolio:challenge a rdf:Property ; rdfs:label "challenge" ; rdfs:comment "What was hard, and the trade-offs that mattered." .
portfolio:shortName a rdf:Property ; rdfs:label "short name" ; rdfs:comment "Label used in the graph visual." .
portfolio:kind a rdf:Property ; rdfs:label "kind of work" .
portfolio:summary a rdf:Property ; rdfs:label "summary" .
portfolio:approach a rdf:Property ; rdfs:label "approach" .
portfolio:outcome a rdf:Property ; rdfs:label "outcome" .
portfolio:grade a rdf:Property ; rdfs:label "grade" .
portfolio:organization a rdf:Property ; rdfs:label "organisation" .
portfolio:supervisor a rdf:Property ; rdfs:label "supervisor" .
portfolio:topic a rdf:Property ; rdfs:label "topic" ; rdfs:comment "Research interest a project relates to." .
portfolio:technology a rdf:Property ; rdfs:label "technology" .
portfolio:order a rdf:Property ; rdfs:label "display order" .
portfolio:role a rdf:Property ; rdfs:label "role" ; rdfs:comment "A job, study or volunteer role of mine, shown in the work experience." .
portfolio:alongside a rdf:Property ; rdfs:label "alongside" ; rdfs:comment "True for a role that ran next to the main line, drawn as a side branch." .
portfolio:project a rdf:Property ; rdfs:label "project" ; rdfs:comment "A project done in this role, shown under it." .
portfolio:SkillLayer a rdfs:Class ; rdfs:label "skill layer" ; rdfs:comment "One layer of the skill stack, from AI systems down to infrastructure." .
portfolio:skillLayer a rdf:Property ; rdfs:label "skill layer" .
portfolio:provenBy a rdf:Property ; rdfs:label "proven by" ; rdfs:comment "A project that demonstrates this skill layer." .
portfolio:pattern a rdf:Property ; rdfs:label "plate pattern" ; rdfs:comment "Texture of the layer's plate in the 3D stack." .
