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": "Based in Bucharest and open to on-site, hybrid, or remote roles locally, 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": [
|
||
"Built the theatre group's first owned web presence, replacing a social-media-only discovery path with an indexable website and direct contact options.",
|
||
"Developed a custom Vue frontend and a headless WordPress publishing workflow that lets an editor publish news and promotional content without changing code.",
|
||
"Configured role-separated CMS access and restricted administrative routes and endpoints while keeping exact access rules private.",
|
||
"Manage the domain, cPanel hosting, DNS/TLS configuration, custom .htaccess behavior, and controlled Git/SSH deployments with verification and rollback."
|
||
]
|
||
},
|
||
{
|
||
"id": "camera-consultantilor-fiscali",
|
||
"role": "Green Innovation Intern",
|
||
"organization": "Camera Consultanților Fiscali",
|
||
"dates": "June 2025-August 2025",
|
||
"location": "Bucharest, Romania",
|
||
"highlights": [
|
||
"Contributed to eco-innovation work within the INOVATIV 2030 program.",
|
||
"Developed and presented sustainable-technology business models."
|
||
]
|
||
},
|
||
{
|
||
"id": "isense-solutions",
|
||
"role": "Data Science Intern",
|
||
"organization": "iSense Solutions",
|
||
"dates": "June 2025-August 2025",
|
||
"location": "Bucharest, Romania",
|
||
"highlights": [
|
||
"Processed and analyzed datasets using SPSS and Microsoft Excel.",
|
||
"Prepared quantitative reports supporting business-development decisions."
|
||
]
|
||
}
|
||
],
|
||
"systemsOperations": {
|
||
"id": "professional-systems-operations",
|
||
"title": "Professional systems operations",
|
||
"summary": "Application delivery and hosting work with explicit boundaries between public content, authenticated administration, controlled releases, and recovery.",
|
||
"evidence": [
|
||
"Public Vue frontend backed by a role-separated headless WordPress editing workflow.",
|
||
"Private source control followed by a deliberate SSH deployment, post-release verification, and Git-based rollback path.",
|
||
"Domain, DNS, TLS, cPanel, and restricted-route administration performed alongside application development."
|
||
]
|
||
},
|
||
"infrastructure": {
|
||
"id": "self-hosted-platform-lifecycle",
|
||
"title": "Secure self-hosted platform and lifecycle",
|
||
"summary": "A self-hosted Linux environment operated as a long-term systems practice: traffic enters through a controlled edge, selected services receive an additional identity boundary, changes are staged deliberately, and important data has local and offsite recovery paths.",
|
||
"bands": [
|
||
{
|
||
"id": "ingress-and-tls",
|
||
"title": "Ingress and TLS",
|
||
"summary": "Route services through Nginx, manage DNS and certificate lifecycle, and use Fail2Ban at exposed entry points."
|
||
},
|
||
{
|
||
"id": "identity-and-access",
|
||
"title": "Identity and access",
|
||
"summary": "Place selected services behind Authelia and constrain administrative, filesystem, and container access without publishing the underlying policy."
|
||
},
|
||
{
|
||
"id": "service-lifecycle",
|
||
"title": "Service lifecycle",
|
||
"summary": "Deploy and update services with Docker Compose, including a full platform migration from a Raspberry Pi to a dedicated Linux server."
|
||
},
|
||
{
|
||
"id": "operations-and-recovery",
|
||
"title": "Operations and recovery",
|
||
"summary": "Use Btrfs storage, a pre-upgrade backup script, rsync-based copies, and an offsite backup for important data."
|
||
}
|
||
],
|
||
"featuredOperation": {
|
||
"title": "Migrating a stateful Nextcloud service",
|
||
"context": "The existing standalone deployment contained much more than files: contacts, calendars, tasks, and collaboration data all had to survive a move to Nextcloud All-in-One.",
|
||
"actions": [
|
||
"Aligned application versions and updated installed applications before migration.",
|
||
"Backed up the source deployment and prepared rollback checkpoints.",
|
||
"Converted the existing MySQL database to PostgreSQL before the All-in-One migration.",
|
||
"Exported and imported application state, transferred the data directory, corrected ownership and permissions, and preserved required instance configuration.",
|
||
"Validated access to the expected files and services before relying on the new deployment."
|
||
],
|
||
"outcome": "The migration completed without data loss. The All-in-One deployment has remained Luca's active Nextcloud instance for roughly a year, including storage, synchronization, contacts, calendars, tasks, and Nextcloud Talk."
|
||
}
|
||
},
|
||
"projects": {
|
||
"selected": [
|
||
{
|
||
"id": "private-medication-tracker",
|
||
"title": "Private self-hosted medication tracker",
|
||
"visibility": "private",
|
||
"maturity": "active",
|
||
"summary": "A solo-built, self-hosted medication-tracking system with an offline-first Flutter client, TypeScript API, PostgreSQL database, and Vue administration interface.",
|
||
"problem": "A private medication routine needed dependable offline tracking, reminders, history, and synchronization without turning personal data into a public product.",
|
||
"contribution": "Independently designed, implemented, deployed, and operated the complete mobile app, API, administration interface, database, synchronization model, and self-hosted environment.",
|
||
"technicalDecisions": [
|
||
"Use Flutter, Riverpod, and Drift/SQLite so the mobile workflow remains useful offline and can queue changes before pulling server updates.",
|
||
"Use Fastify, TypeScript, Drizzle, and PostgreSQL for the API and synchronized data model, alongside a Vue administration interface.",
|
||
"Apply authentication, refresh-token, TOTP, backup-code, biometric-lock, and database access-boundary mechanisms while continuing to harden the system through tests and audit findings.",
|
||
"Run the containerized service behind Nginx/TLS and an additional Authelia access layer.",
|
||
"Support schedules, as-needed entries, stock tracking, dose history, reminders, background sync, exports, analytics, an Android widget, and English/Romanian localization."
|
||
],
|
||
"outcome": "The system has supported Luca's private medication tracking consistently for several months. Real use exposed Android reminder failures; investigation restored dependable delivery, and current work is replacing the remaining recurring behavior with occurrence-specific reconciliation to address duplicate and stale reminders. The project works for its current private use but is not presented as production-ready.",
|
||
"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 using an unmistakably fictional demo profile.",
|
||
"caption": "Daily activity and history in a fictional demo state.",
|
||
"longDescription": "The mobile view groups scheduled entries and their recorded status without exposing real medication information."
|
||
},
|
||
{
|
||
"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": "A two-person university computer-vision project that processed previously unseen football footage and generated an annotated output video.",
|
||
"problem": "Build a time-constrained demonstration that could identify football players, referees, and the ball in match footage and explore jersey-number recognition.",
|
||
"contribution": "Led the project's data and machine-learning work: dataset acquisition and conversion, YOLO configuration and detector training, jersey-classifier design, experimentation, checkpointing, evaluation, and demo integration. A collaborator created the initial repository structure and video-processing pipeline.",
|
||
"technicalDecisions": [
|
||
"Convert SoccerNet tracking data into a reproducible YOLO training layout and keep training behavior configuration-driven.",
|
||
"Compare pretrained ResNet, MobileNet, and EfficientNet variants for jersey classification.",
|
||
"Add class weighting, checkpoint/resume, focal loss, mixup/cutmix, label smoothing, and early stopping as controlled experiments rather than assuming each technique would improve the model.",
|
||
"Prefer the simpler ResNet34 configuration after an eight-hour ablation set showed that aggressive augmentation increased overfitting and reduced validation performance."
|
||
],
|
||
"outcome": "The submitted demo processed previously unseen, compressed broadcast footage and retained strong player detection. 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, while integrated jersey labels remained inconsistent. The result is a working academic demonstration, not a production tracking system.",
|
||
"url": "https://github.com/LucaPisl/footy-tracker",
|
||
"assetIds": []
|
||
},
|
||
{
|
||
"id": "opinion-dynamics-simulation",
|
||
"title": "Opinion Dynamics Simulation",
|
||
"visibility": "public",
|
||
"maturity": "experimental",
|
||
"summary": "An agent-based research experiment for observing how local interactions, network structure, and cascade conditions shape group-level opinion patterns.",
|
||
"problem": "Explore how simplified local rules can produce polarization, rapid cascades, and uneven final distributions.",
|
||
"contribution": "Built the simulation and analysis views used to inspect modeled runs and compare changes over time.",
|
||
"technicalDecisions": [
|
||
"Keep the work explicitly experimental rather than presenting it as a predictive model of real people.",
|
||
"Expose polarization, cascade thresholds, graph degree, revolt frequency, and final distributions as inspectable outputs.",
|
||
"Document performance and network-formation limitations alongside the results."
|
||
],
|
||
"outcome": "The project produced useful exploratory visualizations and made the model's assumptions and limitations visible; conclusions remain limited to the simulated scenarios.",
|
||
"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": "A private three-week prototype built to test a compact gameplay loop under a deliberately small scope.",
|
||
"problem": "Test a game concept quickly while keeping the scope deliberately small.",
|
||
"contribution": "Built and iterated on the prototype during a three-week development window.",
|
||
"technicalDecisions": [
|
||
"Focused the work on a short gameplay loop rather than a full production release."
|
||
],
|
||
"outcome": "No real title, link, video, or identifying media.",
|
||
"assetIds": []
|
||
},
|
||
{
|
||
"id": "private-healthcare-platform",
|
||
"title": "Private healthcare platform",
|
||
"visibility": "private",
|
||
"maturity": "active",
|
||
"summary": "A confidentiality-safe summary of Luca's web-interface contribution.",
|
||
"problem": "A healthcare workflow needed a focused web-based interface.",
|
||
"contribution": "Contributed to the private platform's web-interface experience.",
|
||
"technicalDecisions": [
|
||
"Keeps product details and any identifying interface data outside the public portfolio."
|
||
],
|
||
"outcome": "No product identity, private link, screenshot, or health data.",
|
||
"assetIds": []
|
||
},
|
||
{
|
||
"id": "currency-converter",
|
||
"title": "Currency Converter",
|
||
"visibility": "public",
|
||
"maturity": "learning",
|
||
"summary": "A scoped .NET/Avalonia desktop project integrating external exchange-rate data and practicing typed UI development.",
|
||
"problem": "Practice a focused desktop workflow for currency conversion with external exchange-rate data.",
|
||
"contribution": "Implemented the application as a scoped learning exercise.",
|
||
"technicalDecisions": ["Uses .NET and Avalonia to explore a typed desktop interface."],
|
||
"outcome": "A scoped project for developing desktop application fundamentals.",
|
||
"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": "Ongoing community documentation focused on practical Linux troubleshooting and reusable technical explanations.",
|
||
"problem": "Useful Linux troubleshooting knowledge benefits from clear, reusable documentation.",
|
||
"contribution": "Wrote and maintained community-facing technical guidance.",
|
||
"technicalDecisions": [
|
||
"Favors practical explanations that help readers understand and resolve issues."
|
||
],
|
||
"outcome": "An ongoing example of practical technical writing.",
|
||
"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": "Btrfs" },
|
||
{ "name": "rsync" },
|
||
{ "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" },
|
||
{ "name": "SPSS" },
|
||
{ "name": "Microsoft Excel" }
|
||
]
|
||
},
|
||
{
|
||
"title": "Machine learning",
|
||
"technologies": [
|
||
{ "name": "PyTorch" },
|
||
{ "name": "Ultralytics/YOLO" },
|
||
{ "name": "OpenCV" },
|
||
{ "name": "SoccerNet" }
|
||
]
|
||
}
|
||
],
|
||
"contact": {
|
||
"introduction": "I’m open to System Administrator and Full-Stack Developer opportunities in Bucharest, including on-site, hybrid, and remote work, as well as international remote roles.",
|
||
"email": "luca.pislaru@gmail.com",
|
||
"social": [
|
||
{ "service": "GitHub", "url": "https://github.com/LucaPisl" },
|
||
{ "service": "GitLab", "url": "https://gitlab.com/luca_pisl" },
|
||
{ "service": "LinkedIn", "url": "https://linkedin.com/in/luca-pisl" }
|
||
],
|
||
"cvMessage": "For a current CV or role-specific information, contact me directly."
|
||
},
|
||
"metadata": {
|
||
"title": "Luca Pîslaru — System Administrator & Full-Stack Developer",
|
||
"description": "Portfolio of Luca Pîslaru, a Bucharest-based System Administrator and Full-Stack Developer working across Linux infrastructure and end-to-end software delivery.",
|
||
"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."
|
||
}
|