feat: add sync-profile script to populate default CV from persons repo
Some checks failed
Release / Release (push) Has been cancelled
Release / Build & Push Docker Image (push) Has been cancelled

This commit is contained in:
Tuan-Dat Tran
2026-07-08 00:27:56 +02:00
parent 88b914a3e5
commit e765551709
4 changed files with 347 additions and 182 deletions

View File

@@ -24,93 +24,94 @@ export async function initDB() {
await db('cv_data').insert({ await db('cv_data').insert({
id: 1, id: 1,
data: JSON.stringify({ data: JSON.stringify({
personal: { "personal": {
name: "Tuan-Dat Tran", "name": "Tuan-Dat Tran",
title: "DevOps Engineer", "title": "Junior DevOps Engineer",
intro: "DevOps Engineer and Homelab Enthusiast based in Essen, Germany. Primary owner of a production aviation SaaS platform on Azure AKS, with a research background in P4 programmable networks and a co-authored IEEE publication.", "intro": "DevOps Engineer and Homelab Enthusiast based in Essen, Germany. Primary owner of a production aviation SaaS platform on Azure AKS, with a research background in P4 programmable networks and a co-authored IEEE publication.",
email: "tuan-dat.tran@dextradata.com", "email": "tuan-dat.tran@dextradata.com",
github: "https://github.com/TuDatTr", "github": "https://github.com/TuDatTr",
linkedin: "https://www.linkedin.com/in/tudattr/", "linkedin": "https://www.linkedin.com/in/tudattr/",
location: "Essen, Germany" "location": "Essen, Germany"
}, },
experience: [ "experience": [
{ {
id: 1, "id": 1,
role: "DevOps Engineer", "role": "Junior DevOps Engineer",
company: "DextraData GmbH", "company": "DextraData GRC Technologies GmbH",
period: "2025 present", "period": "2025 present",
type: "Full-time", "type": "Full-time",
description: "Primary owner of the Logipad aviation SaaS platform and secondary owner of the GRASP GRC platform, both running on Azure AKS and Rancher-managed Kubernetes clusters.", "description": "Primary owner of the GRASP GRC platform and Logipad aviation SaaS platform, running on Azure AKS and Rancher-managed Kubernetes clusters.",
highlights: [ "highlights": [
"Drives GitOps adoption with ArgoCD across production Kubernetes clusters", "Drives GitOps adoption with ArgoCD across production Kubernetes clusters",
"Manages CI/CD pipelines with Jenkins and Bitbucket Pipelines", "Manages CI/CD pipelines with Bitbucket Pipelines",
"Leads incident response for production outages", "Leads incident response and on-call for production outages",
"Implemented Azure Container Registry mirroring to resolve Docker Hub rate limits", "Reduced GRASP frontend pipeline from 30 to 16 minutes",
"Eliminated ~$2k/month Azure logging costs via workspace restructuring",
"Built internal AI tooling with LiteLLM and Ollama", "Built internal AI tooling with LiteLLM and Ollama",
"Promoted from Junior DevOps Engineer in January 2026" "Implemented Azure Container Registry mirroring to resolve Docker Hub rate limits"
] ]
}, },
{ {
id: 2, "id": 2,
role: "Research Assistant", "role": "Research Assistant",
company: "NCS Group, Universität Duisburg-Essen", "company": "NCS Group, Universität Duisburg-Essen",
period: "2021 2024", "period": "2021 2024",
type: "Part-time", "type": "Part-time",
description: "Hands-on P4 and programmable data plane research on Intel Tofino ASICs and BMv2, culminating in a co-authored publication at IEEE LCN 2023 (Reverse Path Congestion Marking).", "description": "Hands-on P4 and programmable data plane research on Intel Tofino ASICs and BMv2, culminating in a co-authored publication at IEEE LCN 2023 (Reverse Path Congestion Marking).",
highlights: [ "highlights": [
"Co-authored RPM paper published at IEEE LCN 2023", "Co-authored RPM: Reverse Path Congestion Marking on P4 Programmable Switches — IEEE LCN 2023",
"Built a Dockerized federated LSTM system with custom client-selection strategies for 5G network research", "Built a Dockerized federated LSTM system with custom client-selection strategies for 5G network research",
"Implemented low-latency DASH video streaming on Kubernetes and WebRTC SVC simulcast", "Implemented low-latency DASH video streaming on Kubernetes and WebRTC SVC simulcast via Janus",
"Managed lab infrastructure: Ansible-automated servers, 100G NIC testbeds (Intel E810, Netronome)", "Managed lab infrastructure: Ansible-automated servers, 100G NIC testbeds (Intel E810, Netronome), DPDK",
"Administered AWS accounts, PartDB inventory system, and the group website" "Administered AWS accounts, PartDB inventory system, and the group website"
] ]
}, },
{ {
id: 3, "id": 3,
role: "Student Mentor", "role": "Student Mentor",
company: "Universität Duisburg-Essen", "company": "Universität Duisburg-Essen",
period: "2021 2022", "period": "2021 2022",
type: "Volunteer", "type": "Volunteer",
description: "Introduced groups of ~20 freshmen to their new academic environment at the start of each semester, providing organizational and technical guidance throughout their first year in the computer science programme.", "description": "Introduced groups of ~20 freshmen to their new academic environment each semester, providing organizational and technical guidance throughout their first year.",
highlights: [ "highlights": [
"Guided new students through academic orientation each semester", "Guided new students through academic orientation each semester",
"Provided technical and organizational support throughout the first year" "Provided technical and organizational support throughout the first year"
] ]
}, },
{ {
id: 4, "id": 4,
role: "Software Engineer", "role": "Software Engineer",
company: "gefeba Engineering GmbH", "company": "gefeba Engineering GmbH",
period: "2018 2020", "period": "2018 2020",
type: "Part-time", "type": "Part-time",
description: "Worked on the company's main product — a frame-based data exchange system for monitoring industrial machinery — and developed a real-time log visualization application.", "description": "Worked on the company's main product — a frame-based data exchange system for monitoring industrial machinery — and developed a real-time log visualization application.",
highlights: [ "highlights": [
"Developed features for a frame-based industrial data exchange system", "Developed features for a frame-based industrial data exchange system",
"Built a real-time log visualization application for industrial machinery", "Built a real-time log visualization application for industrial machinery",
"Stack: C#, Angular, Bootstrap, Entity Framework" "Stack: C#, Angular, Bootstrap, Entity Framework"
] ]
}, },
{ {
id: 5, "id": 5,
role: "Student Council Member", "role": "Student Council Member",
company: "Universität Duisburg-Essen", "company": "Universität Duisburg-Essen",
period: "2016 2019", "period": "2016 2019",
type: "Volunteer", "type": "Volunteer",
description: "Participated in faculty committees and organized social events. Main responsibilities included managing the faculty's IT infrastructure and providing support to fellow students.", "description": "Participated in faculty committees and organized social events. Managed the faculty's IT infrastructure and provided support to fellow students.",
highlights: [ "highlights": [
"Managed faculty IT infrastructure (Linux, Networking)", "Managed faculty IT infrastructure (Linux, Networking, LaTeX)",
"Organized social events and participated in faculty committees", "Organized social events and participated in faculty committees",
"Provided subject-specific and organizational support to fellow students" "Provided subject-specific and organizational support to fellow students"
] ]
}, },
{ {
id: 6, "id": 6,
role: "Software Engineer", "role": "Software Engineer",
company: "gefeba Engineering GmbH", "company": "gefeba Engineering GmbH",
period: "2013 2015", "period": "2013 2015",
type: "Part-time", "type": "Part-time",
description: "Joined after a school internship. Worked on internal ERP projects, designed a mail traffic management tool, and contributed to the internal master data management tool.", "description": "Joined after a school internship. Worked on internal ERP projects, designed a mail traffic management tool, and contributed to master data management tooling.",
highlights: [ "highlights": [
"Developed internal ERP project features", "Developed internal ERP project features",
"Designed a tool for managing project-related mail traffic", "Designed a tool for managing project-related mail traffic",
"Contributed to internal master data management tooling", "Contributed to internal master data management tooling",
@@ -118,59 +119,110 @@ export async function initDB() {
] ]
} }
], ],
skills: { "skills": {
"Container & Orchestration": ["Kubernetes", "Docker", "Helm"], "Container & Orchestration": [
"CI/CD & GitOps": ["ArgoCD", "Jenkins", "Bitbucket Pipelines", "Git"], "Kubernetes",
"Cloud": ["Azure", "Azure AKS"], "Docker",
"Infrastructure as Code": ["Ansible"], "Helm",
"Observability": ["ELK Stack"], "ArgoCD"
"Programming": ["Rust", "Python", "Bash", "P4"], ],
"Research": ["Intel Tofino", "BMv2", "DPDK"] "CI/CD": [
"Bitbucket Pipelines",
"Git"
],
"Cloud": [
"Azure",
"Azure AKS",
"Azure App Gateway",
"Azure Entra ID"
],
"Infrastructure as Code": [
"Ansible"
],
"Observability": [
"ELK Stack",
"Checkmk",
"UptimeRobot"
],
"Databases": [
"PostgreSQL",
"MongoDB",
"CouchDB"
],
"Programming": [
"Rust",
"Python",
"Bash",
"P4"
],
"Research": [
"Intel Tofino",
"BMv2",
"DPDK"
]
}, },
education: [ "education": [
{ {
id: 1, "id": 1,
degree: "B.Sc. Systems Engineering", "degree": "B.Sc. Systems Engineering",
institution: "Universität Duisburg-Essen", "institution": "Universität Duisburg-Essen",
period: "2015 present", "period": "2015 present",
status: "Bachelor thesis ongoing" "status": "Bachelor thesis ongoing"
} }
], ],
projects: [ "projects": [
{ {
id: 1, "id": 1,
name: "Ethereum Smart Contract Fuzzer", "name": "Ethereum Smart Contract Fuzzer",
description: "A fuzzer for Ethereum smart contracts built as part of the bachelor thesis project.", "description": "A fuzzer for Ethereum smart contracts built as part of the bachelor thesis project.",
url: "#", "url": "#",
tech: ["Rust"] "tech": [
"Rust"
]
}, },
{ {
id: 2, "id": 2,
name: "Homelab", "name": "Homelab",
description: "Ansible-managed homelab serving as a platform for learning and experimenting with new technologies through automated provisioning and configuration management.", "description": "Ansible-managed homelab running on Debian Linux with Raspberry Pi, Mikrotik networking, Pihole, and self-hosted services.",
url: "https://git.tudattr.dev", "url": "https://git.tudattr.dev/tudattr/ansible",
tech: ["Ansible", "Kubernetes"] "tech": [
"Ansible",
"Kubernetes",
"Debian Linux"
]
}, },
{ {
id: 3, "id": 3,
name: ".dotfiles", "name": ".dotfiles",
description: "Configuration files for daily-use tools providing a reproducible baseline for any personal ArchLinux system, including NeoVim (LazyVim), Zellij, and k9s setups.", "description": "Configuration files for daily-use tools providing a reproducible baseline for any personal ArchLinux system, including NeoVim (LazyVim), Zellij, and k9s.",
url: "https://github.com/TuDatTr", "url": "https://github.com/TuDatTr/dotfiles",
tech: ["Shell", "NeoVim", "ArchLinux"] "tech": [
"Zsh",
"NeoVim",
"Zellij",
"ArchLinux"
]
}, },
{ {
id: 4, "id": 4,
name: "tudattr.dev", "name": "tudattr.dev",
description: "Full-stack WebAssembly personal website built with the Rust-based Dioxus framework and Tailwind CSS.", "description": "Full-stack WebAssembly personal website built with the Rust-based Dioxus framework and Tailwind CSS.",
url: "https://www.tudattr.dev", "url": "https://www.tudattr.dev",
tech: ["Rust", "Dioxus", "Tailwind CSS"] "tech": [
"Rust",
"Dioxus",
"Tailwind CSS",
"WebAssembly"
]
}, },
{ {
id: 5, "id": 5,
name: "mtg-builder", "name": "mtg-builder",
description: "CLI Magic: The Gathering (Commander/EDH) deck-builder and collection manager using the Scryfall API, with exponential backoff retry logic.", "description": "CLI Magic: The Gathering (Commander/EDH) deck-builder and collection manager using the Scryfall API, with exponential backoff retry logic.",
url: "https://git.tudattr.dev/tudattr/mtg-builder", "url": "https://git.tudattr.dev/tudattr/mtg-builder",
tech: ["Rust"] "tech": [
"Rust"
]
} }
] ]
}) })

View File

@@ -4,6 +4,7 @@
"version": "1.1.0", "version": "1.1.0",
"type": "module", "type": "module",
"scripts": { "scripts": {
"sync-profile": "node scripts/sync-profile.mjs",
"dev": "vite", "dev": "vite",
"build": "vite build", "build": "vite build",
"lint": "eslint .", "lint": "eslint .",

60
scripts/sync-profile.mjs Normal file
View File

@@ -0,0 +1,60 @@
#!/usr/bin/env node
/**
* Reads cv-data.json from the persons profile directory and writes it into:
* - src/lib/cv.json (frontend default / compile-time fallback)
* - backend/db/init.js (backend DB seed on first boot)
*
* Usage:
* node scripts/sync-profile.mjs [path/to/cv-data.json]
*
* Default source path: ~/workspace/persons/tuan-dat.tran/cv-data.json
*/
import { readFileSync, writeFileSync } from 'fs';
import { resolve } from 'path';
import { homedir } from 'os';
import { fileURLToPath } from 'url';
import { dirname } from 'path';
const __dirname = dirname(fileURLToPath(import.meta.url));
const root = resolve(__dirname, '..');
const sourcePath = process.argv[2]
?? resolve(homedir(), 'workspace/persons/tuan-dat.tran/cv-data.json');
let data;
try {
data = JSON.parse(readFileSync(sourcePath, 'utf8'));
} catch (e) {
console.error(`Failed to read ${sourcePath}: ${e.message}`);
process.exit(1);
}
// 1. Write src/lib/cv.json
const cvJsonPath = resolve(root, 'src/lib/cv.json');
writeFileSync(cvJsonPath, JSON.stringify(data, null, 2) + '\n');
console.log(`wrote ${cvJsonPath}`);
// 2. Rewrite the seed block in backend/db/init.js
const initPath = resolve(root, 'backend/db/init.js');
const initSrc = readFileSync(initPath, 'utf8');
const seedJson = JSON.stringify(data, null, 8)
.split('\n')
.map((line, i) => i === 0 ? line : ' ' + line)
.join('\n');
const updated = initSrc.replace(
/data: JSON\.stringify\([\s\S]*?\)\s*\}\);/,
`data: JSON.stringify(${seedJson})\n });`
);
if (updated === initSrc) {
console.error('Could not find seed block in backend/db/init.js — pattern mismatch');
process.exit(1);
}
writeFileSync(initPath, updated);
console.log(`wrote ${initPath}`);
console.log('done — rebuild Docker images and restart with a fresh volume to apply');

View File

@@ -1,7 +1,7 @@
{ {
"personal": { "personal": {
"name": "Tuan-Dat Tran", "name": "Tuan-Dat Tran",
"title": "DevOps Engineer", "title": "Junior DevOps Engineer",
"intro": "DevOps Engineer and Homelab Enthusiast based in Essen, Germany. Primary owner of a production aviation SaaS platform on Azure AKS, with a research background in P4 programmable networks and a co-authored IEEE publication.", "intro": "DevOps Engineer and Homelab Enthusiast based in Essen, Germany. Primary owner of a production aviation SaaS platform on Azure AKS, with a research background in P4 programmable networks and a co-authored IEEE publication.",
"email": "tuan-dat.tran@dextradata.com", "email": "tuan-dat.tran@dextradata.com",
"github": "https://github.com/TuDatTr", "github": "https://github.com/TuDatTr",
@@ -11,18 +11,19 @@
"experience": [ "experience": [
{ {
"id": 1, "id": 1,
"role": "DevOps Engineer", "role": "Junior DevOps Engineer",
"company": "DextraData GmbH", "company": "DextraData GRC Technologies GmbH",
"period": "2025 present", "period": "2025 present",
"type": "Full-time", "type": "Full-time",
"description": "Primary owner of the Logipad aviation SaaS platform and secondary owner of the GRASP GRC platform, both running on Azure AKS and Rancher-managed Kubernetes clusters.", "description": "Primary owner of the GRASP GRC platform and Logipad aviation SaaS platform, running on Azure AKS and Rancher-managed Kubernetes clusters.",
"highlights": [ "highlights": [
"Drives GitOps adoption with ArgoCD across production Kubernetes clusters", "Drives GitOps adoption with ArgoCD across production Kubernetes clusters",
"Manages CI/CD pipelines with Jenkins and Bitbucket Pipelines", "Manages CI/CD pipelines with Bitbucket Pipelines",
"Leads incident response for production outages", "Leads incident response and on-call for production outages",
"Implemented Azure Container Registry mirroring to resolve Docker Hub rate limits", "Reduced GRASP frontend pipeline from 30 to 16 minutes",
"Eliminated ~$2k/month Azure logging costs via workspace restructuring",
"Built internal AI tooling with LiteLLM and Ollama", "Built internal AI tooling with LiteLLM and Ollama",
"Promoted from Junior DevOps Engineer in January 2026" "Implemented Azure Container Registry mirroring to resolve Docker Hub rate limits"
] ]
}, },
{ {
@@ -33,10 +34,10 @@
"type": "Part-time", "type": "Part-time",
"description": "Hands-on P4 and programmable data plane research on Intel Tofino ASICs and BMv2, culminating in a co-authored publication at IEEE LCN 2023 (Reverse Path Congestion Marking).", "description": "Hands-on P4 and programmable data plane research on Intel Tofino ASICs and BMv2, culminating in a co-authored publication at IEEE LCN 2023 (Reverse Path Congestion Marking).",
"highlights": [ "highlights": [
"Co-authored RPM paper published at IEEE LCN 2023", "Co-authored RPM: Reverse Path Congestion Marking on P4 Programmable Switches — IEEE LCN 2023",
"Built a Dockerized federated LSTM system with custom client-selection strategies for 5G network research", "Built a Dockerized federated LSTM system with custom client-selection strategies for 5G network research",
"Implemented low-latency DASH video streaming on Kubernetes and WebRTC SVC simulcast", "Implemented low-latency DASH video streaming on Kubernetes and WebRTC SVC simulcast via Janus",
"Managed lab infrastructure: Ansible-automated servers, 100G NIC testbeds (Intel E810, Netronome)", "Managed lab infrastructure: Ansible-automated servers, 100G NIC testbeds (Intel E810, Netronome), DPDK",
"Administered AWS accounts, PartDB inventory system, and the group website" "Administered AWS accounts, PartDB inventory system, and the group website"
] ]
}, },
@@ -46,7 +47,7 @@
"company": "Universität Duisburg-Essen", "company": "Universität Duisburg-Essen",
"period": "2021 2022", "period": "2021 2022",
"type": "Volunteer", "type": "Volunteer",
"description": "Introduced groups of ~20 freshmen to their new academic environment at the start of each semester, providing organizational and technical guidance throughout their first year in the computer science programme.", "description": "Introduced groups of ~20 freshmen to their new academic environment each semester, providing organizational and technical guidance throughout their first year.",
"highlights": [ "highlights": [
"Guided new students through academic orientation each semester", "Guided new students through academic orientation each semester",
"Provided technical and organizational support throughout the first year" "Provided technical and organizational support throughout the first year"
@@ -71,9 +72,9 @@
"company": "Universität Duisburg-Essen", "company": "Universität Duisburg-Essen",
"period": "2016 2019", "period": "2016 2019",
"type": "Volunteer", "type": "Volunteer",
"description": "Participated in faculty committees and organized social events. Main responsibilities included managing the faculty's IT infrastructure and providing support to fellow students.", "description": "Participated in faculty committees and organized social events. Managed the faculty's IT infrastructure and provided support to fellow students.",
"highlights": [ "highlights": [
"Managed faculty IT infrastructure (Linux, Networking)", "Managed faculty IT infrastructure (Linux, Networking, LaTeX)",
"Organized social events and participated in faculty committees", "Organized social events and participated in faculty committees",
"Provided subject-specific and organizational support to fellow students" "Provided subject-specific and organizational support to fellow students"
] ]
@@ -84,7 +85,7 @@
"company": "gefeba Engineering GmbH", "company": "gefeba Engineering GmbH",
"period": "2013 2015", "period": "2013 2015",
"type": "Part-time", "type": "Part-time",
"description": "Joined after a school internship. Worked on internal ERP projects, designed a mail traffic management tool, and contributed to the internal master data management tool.", "description": "Joined after a school internship. Worked on internal ERP projects, designed a mail traffic management tool, and contributed to master data management tooling.",
"highlights": [ "highlights": [
"Developed internal ERP project features", "Developed internal ERP project features",
"Designed a tool for managing project-related mail traffic", "Designed a tool for managing project-related mail traffic",
@@ -94,13 +95,46 @@
} }
], ],
"skills": { "skills": {
"Container & Orchestration": ["Kubernetes", "Docker", "Helm"], "Container & Orchestration": [
"CI/CD & GitOps": ["ArgoCD", "Jenkins", "Bitbucket Pipelines", "Git"], "Kubernetes",
"Cloud": ["Azure", "Azure AKS"], "Docker",
"Infrastructure as Code": ["Ansible"], "Helm",
"Observability": ["ELK Stack"], "ArgoCD"
"Programming": ["Rust", "Python", "Bash", "P4"], ],
"Research": ["Intel Tofino", "BMv2", "DPDK"] "CI/CD": [
"Bitbucket Pipelines",
"Git"
],
"Cloud": [
"Azure",
"Azure AKS",
"Azure App Gateway",
"Azure Entra ID"
],
"Infrastructure as Code": [
"Ansible"
],
"Observability": [
"ELK Stack",
"Checkmk",
"UptimeRobot"
],
"Databases": [
"PostgreSQL",
"MongoDB",
"CouchDB"
],
"Programming": [
"Rust",
"Python",
"Bash",
"P4"
],
"Research": [
"Intel Tofino",
"BMv2",
"DPDK"
]
}, },
"education": [ "education": [
{ {
@@ -117,35 +151,53 @@
"name": "Ethereum Smart Contract Fuzzer", "name": "Ethereum Smart Contract Fuzzer",
"description": "A fuzzer for Ethereum smart contracts built as part of the bachelor thesis project.", "description": "A fuzzer for Ethereum smart contracts built as part of the bachelor thesis project.",
"url": "#", "url": "#",
"tech": ["Rust"] "tech": [
"Rust"
]
}, },
{ {
"id": 2, "id": 2,
"name": "Homelab", "name": "Homelab",
"description": "Ansible-managed homelab serving as a platform for learning and experimenting with new technologies through automated provisioning and configuration management.", "description": "Ansible-managed homelab running on Debian Linux with Raspberry Pi, Mikrotik networking, Pihole, and self-hosted services.",
"url": "https://git.tudattr.dev", "url": "https://git.tudattr.dev/tudattr/ansible",
"tech": ["Ansible", "Kubernetes"] "tech": [
"Ansible",
"Kubernetes",
"Debian Linux"
]
}, },
{ {
"id": 3, "id": 3,
"name": ".dotfiles", "name": ".dotfiles",
"description": "Configuration files for daily-use tools providing a reproducible baseline for any personal ArchLinux system, including NeoVim (LazyVim), Zellij, and k9s setups.", "description": "Configuration files for daily-use tools providing a reproducible baseline for any personal ArchLinux system, including NeoVim (LazyVim), Zellij, and k9s.",
"url": "https://github.com/TuDatTr", "url": "https://github.com/TuDatTr/dotfiles",
"tech": ["Shell", "NeoVim", "ArchLinux"] "tech": [
"Zsh",
"NeoVim",
"Zellij",
"ArchLinux"
]
}, },
{ {
"id": 4, "id": 4,
"name": "tudattr.dev", "name": "tudattr.dev",
"description": "Full-stack WebAssembly personal website built with the Rust-based Dioxus framework and Tailwind CSS.", "description": "Full-stack WebAssembly personal website built with the Rust-based Dioxus framework and Tailwind CSS.",
"url": "https://www.tudattr.dev", "url": "https://www.tudattr.dev",
"tech": ["Rust", "Dioxus", "Tailwind CSS"] "tech": [
"Rust",
"Dioxus",
"Tailwind CSS",
"WebAssembly"
]
}, },
{ {
"id": 5, "id": 5,
"name": "mtg-builder", "name": "mtg-builder",
"description": "CLI Magic: The Gathering (Commander/EDH) deck-builder and collection manager using the Scryfall API, with exponential backoff retry logic.", "description": "CLI Magic: The Gathering (Commander/EDH) deck-builder and collection manager using the Scryfall API, with exponential backoff retry logic.",
"url": "https://git.tudattr.dev/tudattr/mtg-builder", "url": "https://git.tudattr.dev/tudattr/mtg-builder",
"tech": ["Rust"] "tech": [
"Rust"
]
} }
] ]
} }