Digital products

Ideas turned into useful tools.

We develop digital products that make everyday work and life easier.

Digital products in development

M

Moirena

A fun and engaging app with characters, tasks, runners and horoscopes.

Coming soon
◇

More products

New tools and apps in development.

Stay updated →
AK31 LAB · CREATIVE PROJECTS

AK31 Lab projects.

Creative projects with work you can watch and listen to.

A project by AK31 Lab

AK31 LAB Music

Original songs and instrumental music in different languages and styles.

AUNYRIA · Selected videos

Videos load from Instagram when you press play. Instagram may use cookies.

GoSeeWhy · Selected videos

Videos load from Instagram when you press play. Instagram may use cookies.

Selected videos
Open in Instagram ↗
A service-specific process

Custom digital product development.

We build from a validated user problem, not an untested feature list.

  1. 01

    Define the product

    Clarify users, tasks, constraints, core journey and measurable outcome.

  2. 02

    Prototype

    Test the smallest usable flow before full development.

  3. 03

    Build

    Develop the approved product, integrations and controls.

  4. 04

    Launch and iterate

    Verify on target devices, release and improve from evidence.

(function () { "use strict"; var touchDevice = (window.matchMedia && window.matchMedia("(pointer: coarse)").matches) || /Android|iPhone|iPad|iPod|Mobile/i.test(window.navigator.userAgent || ""); if (touchDevice) document.documentElement.classList.add("ak-touch-device"); function initializeNavigation() { var navigation = document.getElementById("akLinks"); var menuButton = document.querySelector("[data-ak-menu-toggle]"); var languageMenu = document.querySelector(".ak-lang-global"); if (!navigation || !menuButton) return; function closeMenu(returnFocus) { navigation.classList.remove("open"); menuButton.setAttribute("aria-expanded", "false"); if (returnFocus) menuButton.focus(); } menuButton.addEventListener("click", function () { var open = navigation.classList.toggle("open"); menuButton.setAttribute("aria-expanded", String(open)); if (open && languageMenu) languageMenu.removeAttribute("open"); }); navigation.addEventListener("click", function (event) { if (event.target.closest("a")) closeMenu(false); }); document.addEventListener("click", function (event) { if (!navigation.classList.contains("open")) return; if (!navigation.contains(event.target) && !menuButton.contains(event.target)) closeMenu(false); }); document.addEventListener("keydown", function (event) { if (event.key === "Escape") closeMenu(true); }); window.addEventListener("resize", function () { if (window.innerWidth > 1180) closeMenu(false); }, { passive: true }); } function initializeMotion() { var videos = Array.prototype.slice.call(document.querySelectorAll("video.ak-motion")); if (!videos.length) return; var reducedMotion = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)"); var canAnimate = !reducedMotion || !reducedMotion.matches; function prepare(video) { video.muted = true; video.defaultMuted = true; video.loop = true; video.playsInline = true; video.controls = false; video.setAttribute("muted", ""); video.setAttribute("playsinline", ""); video.setAttribute("webkit-playsinline", ""); video.removeAttribute("controls"); } function play(video) { if (!canAnimate || document.hidden || video.dataset.akVisible === "false") return; var attempt = video.play(); if (attempt && typeof attempt.catch === "function") attempt.catch(function () { video.classList.add("ak-motion-fallback"); }); } videos.forEach(function (video) { prepare(video); if (!canAnimate) { video.pause(); video.removeAttribute("autoplay"); return; } ["loadedmetadata", "loadeddata", "canplay"].forEach(function (eventName) { video.addEventListener(eventName, function () { play(video); }, { once: true }); }); play(video); }); if ("IntersectionObserver" in window) { var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { entry.target.dataset.akVisible = String(entry.isIntersecting); if (entry.isIntersecting) play(entry.target); else entry.target.pause(); }); }, { rootMargin: "100px 0px", threshold: 0.02 }); videos.forEach(function (video) { observer.observe(video); }); } document.addEventListener("visibilitychange", function () { videos.forEach(function (video) { if (document.hidden) video.pause(); else play(video); }); }); } function initializeBorderMotion() { var selectors = [".ak-panel", ".ak-card", ".ak-icon", ".ak-step", ".ak-context-grid > p", ".ak-workflow-card", ".ak-workflow-detail .ak-workflow-steps li", ".ak-partner-card", ".ak-strip > div", ".ak-btn:not(.primary)", ".ak-motion-frame"].join(","); var frames = Array.prototype.slice.call(document.querySelectorAll(selectors)); if (!frames.length) return; var reduced = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches; frames.forEach(function (frame) { frame.classList.add("ak-border-flow"); }); if (reduced) return; if ("IntersectionObserver" in window) { var observer = new IntersectionObserver(function (entries) { entries.forEach(function (entry) { entry.target.dataset.akFrameVisible = String(entry.isIntersecting); entry.target.classList.toggle("ak-border-active", entry.isIntersecting && !document.hidden); }); }, { rootMargin: "120px 0px", threshold: 0.01 }); frames.forEach(function (frame) { observer.observe(frame); }); } else { frames.forEach(function (frame) { frame.classList.add("ak-border-active"); }); } } function initialize() { initializeNavigation(); initializeMotion(); initializeBorderMotion(); } if (document.readyState === "loading") document.addEventListener("DOMContentLoaded", initialize); else initialize(); })();