Digitalization of law firms starts here.

Velatum baut KI-gestützte Automatisierungstools für Kanzleien. Wir reduzieren repetitiven Aufwand bei dokumentenintensiven Prozessen — damit juristische Expertise dort eingesetzt wird, wo sie zählt.

Velatum ist ein Technologie-Team, das Automatisierungstools für Kanzleien baut. Wir arbeiten eng mit Partnern aus dem Rechtswesen zusammen — damit unsere Tools nicht nur technisch funktionieren, sondern juristische Realität abbilden.

Haben Sie Interesse an einer Zusammenarbeit?

Melden Sie sich gerne bei uns.

Jetzt Kontakt aufnehmen
Made in Austria

Justitia goes Agentic.

What we're building

Unsere ersten Tools adressieren die häufigsten Compliance-Engpässe in der täglichen Kanzleiarbeit. Beide befinden sich aktuell in der Entwicklung.

Anonymize
Anonymize Demnächst

Automatische Schwärzung personenbezogener Daten in juristischen Dokumenten. DSGVO-konform, modell-gestützt, produktionsbereit.

Pilot anfragen
Client-Communication
Client-Communication Demnächst

Automated drafting of client-facing correspondence based on case documents — structured, audit-ready, and consistent across your firm.

Partners

The people behind Velatum

Wir sind fünf Absolventen aus Software Engineering, KI und IT-Security — mit praktischer Erfahrung aus Industrie, Forschung und einem gemeinsamen Verständnis dafür, wo Technologie im Rechtswesen heute noch fehlt.

Paul Bachinger

Paul Bachinger

DevOps & Projektmanagement

BSc Software & Information Engineering (TU Wien), Hintergrund in Fullstack-Entwicklung, DevOps-Infrastruktur und Medienproduktion.

Filip Rozana

Filip Rozana

Softwarearchitektur & Frontend

BSc Software & Information Engineering (TU Wien), Erfahrung im Siemens Innovation Lab, Schwerpunkt skalierbare Frontend-Systeme.

Matthias Pfrendl

Matthias Pfrendl

ML-Ops & Backend

BSc Informatik (HCW), Spezialisierung auf IT-Security und Data Science, vorherige Startup-Erfahrung.

Tristan Westreicher

Tristan Westreicher

IT-Security

BSc Informatik (HCW), derzeit MSc IT-Security (HCW), Erfahrung in Data Governance (Wien Energie).

Felix Herzberger

Felix Herzberger

ML Engineering & KI

BSc KI-Engineering (JKU Linz), verantwortlich für Entwicklung, Training und Evaluation der Machine-Learning-Modelle für zentrale KI-Systeme.

Get in touch

body: "Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur. Et harum quidem rerum facilis est et expedita distinctio." }, { title: "Integration", body: "Nam libero tempore cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus temporibus autem quibusdam." } ] } }; const modal = document.getElementById("product-modal"); const modalInner = modal.querySelector(".product-modal-inner"); const modalName = document.getElementById("modal-name"); const modalLead = document.getElementById("modal-lead"); const modalSects = document.getElementById("modal-sections"); function openProductModal(card) { const key = card.dataset.product; const data = productDetails[key]; if (!data) return; modalName.textContent = data.name; modalLead.textContent = data.lead; const workflowBlock = data.workflowHtml || ''; const sectionsBlock = ``; const ctaBlock = data.ctaHtml || ''; modalSects.innerHTML = workflowBlock + sectionsBlock + ctaBlock; if (window.velatumLang) window.velatumLang.refresh(); modal.classList.add("open"); modal.setAttribute("aria-hidden", "false"); document.body.style.overflow = "hidden"; modalInner.scrollTop = 0; if (key === 'anonymize') setTimeout(initAnonStepper, 50); } function closeProductModal() { clearAnonTimers(); modal.classList.remove("open"); modal.setAttribute("aria-hidden", "true"); document.body.style.overflow = ""; } document.querySelectorAll(".product-card").forEach(card => { card.addEventListener("click", () => openProductModal(card)); }); document.getElementById("modal-close-btn").addEventListener("click", closeProductModal); modal.addEventListener("click", (e) => { if (e.target === modal) closeProductModal(); }); document.addEventListener("keydown", (e) => { if (e.key === "Escape") closeProductModal(); }); /* ── Anonymize workflow stepper ─────────────────── */ let anonTimers = []; function clearAnonTimers() { anonTimers.forEach(t => clearTimeout(t)); anonTimers = []; } function initAnonStepper() { const container = document.querySelector('.anon-workflow-container'); if (!container) return; const steps = container.querySelectorAll('.anon-step'); const dots = container.querySelectorAll('.anon-nav-dot'); const prevBtn = container.querySelector('.anon-nav-prev'); const nextBtn = container.querySelector('.anon-nav-next'); let current = 0; /* Lock container widths so from stays in flow when visibility:hidden */ container.querySelectorAll('.anon-swap').forEach(swap => { const from = swap.querySelector('.anon-swap-from'); if (from) swap.style.minWidth = from.offsetWidth + 'px'; }); function goToStep(idx) { if (idx < 0 || idx > 2 || idx === current) return; clearAnonTimers(); /* Reset previous step animations */ const prev = steps[current]; prev.querySelectorAll('.anon-detect').forEach(el => el.classList.remove('detected')); prev.querySelectorAll('.anon-swap').forEach(el => { el.classList.remove('fading', 'swapped'); }); const prevInd = prev.querySelector('.anon-detect-indicator'); if (prevInd) prevInd.classList.remove('revealed'); steps.forEach((s, i) => s.classList.toggle('active', i === idx)); dots.forEach((d, i) => d.classList.toggle('active', i === idx)); prevBtn.disabled = idx === 0; nextBtn.disabled = idx === 2; current = idx; const step = steps[idx]; /* Step 2: detection animation */ if (idx === 1) { const detects = step.querySelectorAll('.anon-detect'); detects.forEach(el => el.classList.remove('detected')); detects.forEach(el => { const order = parseInt(el.dataset.detectOrder) || 1; const t = setTimeout(() => el.classList.add('detected'), order * 350); anonTimers.push(t); }); const indicator = step.querySelector('.anon-detect-indicator'); if (indicator) { const t = setTimeout(() => indicator.classList.add('revealed'), detects.length * 350 + 200); anonTimers.push(t); } } /* Swap animation: fade original out, placeholder in */ if (idx === 2) { const swaps = step.querySelectorAll('.anon-swap'); swaps.forEach(el => { el.classList.remove('fading', 'swapped'); }); swaps.forEach(el => { const order = parseInt(el.dataset.swapOrder) || 1; const t1 = setTimeout(() => el.classList.add('fading'), order * 130); const t2 = setTimeout(() => { el.classList.remove('fading'); el.classList.add('swapped'); }, order * 130 + 130); anonTimers.push(t1, t2); }); } /* Reset step 3 when leaving */ if (idx !== 2) { step.querySelectorAll('.anon-swap').forEach(el => { el.classList.remove('fading', 'swapped'); }); } } prevBtn.addEventListener('click', () => goToStep(current - 1)); nextBtn.addEventListener('click', () => goToStep(current + 1)); dots.forEach(dot => { dot.addEventListener('click', () => goToStep(parseInt(dot.dataset.navStep))); }); steps.forEach((step, i) => { if (i !== current) step.addEventListener('click', () => goToStep(i)); }); } /* ── Scroll reveal ─────────────────────────────── */ const revealEls = document.querySelectorAll(".reveal"); const revealObs = new IntersectionObserver((entries) => { entries.forEach(e => { if (e.isIntersecting) { e.target.classList.add("visible"); revealObs.unobserve(e.target); } }); }, { threshold: 0.12 }); revealEls.forEach(el => revealObs.observe(el)); }());