387 lines
21 KiB
JSON
387 lines
21 KiB
JSON
{
|
||
"identity": {
|
||
"name": "Luca Pîslaru",
|
||
"role": "System Administrator & Full-Stack Developer",
|
||
"valueProposition": "I build full-stack software and operate the Linux systems behind it, from offline-first applications to access-controlled self-hosted services and careful data migrations.",
|
||
"location": { "city": "Bucharest", "country": "Romania", "countryCode": "RO" },
|
||
"availability": "I’m based in Bucharest and open to local on-site, hybrid, and remote roles, as well as international remote opportunities."
|
||
},
|
||
"navigation": [
|
||
{ "id": "start", "label": "Start" },
|
||
{ "id": "profile", "label": "Profile" },
|
||
{ "id": "experience", "label": "Experience" },
|
||
{ "id": "infrastructure", "label": "Infrastructure" },
|
||
{ "id": "selected-builds", "label": "Selected builds" },
|
||
{ "id": "additional-work", "label": "Additional work" },
|
||
{ "id": "toolkit", "label": "Toolkit" },
|
||
{ "id": "contact", "label": "Contact" }
|
||
],
|
||
"profile": {
|
||
"introduction": "I’m an early-career technologist working across Linux administration and end-to-end application development. I value systems that can be understood, maintained, secured, and recovered: clear access boundaries, deliberate deployments, useful documentation, and software refined through real use.",
|
||
"screeningFacts": [
|
||
{ "label": "Education", "value": "Bachelor's degree in Business Management IT, Romanian-American University, 2023-2026" },
|
||
{ "label": "Languages", "value": "Romanian (native), English (C2), French (A1)" },
|
||
{ "label": "Certifications", "value": "Advanced Digital Competencies Certificate, 2025; PCEP - Certified Entry-Level Python Programmer, 2022" }
|
||
]
|
||
},
|
||
"experience": [
|
||
{
|
||
"id": "trupa-lui-razus",
|
||
"role": "Full-Stack Developer & Hosting Administrator (Collaborator)",
|
||
"organization": "Trupa lui Răzuș",
|
||
"dates": "August 2025-Present",
|
||
"location": "Bucharest, Romania",
|
||
"highlights": [
|
||
"I built the theatre group’s first website, giving visitors a place to find performances, news, and contact details beyond social media.",
|
||
"I developed a custom Vue frontend and connected it to headless WordPress, so an editor can publish news and promotional content without changing code.",
|
||
"I configured separate administrator and editor roles and restricted access to administrative routes and endpoints.",
|
||
"I manage the domain and hosting, configure DNS and TLS, and deploy releases through Git and SSH with a verification and rollback process."
|
||
]
|
||
},
|
||
{
|
||
"id": "camera-consultantilor-fiscali",
|
||
"role": "Green Innovation Intern",
|
||
"organization": "Camera Consultanților Fiscali",
|
||
"dates": "June 2025-August 2025",
|
||
"location": "Bucharest, Romania",
|
||
"highlights": [
|
||
"I contributed to eco-innovation work within the INOVATIV 2030 program.",
|
||
"I developed and presented business models for sustainable technologies."
|
||
]
|
||
},
|
||
{
|
||
"id": "isense-solutions",
|
||
"role": "Data Science Intern",
|
||
"organization": "iSense Solutions",
|
||
"dates": "June 2025-August 2025",
|
||
"location": "Bucharest, Romania",
|
||
"highlights": [
|
||
"I processed and analyzed datasets using SPSS and Microsoft Excel.",
|
||
"I prepared quantitative reports to support business-development decisions."
|
||
]
|
||
}
|
||
],
|
||
"systemsOperations": {
|
||
"id": "professional-systems-operations",
|
||
"title": "Professional systems operations",
|
||
"summary": "I look after both application delivery and hosting, from the editing workflow to access controls, releases, and recovery.",
|
||
"evidence": [
|
||
"I give editors a publishing workflow while keeping administration separate from the public website.",
|
||
"I use version control to prepare releases, verify deployments, and roll back changes when needed.",
|
||
"I maintain the domain, hosting, certificates, and access rules alongside the application."
|
||
]
|
||
},
|
||
"infrastructure": {
|
||
"id": "self-hosted-platform-lifecycle",
|
||
"title": "Secure self-hosted platform and lifecycle",
|
||
"summary": "I run a self-hosted Linux environment that I use every day. I manage how services are reached, who can access them, how they’re updated, and how their data can be recovered.",
|
||
"bands": [
|
||
{
|
||
"id": "ingress-and-tls",
|
||
"title": "Ingress and TLS",
|
||
"summary": "I configure reverse proxies, DNS, and TLS to make services reachable through controlled, encrypted entry points."
|
||
},
|
||
{
|
||
"id": "identity-and-access",
|
||
"title": "Identity and access",
|
||
"summary": "I manage authentication and permissions, adding access controls around services and limiting administrative access."
|
||
},
|
||
{
|
||
"id": "service-lifecycle",
|
||
"title": "Service lifecycle",
|
||
"summary": "I deploy and update containerized services, manage configuration, and migrate workloads when the platform needs to change."
|
||
},
|
||
{
|
||
"id": "operations-and-recovery",
|
||
"title": "Operations and recovery",
|
||
"summary": "I prepare backups before major upgrades and keep local and offsite copies of important data."
|
||
}
|
||
],
|
||
"featuredOperation": {
|
||
"title": "Migrating a stateful Nextcloud service",
|
||
"context": "I moved my daily-use Nextcloud deployment to All-in-One. Alongside files, I needed to preserve contacts, calendars, tasks, and collaboration data.",
|
||
"actions": [
|
||
"I aligned application versions and updated installed apps before the move.",
|
||
"I backed up the existing deployment and prepared rollback checkpoints.",
|
||
"I converted the MySQL database to PostgreSQL before migrating to All-in-One.",
|
||
"I transferred application state and files, corrected ownership and permissions, and preserved the instance configuration.",
|
||
"I checked access to files and services before switching to the new deployment."
|
||
],
|
||
"outcome": "I completed the migration without data loss and have continued using the same instance for roughly a year—for file sync, contacts, calendars, tasks, and Nextcloud Talk."
|
||
}
|
||
},
|
||
"projects": {
|
||
"selected": [
|
||
{
|
||
"id": "private-medication-tracker",
|
||
"title": "Private self-hosted medication tracker",
|
||
"visibility": "private",
|
||
"maturity": "active",
|
||
"summary": "I built a self-hosted medication tracker from scratch, with an offline-first Flutter app, a TypeScript API, PostgreSQL, and a Vue administration interface.",
|
||
"problem": "I wanted tracking, reminders, and history that would work offline and synchronize with a server I control.",
|
||
"contribution": "I designed, built, deployed, and operated the complete system: mobile app, API, administration interface, database, and synchronization model.",
|
||
"technicalDecisions": [
|
||
"I used Flutter, Riverpod, and Drift/SQLite to keep the app useful offline, queue local changes, and pull server updates when a connection is available.",
|
||
"I built the API with Fastify, TypeScript, Drizzle, and PostgreSQL, alongside a Vue administration interface.",
|
||
"I added authentication, token renewal, two-factor authentication, recovery codes, biometric locking, and database access controls, then used tests and audits to identify further improvements.",
|
||
"I deployed the containerized service behind Nginx and TLS, with an additional Authelia access layer.",
|
||
"I added schedules, as-needed entries, stock tracking, history, reminders, background sync, exports, analytics, an Android widget, and English/Romanian localization."
|
||
],
|
||
"outcome": "I’ve used the system privately for several months. When Android reminders arrived inconsistently, I investigated the scheduling process and improved delivery. I’m now moving toward native alarms and reminders scheduled per occurrence to address duplicate and stale notifications. It works for my current use, with further work needed before a wider release.",
|
||
"assetIds": [
|
||
"medication-mobile-logs",
|
||
"medication-mobile-data-settings",
|
||
"medication-mobile-notification-settings"
|
||
],
|
||
"mediaLayout": "portrait-strip",
|
||
"media": [
|
||
{
|
||
"kind": "image",
|
||
"assetId": "medication-mobile-logs",
|
||
"alt": "Medication activity screen with a fictional demo profile.",
|
||
"caption": "Daily activity and history, shown with demo data.",
|
||
"longDescription": "Scheduled entries and their recorded status are grouped in a single activity view."
|
||
},
|
||
{
|
||
"kind": "image",
|
||
"assetId": "medication-mobile-data-settings",
|
||
"alt": "Data and synchronization settings for a fictional medication-tracker profile.",
|
||
"caption": "Data controls supporting the offline-first workflow.",
|
||
"longDescription": "The settings view exposes synchronization and local-data controls used by the private self-hosted system."
|
||
},
|
||
{
|
||
"kind": "image",
|
||
"assetId": "medication-mobile-notification-settings",
|
||
"alt": "Reminder settings for fictional medication entries.",
|
||
"caption": "Reminder controls refined through months of private use.",
|
||
"longDescription": "The settings view groups notification behavior and the Android alarm capability used for scheduled reminders."
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": "footy-tracker",
|
||
"title": "Footy Tracker",
|
||
"visibility": "public",
|
||
"maturity": "active",
|
||
"summary": "I led the data and machine-learning work on a two-person university project that detects players and the ball in football footage and produces annotated video.",
|
||
"problem": "We needed to detect players and the ball in unseen match footage under a university deadline and limited training resources. We also explored referee and jersey-number recognition.",
|
||
"contribution": "I handled dataset preparation, YOLO training, jersey-classifier design, experiments, evaluation, and demo integration. My collaborator created the initial repository structure and video-processing pipeline.",
|
||
"technicalDecisions": [
|
||
"I converted SoccerNet tracking data into a reproducible YOLO training layout and controlled training through configuration files.",
|
||
"I compared pretrained ResNet, MobileNet, and EfficientNet variants for jersey classification.",
|
||
"I tested class weighting, focal loss, mixup/cutmix, label smoothing, and early stopping, with checkpoints so training could resume.",
|
||
"I chose a simpler ResNet34 configuration after an eight-hour set of ablation experiments showed that aggressive augmentation increased overfitting and reduced validation performance."
|
||
],
|
||
"outcome": "I tested the demo on previously unseen, compressed broadcast footage, where player detection held up well. My measured validation results were 0.942 mAP@0.5 for players, 0.726 for referees, and 0.198 for the ball. The best jersey classifier reached approximately 0.778 validation accuracy, but jersey labels remained inconsistent in the integrated demo. We delivered a working academic demonstration; ball detection and jersey recognition still need improvement.",
|
||
"url": "https://github.com/LucaPisl/footy-tracker",
|
||
"assetIds": []
|
||
},
|
||
{
|
||
"id": "opinion-dynamics-simulation",
|
||
"title": "Opinion Dynamics Simulation",
|
||
"visibility": "public",
|
||
"maturity": "experimental",
|
||
"summary": "I built an agent-based simulation to explore how local interactions and network structure shape opinion patterns across a group.",
|
||
"problem": "I wanted to explore how simple local rules can produce polarization, rapid cascades, and uneven final distributions.",
|
||
"contribution": "I built the simulation and analysis views to inspect runs and compare changes over time.",
|
||
"technicalDecisions": [
|
||
"I used simplified agents and rules to study modeled behavior.",
|
||
"I exposed polarization, cascade thresholds, graph degree, revolt frequency, and final distributions as inspectable outputs.",
|
||
"I documented performance and network-formation limitations alongside the results."
|
||
],
|
||
"outcome": "I used the visualizations to compare simulated scenarios and examine the model’s assumptions. These results describe the simulation; they do not predict how real people behave.",
|
||
"url": "https://github.com/LucaPisl/opinion-dynamics-simulation",
|
||
"assetIds": [
|
||
"opinion-polarization-chart",
|
||
"opinion-final-distribution-chart"
|
||
],
|
||
"mediaLayout": "chart-pair",
|
||
"media": [
|
||
{
|
||
"kind": "chart",
|
||
"assetId": "opinion-polarization-chart",
|
||
"alt": "Line chart showing the modeled polarization index increasing across simulation steps.",
|
||
"caption": "Polarization rose quickly and then increased more gradually in this modeled run.",
|
||
"chart": {
|
||
"variables": "Horizontal axis: simulation step. Vertical axis: polarization index.",
|
||
"trend": "The index rises sharply during the first two steps, then continues upward more slowly.",
|
||
"conclusion": "This modeled scenario ended more polarized than it began.",
|
||
"table": {
|
||
"caption": "Selected modeled polarization values",
|
||
"columns": ["Step", "Polarization index"],
|
||
"rows": [["0", "0.765"], ["14", "0.932"]]
|
||
}
|
||
}
|
||
},
|
||
{
|
||
"kind": "chart",
|
||
"assetId": "opinion-final-distribution-chart",
|
||
"alt": "Histogram showing one large cluster and several smaller clusters in the final modeled opinions.",
|
||
"caption": "The final modeled opinions form one dominant cluster and several smaller groups.",
|
||
"chart": {
|
||
"variables": "Horizontal axis: final modeled opinion. Vertical axis: frequency.",
|
||
"trend": "Most modeled opinions cluster near one end of the range, with several smaller groups separated from it.",
|
||
"conclusion": "This simulated scenario ended with an uneven distribution rather than a single uniform group."
|
||
}
|
||
}
|
||
]
|
||
}
|
||
],
|
||
"additional": [
|
||
{
|
||
"id": "private-game-prototype",
|
||
"title": "Private game prototype",
|
||
"visibility": "private",
|
||
"maturity": "prototype",
|
||
"summary": "I built a side-view action prototype over three weeks, focusing on a short, playable loop.",
|
||
"problem": "I wanted to test a game concept within a short development window.",
|
||
"contribution": "I developed and iterated on the prototype, keeping the scope small enough to play and refine quickly.",
|
||
"technicalDecisions": [
|
||
"I focused development on the core gameplay loop."
|
||
],
|
||
"outcome": "The clip shows the prototype in play, with character movement and pursuing enemies.",
|
||
"assetIds": ["private-game-loop", "private-game-loop-mp4", "private-game-loop-poster"],
|
||
"mediaLayout": "single",
|
||
"media": [{ "kind": "video", "assetId": "private-game-loop-mp4", "fallbackAssetId": "private-game-loop", "posterAssetId": "private-game-loop-poster", "alt": "Side-view action prototype with a moving character and pursuing enemies.", "caption": "A short gameplay loop from my three-week prototype.", "longDescription": "The character moves through a blue industrial arena while enemies follow." }]
|
||
},
|
||
{
|
||
"id": "private-healthcare-platform",
|
||
"title": "Private healthcare platform",
|
||
"visibility": "private",
|
||
"maturity": "active",
|
||
"summary": "I contributed to the web interface for a healthcare platform.",
|
||
"problem": "I worked on presenting the platform’s purpose through a focused web interface.",
|
||
"contribution": "The landing page introduces bloodwork and treatment tracking, with clear sign-in and registration actions.",
|
||
"technicalDecisions": [
|
||
"I worked within the platform’s visual direction and web experience."
|
||
],
|
||
"outcome": "This view shows the public-facing entry point to the platform.",
|
||
"assetIds": ["healthcare-platform-interface"],
|
||
"mediaLayout": "single",
|
||
"media": [{ "kind": "image", "assetId": "healthcare-platform-interface", "alt": "Healthcare landing page with a purple visual theme and a registration action.", "caption": "Landing-page detail." }]
|
||
},
|
||
{
|
||
"id": "currency-converter",
|
||
"title": "Currency Converter",
|
||
"visibility": "public",
|
||
"maturity": "learning",
|
||
"summary": "I built a currency-conversion desktop app with C#/.NET and Avalonia, using external exchange-rate data.",
|
||
"problem": "I wanted to practice desktop UI development with a useful data-driven workflow.",
|
||
"contribution": "I implemented currency selection, dated conversions, and a view for comparing results across several destination currencies.",
|
||
"technicalDecisions": ["I used .NET and Avalonia to build a typed desktop interface."],
|
||
"outcome": "The project helped me develop desktop application and external-data integration skills.",
|
||
"url": "https://github.com/LucaPisl/CurrencyConverterAvalonia",
|
||
"assetIds": ["currency-converter-interface"],
|
||
"mediaLayout": "single",
|
||
"media": [
|
||
{
|
||
"kind": "image",
|
||
"assetId": "currency-converter-interface",
|
||
"alt": "Currency conversion interface with source and destination currency lists, a conversion date, and calculated results.",
|
||
"caption": "A focused Avalonia desktop workflow for selecting currencies and reviewing conversion results.",
|
||
"longDescription": "The interface lets a user choose one source currency, select multiple destination currencies, set a conversion date, and review the resulting values."
|
||
}
|
||
]
|
||
},
|
||
{
|
||
"id": "linux-modding-guide",
|
||
"title": "Linux Modding Guide",
|
||
"visibility": "public",
|
||
"maturity": "active",
|
||
"summary": "I write and maintain community documentation for practical Linux troubleshooting.",
|
||
"problem": "I wanted to turn troubleshooting knowledge into guidance other people could follow and reuse.",
|
||
"contribution": "I explain the steps and reasoning behind resolving issues, so readers can apply the approach to their own setup.",
|
||
"technicalDecisions": [
|
||
"I favor practical explanations that help readers understand and resolve issues."
|
||
],
|
||
"outcome": "I continue to maintain the guide as a resource for the community.",
|
||
"url": "https://github.com/LucaPisl/LinuxModdingGuide",
|
||
"assetIds": []
|
||
}
|
||
]
|
||
},
|
||
"toolkit": [
|
||
{
|
||
"title": "Systems and delivery",
|
||
"technologies": [
|
||
{ "name": "Linux" },
|
||
{ "name": "Docker" },
|
||
{ "name": "Nginx" },
|
||
{ "name": "cPanel" },
|
||
{ "name": "DNS" },
|
||
{ "name": "TLS" },
|
||
{ "name": "Authelia" },
|
||
{ "name": "Fail2Ban" },
|
||
{ "name": "Nextcloud" },
|
||
{ "name": "Proxmox/KVM" },
|
||
{ "name": "Git" }
|
||
]
|
||
},
|
||
{
|
||
"title": "Applications",
|
||
"technologies": [
|
||
{ "name": "Python" },
|
||
{ "name": "TypeScript/JavaScript" },
|
||
{ "name": "Vue.js" },
|
||
{ "name": "Flutter/Dart" },
|
||
{ "name": "Fastify" },
|
||
{ "name": "C#/.NET" },
|
||
{ "name": "Java" },
|
||
{ "name": "Headless WordPress" }
|
||
]
|
||
},
|
||
{
|
||
"title": "Data and storage",
|
||
"technologies": [
|
||
{ "name": "PostgreSQL" },
|
||
{ "name": "SQL" },
|
||
{ "name": "Drift/SQLite" },
|
||
{ "name": "Drizzle ORM" }
|
||
]
|
||
},
|
||
{
|
||
"title": "Machine learning",
|
||
"technologies": [
|
||
{ "name": "PyTorch" },
|
||
{ "name": "Ultralytics/YOLO" },
|
||
{ "name": "OpenCV" }
|
||
]
|
||
}
|
||
],
|
||
"contact": {
|
||
"introduction": "I’m looking for System Administrator or Full-Stack Developer roles in Bucharest—on-site, hybrid, or remote—and remote opportunities internationally.",
|
||
"email": { "localPart": "luca.pislaru", "domain": "gmail.com" },
|
||
"avatarAssetId": "contact-avatar",
|
||
"social": [
|
||
{ "service": "LinkedIn", "url": "https://linkedin.com/in/luca-pisl" },
|
||
{ "service": "GitHub", "url": "https://github.com/LucaPisl" },
|
||
{ "service": "GitLab", "url": "https://gitlab.com/luca_pisl" }
|
||
],
|
||
"cvMessage": "Get in touch for my CV or to talk about a role."
|
||
},
|
||
"metadata": {
|
||
"title": "Luca Pîslaru — System Administrator & Full-Stack Developer",
|
||
"description": "I’m Luca Pîslaru, a System Administrator & Full-Stack Developer based in Bucharest. Explore my work in Linux infrastructure and end-to-end application development.",
|
||
"socialPreviewAssetId": "social-preview-nightdrive"
|
||
},
|
||
"soundtrack": {
|
||
"intro": {
|
||
"opusAssetId": "soundtrack-intro-opus",
|
||
"mp3AssetId": "soundtrack-intro-mp3"
|
||
},
|
||
"main": {
|
||
"opusAssetId": "soundtrack-main-opus",
|
||
"mp3AssetId": "soundtrack-main-mp3"
|
||
},
|
||
"afterglow": {
|
||
"opusAssetId": "soundtrack-afterglow-opus",
|
||
"mp3AssetId": "soundtrack-afterglow-mp3"
|
||
},
|
||
"driveLift": {
|
||
"opusAssetId": "soundtrack-drive-lift-opus",
|
||
"mp3AssetId": "soundtrack-drive-lift-mp3"
|
||
}
|
||
},
|
||
"sceneDescription": "A restrained retro-futuristic night drive supports the reading journey while the portfolio content remains fully available as a semantic document."
|
||
}
|