Files
2026-02-01 00:47:50 +01:00

983 lines
89 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en-US" class="js lenis lenis-scrolling"><head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=5"><title>What I love about Clean Architecture (and why I always end up regretting when I dont use it) - Marc Mintel</title>
<style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style>
<meta name="dc.title" content="What I love about Clean Architecture (and why I always end up regretting when I dont use it) - Marc Mintel">
<meta name="dc.description" content="Discover the power of Clean Architecture in safeguarding your app's core logic from external changes—ensuring flexibility and preventing costly errors.">
<meta name="dc.relation" content="https://mintel.me/what-i-love-about-clean-architecture-and-why-i-always-end-up-regretting-when-i-dont-use-it/">
<meta name="dc.source" content="https://mintel.me/">
<meta name="dc.language" content="en_US">
<meta name="description" content="Discover the power of Clean Architecture in safeguarding your app's core logic from external changes—ensuring flexibility and preventing costly errors.">
<meta name="robots" content="index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1">
<link rel="canonical" href="https://mintel.me/what-i-love-about-clean-architecture-and-why-i-always-end-up-regretting-when-i-dont-use-it/">
<meta property="og:url" content="https://mintel.me/what-i-love-about-clean-architecture-and-why-i-always-end-up-regretting-when-i-dont-use-it/">
<meta property="og:site_name" content="Marc Mintel">
<meta property="og:locale" content="en_US">
<meta property="og:type" content="article">
<meta property="og:title" content="What I love about Clean Architecture (and why I always end up regretting when I dont use it) - Marc Mintel">
<meta property="og:description" content="Discover the power of Clean Architecture in safeguarding your app's core logic from external changes—ensuring flexibility and preventing costly errors.">
<meta property="og:image" content="../wp-content/uploads/2025/01/carbon-2.webp">
<meta property="og:image:secure_url" content="https://mintel.me/wp-content/uploads/2025/01/carbon-2.webp">
<meta property="og:image:width" content="1920">
<meta property="og:image:height" content="1125">
<meta property="fb:pages" content="">
<meta property="fb:admins" content="">
<meta property="fb:app_id" content="">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="What I love about Clean Architecture (and why I always end up regretting when I dont use it) - Marc Mintel">
<meta name="twitter:description" content="Discover the power of Clean Architecture in safeguarding your app's core logic from external changes—ensuring flexibility and preventing costly errors.">
<meta name="twitter:image" content="https://mintel.me/wp-content/uploads/2025/01/carbon-2-1024x600.webp">
<link rel="dns-prefetch" href="//fonts.googleapis.com">
<link rel="alternate" type="application/rss+xml" title="Marc Mintel » Feed" href="https://mintel.me/feed/">
<link rel="alternate" type="application/rss+xml" title="Marc Mintel » Comments Feed" href="https://mintel.me/comments/feed/">
<link rel="preload" href="https://mintel.me/wp-content/themes/salient/css/fonts/icomoon.woff?v=1.6" as="font" type="font/woff" crossorigin="anonymous"><link rel="stylesheet" id="device_wrapper-simplebar-css" href="../wp-content/plugins/device-wrapper/src/css/simplebar.css" type="text/css" media="all">
<link rel="stylesheet" id="device_wrapper-style-css-css" href="../wp-content/plugins/device-wrapper/dist/blocks.style.build.css" type="text/css" media="all">
<style id="wpseopress-local-business-style-inline-css" type="text/css">
span.wp-block-wpseopress-local-business-field{margin-right:8px}
</style>
<style id="filebird-block-filebird-gallery-style-inline-css" type="text/css">
ul.filebird-block-filebird-gallery{margin:auto!important;padding:0!important;width:100%}ul.filebird-block-filebird-gallery.layout-grid{display:grid;grid-gap:20px;align-items:stretch;grid-template-columns:repeat(var(--columns),1fr);justify-items:stretch}ul.filebird-block-filebird-gallery.layout-grid li img{border:1px solid #ccc;box-shadow:2px 2px 6px 0 rgba(0,0,0,.3);height:100%;max-width:100%;-o-object-fit:cover;object-fit:cover;width:100%}ul.filebird-block-filebird-gallery.layout-masonry{-moz-column-count:var(--columns);-moz-column-gap:var(--space);column-gap:var(--space);-moz-column-width:var(--min-width);columns:var(--min-width) var(--columns);display:block;overflow:auto}ul.filebird-block-filebird-gallery.layout-masonry li{margin-bottom:var(--space)}ul.filebird-block-filebird-gallery li{list-style:none}ul.filebird-block-filebird-gallery li figure{height:100%;margin:0;padding:0;position:relative;width:100%}ul.filebird-block-filebird-gallery li figure figcaption{background:linear-gradient(0deg,rgba(0,0,0,.7),rgba(0,0,0,.3) 70%,transparent);bottom:0;box-sizing:border-box;color:#fff;font-size:.8em;margin:0;max-height:100%;overflow:auto;padding:3em .77em .7em;position:absolute;text-align:center;width:100%;z-index:2}ul.filebird-block-filebird-gallery li figure figcaption a{color:inherit}
</style>
<style id="global-styles-inline-css" type="text/css">
:root{--wp--preset--aspect-ratio--square: 1;--wp--preset--aspect-ratio--4-3: 4/3;--wp--preset--aspect-ratio--3-4: 3/4;--wp--preset--aspect-ratio--3-2: 3/2;--wp--preset--aspect-ratio--2-3: 2/3;--wp--preset--aspect-ratio--16-9: 16/9;--wp--preset--aspect-ratio--9-16: 9/16;--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:root { --wp--style--global--content-size: 1300px;--wp--style--global--wide-size: 1300px; }:where(body) { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}.is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}.is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}.is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}.is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}.is-layout-flex{flex-wrap: wrap;align-items: center;}.is-layout-flex > :is(*, div){margin: 0;}body .is-layout-grid{display: grid;}.is-layout-grid > :is(*, div){margin: 0;}body{padding-top: 0px;padding-right: 0px;padding-bottom: 0px;padding-left: 0px;}:root :where(.wp-element-button, .wp-block-button__link){background-color: #32373c;border-width: 0;color: #fff;font-family: inherit;font-size: inherit;line-height: inherit;padding: calc(0.667em + 2px) calc(1.333em + 2px);text-decoration: none;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
</style>
<link rel="stylesheet" id="salient-social-css" href="../wp-content/plugins/salient-social/css/style.css" type="text/css" media="all">
<style id="salient-social-inline-css" type="text/css">
.sharing-default-minimal .nectar-love.loved,
body .nectar-social[data-color-override="override"].fixed > a:before,
body .nectar-social[data-color-override="override"].fixed .nectar-social-inner a,
.sharing-default-minimal .nectar-social[data-color-override="override"] .nectar-social-inner a:hover,
.nectar-social.vertical[data-color-override="override"] .nectar-social-inner a:hover {
background-color: #111111;
}
.nectar-social.hover .nectar-love.loved,
.nectar-social.hover > .nectar-love-button a:hover,
.nectar-social[data-color-override="override"].hover > div a:hover,
#single-below-header .nectar-social[data-color-override="override"].hover > div a:hover,
.nectar-social[data-color-override="override"].hover .share-btn:hover,
.sharing-default-minimal .nectar-social[data-color-override="override"] .nectar-social-inner a {
border-color: #111111;
}
#single-below-header .nectar-social.hover .nectar-love.loved i,
#single-below-header .nectar-social.hover[data-color-override="override"] a:hover,
#single-below-header .nectar-social.hover[data-color-override="override"] a:hover i,
#single-below-header .nectar-social.hover .nectar-love-button a:hover i,
.nectar-love:hover i,
.hover .nectar-love:hover .total_loves,
.nectar-love.loved i,
.nectar-social.hover .nectar-love.loved .total_loves,
.nectar-social.hover .share-btn:hover,
.nectar-social[data-color-override="override"].hover .nectar-social-inner a:hover,
.nectar-social[data-color-override="override"].hover > div:hover span,
.sharing-default-minimal .nectar-social[data-color-override="override"] .nectar-social-inner a:not(:hover) i,
.sharing-default-minimal .nectar-social[data-color-override="override"] .nectar-social-inner a:not(:hover) {
color: #111111;
}
</style>
<link rel="stylesheet" id="vlp-public-css" href="../wp-content/plugins/visual-link-preview/dist/public.css" type="text/css" media="all">
<link rel="stylesheet" id="salient-grid-system-css" href="../wp-content/themes/salient/css/build/grid-system.css" type="text/css" media="all">
<link rel="stylesheet" id="main-styles-css" href="../wp-content/themes/salient/css/build/style.css" type="text/css" media="all">
<style id="main-styles-inline-css" type="text/css">
body[data-ajax-transitions="true"] #ajax-loading-screen[data-effect="standard"],body[data-ajax-transitions="true"] #ajax-loading-screen[data-effect="standard"] .loading-icon{transition:opacity 0.4s ease;}body[data-ajax-transitions="true"] #ajax-loading-screen[data-effect="standard"].loaded,body[data-ajax-transitions="true"] #ajax-loading-screen[data-effect="standard"].loaded .loading-icon{opacity:0;}@media only screen and (max-width:999px){#ajax-content-wrap .top-level .nectar-post-grid[data-animation*="fade"] .nectar-post-grid-item,#ajax-content-wrap .top-level .nectar-post-grid[data-animation="zoom-out-reveal"] .nectar-post-grid-item *:not(.content):not(.bg-overlay),#ajax-content-wrap .top-level .nectar-post-grid[data-animation="zoom-out-reveal"] .nectar-post-grid-item *:before{transform:none;opacity:1;clip-path:none;}#ajax-content-wrap .top-level .nectar-post-grid[data-animation="zoom-out-reveal"] .nectar-post-grid-item .nectar-el-parallax-scroll .nectar-post-grid-item-bg-wrap-inner{transform:scale(1.275);}}.wpb_row.vc_row.top-level .nectar-video-bg{opacity:1;height:100%;width:100%;object-fit:cover;object-position:center center;}body.using-mobile-browser .wpb_row.vc_row.top-level .nectar-video-wrap{left:0;}body.using-mobile-browser .wpb_row.vc_row.top-level.full-width-section .nectar-video-wrap:not(.column-video){left:50%;}body.using-mobile-browser #nectar_fullscreen_rows[data-mobile-disable="off"] .wpb_row.vc_row.top-level.full-width-section .nectar-video-wrap:not(.column-video){left:0;}.wpb_row.vc_row.top-level .nectar-video-wrap{opacity:1;width:100%;}body .wpb_row.parallax_section.top-level > .nectar-video-wrap video:not(.translate){opacity:1;}.top-level .portfolio-items[data-loading=lazy-load] .col .inner-wrap.animated .top-level-image{opacity:1;}.wpb_row.vc_row.top-level .column-image-bg-wrap[data-n-parallax-bg="true"] .column-image-bg,.wpb_row.vc_row.top-level + .wpb_row .column-image-bg-wrap[data-n-parallax-bg="true"] .column-image-bg,#portfolio-extra > .wpb_row.vc_row.parallax_section:first-child .row-bg{transform:none!important;height:100%!important;opacity:1;}#portfolio-extra > .wpb_row.vc_row.parallax_section .row-bg{background-attachment:scroll;}.scroll-down-wrap.hidden{transform:none;opacity:1;}#ajax-loading-screen[data-disable-mobile="0"]{display:none!important;}body[data-slide-out-widget-area-style="slide-out-from-right"].material .slide_out_area_close.hide_until_rendered{opacity:0;}
</style>
<link rel="stylesheet" id="nectar-header-layout-centered-menu-css" href="../wp-content/themes/salient/css/build/header/header-layout-centered-menu.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-header-perma-transparent-css" href="../wp-content/themes/salient/css/build/header/header-perma-transparent.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-single-styles-css" href="../wp-content/themes/salient/css/build/single.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-element-highlighted-text-css" href="../wp-content/themes/salient/css/build/elements/element-highlighted-text.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-element-post-grid-css" href="../wp-content/themes/salient/css/build/elements/element-post-grid.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-element-recent-posts-css" href="../wp-content/themes/salient/css/build/elements/element-recent-posts.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar_default_font_open_sans-css" href="../_external/fonts.googleapis.com/css" type="text/css" media="all">
<link rel="stylesheet" id="responsive-css" href="../wp-content/themes/salient/css/build/responsive.css" type="text/css" media="all">
<link rel="stylesheet" id="skin-material-css" href="../wp-content/themes/salient/css/build/skin-material.css" type="text/css" media="all">
<link rel="stylesheet" id="salient-wp-menu-dynamic-css" href="../wp-content/uploads/salient/menu-dynamic.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-widget-posts-css" href="../wp-content/themes/salient/css/build/elements/widget-nectar-posts.css" type="text/css" media="all">
<link rel="stylesheet" id="js_composer_front-css" href="../wp-content/plugins/js_composer_salient/assets/css/js_composer.min.css" type="text/css" media="all">
<link rel="stylesheet" id="dynamic-css-css" href="../wp-content/themes/salient/css/salient-dynamic-styles.css" type="text/css" media="all">
<style id="dynamic-css-inline-css" type="text/css">
.single.single-post .container-wrap{padding-top:0;}.main-content .featured-media-under-header{padding:min(6vw,90px) 0;}.featured-media-under-header__featured-media:not([data-has-img="false"]){margin-top:min(6vw,90px);}.featured-media-under-header__featured-media:not([data-format="video"]):not([data-format="audio"]):not([data-has-img="false"]){overflow:hidden;position:relative;padding-bottom:50%;}.featured-media-under-header__meta-wrap{display:flex;flex-wrap:wrap;align-items:center;}.featured-media-under-header__meta-wrap .meta-author{display:inline-flex;align-items:center;}.featured-media-under-header__meta-wrap .meta-author img{margin-right:8px;width:28px;border-radius:100px;}.featured-media-under-header__featured-media .post-featured-img{display:block;line-height:0;top:auto;bottom:0;}.featured-media-under-header__featured-media[data-n-parallax-bg="true"] .post-featured-img{height:calc(100% + 75px);}.featured-media-under-header__featured-media .post-featured-img img{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;object-position:top;}@media only screen and (max-width:690px){.featured-media-under-header__featured-media[data-n-parallax-bg="true"] .post-featured-img{height:calc(100% + 45px);}.featured-media-under-header__meta-wrap{font-size:14px;}}.featured-media-under-header__featured-media[data-align="center"] .post-featured-img img{object-position:center;}.featured-media-under-header__featured-media[data-align="bottom"] .post-featured-img img{object-position:bottom;}.featured-media-under-header h1{margin:max(min(0.35em,35px),20px) 0 max(min(0.25em,25px),15px) 0;}.featured-media-under-header__cat-wrap .meta-category a{line-height:1;padding:7px 15px;margin-right:15px;}.featured-media-under-header__cat-wrap .meta-category a:not(:hover){background-color:rgba(0,0,0,0.05);}.featured-media-under-header__cat-wrap .meta-category a:hover{color:#fff;}.featured-media-under-header__meta-wrap a,.featured-media-under-header__cat-wrap a{color:inherit;}.featured-media-under-header__meta-wrap > span:not(:first-child):not(.rich-snippet-hidden):before{content:"&middot;";padding:0 .5em;}.featured-media-under-header__excerpt{margin:0 0 20px 0;}@media only screen and (min-width:691px){[data-animate="fade_in"] .featured-media-under-header__cat-wrap,[data-animate="fade_in"].featured-media-under-header .entry-title,[data-animate="fade_in"] .featured-media-under-header__meta-wrap,[data-animate="fade_in"] .featured-media-under-header__featured-media,[data-animate="fade_in"] .featured-media-under-header__excerpt,[data-animate="fade_in"].featured-media-under-header + .row .content-inner{opacity:0;transform:translateY(50px);animation:nectar_featured_media_load 1s cubic-bezier(0.25,1,0.5,1) forwards;}[data-animate="fade_in"] .featured-media-under-header__cat-wrap{animation-delay:0.1s;}[data-animate="fade_in"].featured-media-under-header .entry-title{animation-delay:0.2s;}[data-animate="fade_in"] .featured-media-under-header__excerpt{animation-delay:0.3s;}[data-animate="fade_in"] .featured-media-under-header__meta-wrap{animation-delay:0.3s;}[data-animate="fade_in"] .featured-media-under-header__featured-media{animation-delay:0.4s;}[data-animate="fade_in"].featured-media-under-header + .row .content-inner{animation-delay:0.5s;}}@keyframes nectar_featured_media_load{0%{transform:translateY(50px);opacity:0;}100%{transform:translateY(0px);opacity:1;}}.featured-media-under-header__content{display:flex;flex-direction:column;align-items:center;text-align:center;max-width:1000px;margin:0 auto;}@media only screen and (min-width:691px){.featured-media-under-header__excerpt{max-width:75%;}}.featured-media-under-header__meta-wrap .meta-author img{margin-right:15px;width:50px;}@media only screen and (max-width:690px){width:40px;}.featured-media-under-header__meta-wrap .meta-author > span{text-align:left;line-height:1.5;}.featured-media-under-header__meta-wrap .meta-author > span span:not(.rich-snippet-hidden){display:block;}.featured-media-under-header__meta-wrap .meta-date,.featured-media-under-header__meta-wrap .meta-reading-time{font-size:.85em;}#header-space{background-color:#0a0a0a}@media only screen and (min-width:1000px){body #ajax-content-wrap.no-scroll{min-height:calc(100vh - 90px);height:calc(100vh - 90px)!important;}}@media only screen and (min-width:1000px){#page-header-wrap.fullscreen-header,#page-header-wrap.fullscreen-header #page-header-bg,html:not(.nectar-box-roll-loaded) .nectar-box-roll > #page-header-bg.fullscreen-header,.nectar_fullscreen_zoom_recent_projects,#nectar_fullscreen_rows:not(.afterLoaded) > div{height:calc(100vh - 89px);}.wpb_row.vc_row-o-full-height.top-level,.wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 89px);}html:not(.nectar-box-roll-loaded) .nectar-box-roll > #page-header-bg.fullscreen-header{top:90px;}.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded),.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded) .swiper-container{height:calc(100vh - 88px)!important;}.admin-bar .nectar-slider-wrap[data-fullscreen="true"]:not(.loaded),.admin-bar .nectar-slider-wrap[data-fullscreen="true"]:not(.loaded) .swiper-container{height:calc(100vh - 88px - 32px)!important;}}.admin-bar[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level,.admin-bar[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 32px);}body[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level,body[class*="page-template-template-no-header"] .wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:100vh;}@media only screen and (max-width:999px){.using-mobile-browser #nectar_fullscreen_rows:not(.afterLoaded):not([data-mobile-disable="on"]) > div{height:calc(100vh - 116px);}.using-mobile-browser .wpb_row.vc_row-o-full-height.top-level,.using-mobile-browser .wpb_row.vc_row-o-full-height.top-level > .col.span_12,[data-permanent-transparent="1"].using-mobile-browser .wpb_row.vc_row-o-full-height.top-level,[data-permanent-transparent="1"].using-mobile-browser .wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 116px);}html:not(.nectar-box-roll-loaded) .nectar-box-roll > #page-header-bg.fullscreen-header,.nectar_fullscreen_zoom_recent_projects,.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded),.nectar-slider-wrap[data-fullscreen="true"]:not(.loaded) .swiper-container,#nectar_fullscreen_rows:not(.afterLoaded):not([data-mobile-disable="on"]) > div{height:calc(100vh - 63px);}.wpb_row.vc_row-o-full-height.top-level,.wpb_row.vc_row-o-full-height.top-level > .col.span_12{min-height:calc(100vh - 63px);}body[data-transparent-header="false"] #ajax-content-wrap.no-scroll{min-height:calc(100vh - 63px);height:calc(100vh - 63px);}}#ajax-content-wrap .vc_row.top_margin_5pct{margin-top:5%;}#ajax-content-wrap .vc_row.bottom_margin_5pct{margin-bottom:5%;}.screen-reader-text,.nectar-skip-to-content:not(:focus){border:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;width:1px;word-wrap:normal!important;}.row .col img:not([srcset]){width:auto;}.row .col img.img-with-animation.nectar-lazy:not([srcset]){width:100%;}
</style>
<link rel="stylesheet" id="salient-child-style-css" href="../wp-content/themes/salient-child/style.css" type="text/css" media="all">
<link rel="stylesheet" id="redux-google-fonts-salient_redux-css" href="../_external/fonts.googleapis.com/css" type="text/css" media="all">
<script type="text/javascript" id="asenha-public-js-extra">
/* <![CDATA[ */
var phpVars = {"externalPermalinksEnabled":"1"};
/* ]]> */
</script>
<script type="text/javascript" src="../wp-content/plugins/admin-site-enhancements-pro/assets/js/external-permalinks.js" id="asenha-public-js"></script>
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/mintel.me","ignore_remote_prefetch":"1","ignore_list":["wp-admin","wp-login.php"]};
/* ]]> */
</script>
<script type="text/javascript" src="../wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script></script><link rel="https://api.w.org/" href="https://mintel.me/wp-json/"><link rel="alternate" title="JSON" type="application/json" href="https://mintel.me/wp-json/wp/v2/posts/900"><meta name="generator" content="WordPress 6.7.4">
<link rel="shortlink" href="https://mintel.me/?p=900">
<link rel="alternate" title="oEmbed (JSON)" type="application/json+oembed" href="https://mintel.me/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fmintel.me%2Fwhat-i-love-about-clean-architecture-and-why-i-always-end-up-regretting-when-i-dont-use-it%2F">
<link rel="alternate" title="oEmbed (XML)" type="text/xml+oembed" href="https://mintel.me/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fmintel.me%2Fwhat-i-love-about-clean-architecture-and-why-i-always-end-up-regretting-when-i-dont-use-it%2F&amp;format=xml">
<noscript>
<style>
/**
* Reinstate scrolling for non-JS clients
*/
.simplebar-content-wrapper {
scrollbar-width: auto;
-ms-overflow-style: auto;
}
.simplebar-content-wrapper::-webkit-scrollbar,
.simplebar-hide-scrollbar::-webkit-scrollbar {
display: initial;
width: initial;
height: initial;
}
</style>
</noscript>
<script type="javascript/text">
(function(){
window.device_wrapper.can_use_premium_code = ;
})();
</script>
<script type="text/javascript"> var root = document.getElementsByTagName( "html" )[0]; root.setAttribute( "class", "js" ); </script>
<style>
.client-logo {
width: auto !important;
height: 50px !important;
}
</style>
<meta name="generator" content="Powered by WPBakery Page Builder - drag and drop page builder for WordPress.">
<link rel="icon" href="../wp-content/uploads/2024/11/cropped-Favicon-2-100x100.png" sizes="32x32">
<link rel="icon" href="../wp-content/uploads/2024/11/cropped-Favicon-2-300x300.png" sizes="192x192">
<link rel="apple-touch-icon" href="../wp-content/uploads/2024/11/cropped-Favicon-2-300x300.png">
<meta name="msapplication-TileImage" content="https://mintel.me/wp-content/uploads/2024/11/cropped-Favicon-2-300x300.png">
<noscript><style> .wpb_animate_when_almost_visible { opacity: 1; }</style></noscript><link href="https://mintel.me/wp-content/themes/salient/js/build/third-party/jquery.easing.min.js?ver=1.3" rel="preload" as="script"><link href="https://mintel.me/wp-content/themes/salient/js/build/third-party/jquery.mousewheel.min.js?ver=3.1.13" rel="preload" as="script"><link href="https://mintel.me/wp-content/themes/salient/js/build/third-party/waypoints.js?ver=4.0.2" rel="preload" as="script"><link href="https://mintel.me/wp-content/themes/salient/js/build/third-party/hoverintent.min.js?ver=1.9" rel="preload" as="script"><link href="https://mintel.me/wp-content/themes/salient/js/build/third-party/superfish.js?ver=1.5.8" rel="preload" as="script"><link href="https://mintel.me/wp-content/themes/salient/js/build/init.js?ver=17.0.3" rel="preload" as="script"><link href="https://mintel.me/wp-content/plugins/salient-core/js/third-party/touchswipe.min.js?ver=1.0" rel="preload" as="script"><link href="https://mintel.me/wp-content/plugins/js_composer_salient/assets/js/dist/js_composer_front.min.js?ver=7.8.1" rel="preload" as="script"><style></style></head><body class="post-template-default single single-post postid-900 single-format-standard material wpb-js-composer js-comp-ver-7.8.1 vc_responsive mobile nectar-delay-js-loaded" data-footer-reveal="false" data-footer-reveal-shadow="none" data-header-format="centered-menu" data-body-border="off" data-boxed-style="" data-header-breakpoint="1000" data-dropdown-style="minimal" data-cae="easeOutCubic" data-cad="1300" data-megamenu-width="contained" data-aie="none" data-ls="fancybox" data-apte="standard" data-hhun="1" data-fancy-form-rcs="default" data-form-style="default" data-form-submit="regular" data-is="minimal" data-button-style="rounded_shadow" data-user-account-button="false" data-flex-cols="true" data-col-gap="default" data-header-inherit-rc="false" data-header-search="false" data-animated-anchors="true" data-ajax-transitions="false" data-full-width-header="false" data-slide-out-widget-area="true" data-slide-out-widget-area-style="slide-out-from-right-hover" data-user-set-ocm="off" data-loading-animation="none" data-bg-header="false" data-responsive="1" data-ext-responsive="true" data-ext-padding="40" data-header-resize="0" data-header-color="custom" data-cart="false" data-remove-m-parallax="" data-remove-m-video-bgs="" data-m-animate="1" data-force-header-trans-color="light" data-smooth-scrolling="0" data-permanent-transparent="false" style="--scroll-bar-w: 0px">
<script type="text/javascript">
(function(window, document) {
if(navigator.userAgent.match(/(Android|iPod|iPhone|iPad|BlackBerry|IEMobile|Opera Mini)/)) {
document.body.className += " using-mobile-browser mobile ";
}
if(navigator.userAgent.match(/Mac/) && navigator.maxTouchPoints && navigator.maxTouchPoints > 2) {
document.body.className += " using-ios-device ";
}
if( !("ontouchstart" in window) ) {
var body = document.querySelector("body");
var winW = window.innerWidth;
var bodyW = body.clientWidth;
if (winW > bodyW + 4) {
body.setAttribute("style", "--scroll-bar-w: " + (winW - bodyW - 4) + "px");
} else {
body.setAttribute("style", "--scroll-bar-w: 0px");
}
}
})(window, document);
</script><a href="#ajax-content-wrap" class="nectar-skip-to-content">Skip to main content</a><div class="ocm-effect-wrap"><div class="ocm-effect-wrap-inner">
<div id="header-space" data-header-mobile-fixed="1" style="height: 64px;"></div>
<div id="header-outer" data-has-menu="true" data-has-buttons="no" data-header-button_style="hover_scale" data-using-pr-menu="true" data-mobile-fixed="1" data-ptnm="false" data-lhe="text_reveal" data-user-set-bg="#000000" data-format="centered-menu" data-permanent-transparent="false" data-megamenu-rt="0" data-remove-fixed="0" data-header-resize="0" data-cart="false" data-transparency-option="" data-box-shadow="large" data-shrink-num="6" data-using-secondary="0" data-using-logo="1" data-logo-height="50" data-m-logo-height="40" data-padding="20" data-full-width="false" data-condense="false" class="detached invisible scrolling">
<div id="search-outer" class="nectar">
<div id="search">
<div class="container">
<div id="search-box">
<div class="inner-wrap">
<div class="col span_12">
<form role="search" action="https://mintel.me/" method="GET">
<input type="text" name="s" id="s" value="" aria-label="Search" placeholder="Type what you're looking for">
<span>Hit enter to search or ESC to close</span>
<input type="hidden" name="post_type" value="post"> </form>
</div><!--/span_12-->
</div><!--/inner-wrap-->
</div><!--/search-box-->
<div id="close"><a href="#"><span class="screen-reader-text">Close Search</span>
<span class="close-wrap"> <span class="close-line close-line1"></span> <span class="close-line close-line2"></span> </span> </a></div>
</div><!--/container-->
</div><!--/search-->
</div><!--/search-outer-->
<header id="top">
<div class="container">
<div class="row">
<div class="col span_3">
<ul class="left-aligned-ocm" data-user-set="off"><li class="slide-out-widget-area-toggle small" data-icon-animation="simple-transform" data-custom-color="false"><div> <a href="#slide-out-widget-area" aria-label="Navigation Menu" aria-expanded="false" role="button" class="closed"> <span class="screen-reader-text">Menu</span><span aria-hidden="true"> <i class="lines-button x2" data-variant="even_lines"> <i class="lines"></i> </i> </span> </a> </div></li></ul> <a id="logo" href="../index.html" data-supplied-ml-starting-dark="false" data-supplied-ml-starting="false" data-supplied-ml="false">
<img class="stnd skip-lazy dark-version ls-is-cached br-loaded" src="../wp-content/uploads/2024/11/Logo-2-white.png" width="5102" height="1169" alt="Marc Mintel"> </a>
</div><!--/span_3-->
<div class="col span_9 col_last">
<div class="nectar-mobile-only mobile-header"><div class="inner"></div></div>
<div class="slide-out-widget-area-toggle mobile-icon slide-out-from-right-hover small" data-custom-color="false" data-icon-animation="simple-transform">
<div> <a href="#slide-out-widget-area" role="button" aria-label="Navigation Menu" aria-expanded="false" class="closed">
<span class="screen-reader-text">Menu</span><span aria-hidden="true"> <i class="lines-button x2" data-variant="even_lines"> <i class="lines"></i> </i> </span> </a></div>
</div>
<nav aria-label="Main Menu" style="display: none;">
<ul class="sf-menu sf-js-enabled sf-arrows">
<li id="menu-item-428" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home nectar-regular-menu-item menu-item-428"><a href="../index.html"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Home">Home</span></span></span></a></li>
<li id="menu-item-809" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-809"><a href="../blog/index.html"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Blog">Blog</span></span></span></a></li>
<li id="menu-item-561" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-561"><a href="../work/index.html"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Work">Work</span></span></span></a></li>
<li id="menu-item-498" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-498"><a href="../services/index.html"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Services">Services</span></span></span></a></li>
<li id="menu-item-552" class="menu-item menu-item-type-post_type menu-item-object-page nectar-regular-menu-item menu-item-552"><a href="../bio/index.html"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Bio">Bio</span></span></span></a></li>
</ul>
<ul class="buttons sf-menu" data-user-set-ocm="off">
<li id="menu-item-427" class="menu-item menu-item-type-custom menu-item-object-custom nectar-regular-menu-item menu-item-btn-style-button_extra-color-1 menu-item-hover-text-reveal menu-item-427"><a href="mailto:marc@mintel.me"><span class="menu-title-text"><span class="nectar-text-reveal-button"><span class="nectar-text-reveal-button__text" data-text="Contact Me">Contact Me</span></span></span></a></li>
</ul>
</nav>
<div class="logo-spacing" data-using-image="true"><img class="hidden-logo br-lazy" src="../wp-content/uploads/2024/11/Logo-2-white.png" alt="Marc Mintel" width="5102" height="1169"></div>
</div><!--/span_9-->
</div><!--/row-->
</div><!--/container-->
</header>
<div class="bg-color-stripe"></div></div>
<div id="ajax-content-wrap">
<div class="container-wrap no-sidebar" data-midnight="dark" data-remove-post-date="0" data-remove-post-author="0" data-remove-post-comment-number="0" style="padding-bottom: 0px;">
<div class="container main-content" style="--nectar-sticky-top-distance: 114px;">
<div class="row featured-media-under-header" data-animate="fade_in">
<div class="featured-media-under-header__content">
<div class="featured-media-under-header__cat-wrap">
<span class="meta-category nectar-inherit-label">
<a class="nectar-inherit-border-radius nectar-bg-hover-accent-color development" href="../development/index.html">Development</a></span> </div>
<h1 class="entry-title">What I love about Clean Architecture (and why I always end up regretting when I dont use it)</h1>
<div class="featured-media-under-header__meta-wrap nectar-link-underline-effect">
<span class="meta-author vcard author"><img class="avatar avatar-40 photo ls-is-cached br-loaded" src="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=40&amp;d=mm&amp;r=g" alt="Marc" data-brsrcset="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=80&amp;d=mm&amp;r=g 2x" height="40" width="40" decoding="async" srcset="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=80&amp;d=mm&amp;r=g 2x"><span><span class="fn nectar-inherit-label"><a href="../author/5fc2b097d603989b/index.html" title="Posts by Marc" rel="author">Marc</a></span> <span class="meta-date date updated">January 13, 2025</span></span></span> </div>
</div>
<div class="featured-media-under-header__featured-media" data-has-img="true" data-align="center" data-format="default">
<span class="post-featured-img page-header-bg-image"><img class="attachment-full size-full wp-post-image ls-is-cached br-loaded" src="../wp-content/uploads/2025/01/carbon-2.webp" width="1920" height="1125" alt="" decoding="async" data-brsrcset="https://mintel.me/wp-content/uploads/2025/01/carbon-2.webp 1920w, https://mintel.me/wp-content/uploads/2025/01/carbon-2-300x176.webp 300w, https://mintel.me/wp-content/uploads/2025/01/carbon-2-1024x600.webp 1024w, https://mintel.me/wp-content/uploads/2025/01/carbon-2-768x450.webp 768w, https://mintel.me/wp-content/uploads/2025/01/carbon-2-1536x900.webp 1536w" data-brsizes="(max-width: 1920px) 100vw, 1920px" sizes="(max-width: 1920px) 100vw, 1920px" srcset="../wp-content/uploads/2025/01/carbon-2.webp 1920w, ../wp-content/uploads/2025/01/carbon-2-300x176.webp 300w, ../wp-content/uploads/2025/01/carbon-2-1024x600.webp 1024w, ../wp-content/uploads/2025/01/carbon-2-768x450.webp 768w, ../wp-content/uploads/2025/01/carbon-2-1536x900.webp 1536w"></span> </div>
</div>
<div class="row">
<div class="post-area col span_12 col_last" role="main">
<article id="post-900" class="post-900 post type-post status-publish format-standard has-post-thumbnail category-development">
<div class="inner-wrap">
<div class="post-content" data-hide-featured-media="0">
<div class="content-inner">
<div id="fws_697dec8518c42" data-column-margin="default" data-midnight="dark" class="wpb_row vc_row-fluid vc_row top_margin_5pct bottom_margin_5pct" style="padding-top: 0px; padding-bottom: 0px; "><div class="row-bg-wrap" data-bg-animation="none" data-bg-animation-delay="" data-bg-overlay="false"><div class="inner-wrap row-bg-layer"><div class="row-bg viewport-desktop" style=""></div></div></div><div class="row_col_wrap_12 col span_12 dark left">
<div class="vc_col-sm-12 wpb_column column_container vc_column_container col no-extra-padding inherit_tablet inherit_phone " data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="" data-delay="0">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div class="wpb_text_column wpb_content_element ">
<div class="wpb_wrapper">
<h1 data-pm-slice="1 1 []">What I love about Clean Architecture (and why I always end up regretting when I dont use it)</h1>
<p>Ah, Clean Architecture—the holy grail of software structure, where your code doesnt just work, it <em>sings</em>. Well, at least until you decide to skip it on a small project, thinking, <em>“This is just a quick thing, I dont need to over-engineer it.”</em> Famous last words. Let me tell you why I love Clean Architecture, how it saved me from countless headaches, and why I always regret not applying it from day one.</p>
<h2>Decoupling core logic from external dependencies</h2>
<p>The core idea behind Clean Architecture is to keep your business logic—the heart of your application—independent of frameworks, databases, and other external services. You know, the stuff that loves to change.</p>
<p>Why? Because the moment you tie your core logic to an external dependency, youve made your app a ticking time bomb. Need to switch from MySQL to PostgreSQL? Boom. Want to swap out that third-party API? Good luck with that.</p>
<p>Clean Architecture makes your core logic oblivious to these changes. The business rules dont care whether youre using a fancy cloud database or a local SQLite file. They just do what theyre supposed to do.</p>
<h3>The Dependency Rule</h3>
<p>This rule is what makes Clean Architecture <em>clean</em>. Dependencies point inward, never outward. Your core logic should never know about external details like UI frameworks, databases, or other infrastructure. It keeps things neat, predictable, and easy to change.</p>
<div>
<hr>
</div>
<h2>Key Patterns in Clean Architecture</h2>
<h3>1. Use Case Pattern</h3>
<p>The Use Case represents a specific piece of business logic. It should handle only one action or process.</p>
<p><strong>Example:</strong> Lets say we need a <code>CreateOrder</code> use case:</p>
<pre><code>// ICreateOrderUseCase.ts (Interface)
export interface ICreateOrderUseCase {
execute(request: CreateOrderRequest): Promise&lt;OrderResponse&gt;;
}
// CreateOrderUseCase.ts (Implementation)
import { ICreateOrderUseCase } from './ICreateOrderUseCase';
import { IOrderRepository } from '../repositories/IOrderRepository';
export class CreateOrderUseCase implements ICreateOrderUseCase {
constructor(private orderRepository: IOrderRepository) {}
async execute(request: CreateOrderRequest): Promise&lt;OrderResponse&gt; {
const order = await this.orderRepository.create(request);
return { id: order.id, status: 'created' };
}
}</code></pre>
<p>Here, <code>CreateOrderUseCase</code> depends on the <code>IOrderRepository</code> interface, not on any specific database implementation.</p>
<h3>2. Repository Pattern</h3>
<p>Repositories handle data persistence. They abstract away the details of how data is stored and retrieved.</p>
<p><strong>Example:</strong></p>
<pre><code>// IOrderRepository.ts (Interface)
export interface IOrderRepository {
create(request: CreateOrderRequest): Promise&lt;Order&gt;;
findById(id: string): Promise&lt;Order | null&gt;;
}
// OrderRepository.ts (Implementation)
import { IOrderRepository } from './IOrderRepository';
import { Order } from '../entities/Order';
export class OrderRepository implements IOrderRepository {
async create(request: CreateOrderRequest): Promise&lt;Order&gt; {
// Simulate database interaction
const order = new Order(request.id, request.items);
// Save to DB (simulated)
return order;
}
async findById(id: string): Promise&lt;Order | null&gt; {
// Simulate DB lookup
return new Order(id, []);
}
}</code></pre>
<p>Repositories make it easy to switch from one data storage solution to another without affecting the core logic.</p>
<h3>3. Service Pattern</h3>
<p>Services handle domain-specific logic that doesnt belong to a specific entity or repository.</p>
<p><strong>Example:</strong></p>
<pre><code>// EmailService.ts
export class EmailService {
async sendOrderConfirmation(email: string, orderId: string): Promise&lt;void&gt; {
// Simulate sending an email
console.log(`Sending order confirmation to ${email} for order ${orderId}`);
}
}</code></pre>
<p>A service like <code>EmailService</code> can be injected into a use case to handle tasks like sending notifications.</p>
<div>
<hr>
</div>
<h2>Use Cases: My favorite topic at parties</h2>
<p>Seriously, I cant shut up about Use Cases.</p>
<p>Use Cases are the core operations of your app. They represent the things your app <em>does</em>. Each use case handles one specific piece of business logic. For example:</p>
<ul data-spread="false">
<li><strong>CreateOrderUseCase</strong>: Takes an order request and processes it.</li>
<li><strong>CancelSubscriptionUseCase</strong>: Handles subscription cancellations.</li>
</ul>
<p><strong>Example:</strong></p>
<pre><code>// CancelSubscriptionUseCase.ts
import { ISubscriptionRepository } from '../repositories/ISubscriptionRepository';
export class CancelSubscriptionUseCase {
constructor(private subscriptionRepository: ISubscriptionRepository) {}
async execute(subscriptionId: string): Promise&lt;void&gt; {
const subscription = await this.subscriptionRepository.findById(subscriptionId);
if (!subscription) throw new Error('Subscription not found');
subscription.cancel();
await this.subscriptionRepository.update(subscription);
}
}</code></pre>
<p>The beauty of Use Cases is their clarity. You know exactly where to look when something breaks. They make your codebase scream <em>“Im organized!”</em></p>
<div>
<hr>
</div>
<h2>Value Objects from DDD: The secret sauce</h2>
<p>I love mixing Value Objects from Domain-Driven Design (DDD) into my Clean Architecture. Why? Because they make your code <em>feel right</em>.</p>
<p><strong>Example:</strong></p>
<pre><code>// EmailAddress.ts
export class EmailAddress {
private readonly value: string;
constructor(email: string) {
if (!this.validate(email)) {
throw new Error('Invalid email format');
}
this.value = email;
}
private validate(email: string): boolean {
const emailRegex = /^[^@\s]+@[^@\s]+\.[^@\s]+$/;
return emailRegex.test(email);
}
toString(): string {
return this.value;
}
}</code></pre>
<p>Instead of passing around raw strings, you use <code>EmailAddress</code> objects that ensure valid data.</p>
<div>
<hr>
</div>
<h2>Why Clean Architecture is worth it</h2>
<p>In the end, Clean Architecture is all about making your life easier in the long run. Its about creating a codebase that you can change, extend, and maintain without tearing your hair out.</p>
<p>Sure, it takes discipline to set up. But the peace of mind it brings? Absolutely worth it.</p>
<p>So, next time youre tempted to skip Clean Architecture on a new project, remember this: Todays quick hack is tomorrows legacy nightmare. Choose wisely.</p>
</div>
</div>
</div>
</div>
</div>
</div></div>
</div>
</div><!--/post-content-->
</div><!--/inner-wrap-->
</article>
</div><!--/post-area-->
</div><!--/row-->
<div class="row">
<div data-n-parallax-bg="true" data-parallax-speed="subtle" data-post-header-style="image_under" class="blog_next_prev_buttons vc_row-fluid standard_section nectar-parallax-enabled" data-style="parallax_next_only" data-midnight="light"> <div class="parallax-layer-wrap"><div class="parallax-layer translate" style="height: 456.969px; will-change: transform; transform: translate3d(0px, 39.8877px, 0px) scale(1.005);"><div class="post-bg-img" style="background-image: url(https://mintel.me/wp-content/uploads/2025/01/carbon-1.webp);"></div></div></div>
<div class="col span_12 dark left">
<div class="inner">
<span><i class="next-prev-title nectar-blog-single-section-title nectar-inherit-h4">Next Post</i></span><a href="../why-i-abandoned-default-exports-completely/index.html" rel="prev"><h3>Why I abandoned default exports completely</h3></a> </div>
</div>
<span class="bg-overlay"></span>
<span class="full-link"><a href="../why-i-abandoned-default-exports-completely/index.html" rel="prev">Why I abandoned default exports completely</a></span>
</div>
<div class="row vc_row-fluid full-width-section related-post-wrap" data-using-post-pagination="true" data-midnight="dark"> <div class="row-bg-wrap"><div class="row-bg"></div></div> <h3 class="related-title nectar-blog-single-section-title nectar-inherit-h4 ">You May Also Like</h3><div class="row span_12 blog-recent related-posts columns-3" data-style="material" data-color-scheme="light">
<div class="col span_4">
<div class="inner-wrap post-959 post type-post status-publish format-standard has-post-thumbnail category-development">
<a href="../i-created-my-first-native-app-and-now-i-know-what-i-hate-about-web-development/index.html" class="img-link"><span class="post-featured-img img-loaded"><img class="nectar-lazy skip-lazy loaded br-loaded" src="../wp-content/uploads/2025/01/web-application-developer-desk-2023-11-27-04-49-45-utc-600x403.webp" data-breeze="https://mintel.me/wp-content/uploads/2025/01/web-application-developer-desk-2023-11-27-04-49-45-utc-600x403.webp" height="403" width="600" alt="" http%3a%2f%2fwww.w3.org%2f2000%2fsvg'%20viewbox%3d'0%200%20600%20403'%2f%3e"="" style=""></span></a>
<span class="meta-category"><a class="development" href="../development/index.html">Development</a></span>
<a class="entire-meta-link" href="../i-created-my-first-native-app-and-now-i-know-what-i-hate-about-web-development/index.html"><span class="screen-reader-text">I created my first native app and now I know what I hate about web development</span></a>
<div class="article-content-wrap">
<div class="post-header">
<span class="meta">
</span>
<h3 class="title">I created my first native app and now I know what I hate about web development</h3>
</div><!--/post-header-->
<div class="grav-wrap"><img class="avatar avatar-70 photo br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA3MCA3MCc+PC9zdmc+" data-breeze="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=70&amp;d=mm&amp;r=g" alt="Marc" data-brsrcset="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=140&amp;d=mm&amp;r=g 2x" height="70" width="70" decoding="async"><div class="text"> <a href="../author/5fc2b097d603989b/index.html">Marc</a><span>January 22, 2025</span></div></div> </div>
</div>
</div>
<div class="col span_4">
<div class="inner-wrap post-841 post type-post status-publish format-standard has-post-thumbnail category-video">
<a href="../speed-ramp-pro-a-lifesaver-for-davinci-resolve-editors/index.html" class="img-link"><span class="post-featured-img"><img class="nectar-lazy skip-lazy br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA2MDAgNDAzJz48L3N2Zz4=" data-breeze="https://mintel.me/wp-content/uploads/2025/01/CleanShot-2025-01-06-at-23.19.50@2x-600x403.webp" height="403" width="600" alt="" data-nectar-img-src="https://mintel.me/wp-content/uploads/2025/01/CleanShot-2025-01-06-at-23.19.50@2x-600x403.webp" http%3a%2f%2fwww.w3.org%2f2000%2fsvg'%20viewbox%3d'0%200%20600%20403'%2f%3e"="" style="height: 472.843px; width: 703.984px;"></span></a>
<span class="meta-category"><a class="video" href="../video/index.html">Video</a></span>
<a class="entire-meta-link" href="../speed-ramp-pro-a-lifesaver-for-davinci-resolve-editors/index.html"><span class="screen-reader-text">Speed Ramp Pro: A lifesaver for DaVinci Resolve editors</span></a>
<div class="article-content-wrap">
<div class="post-header">
<span class="meta">
</span>
<h3 class="title">Speed Ramp Pro: A lifesaver for DaVinci Resolve editors</h3>
</div><!--/post-header-->
<div class="grav-wrap"><img class="avatar avatar-70 photo br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA3MCA3MCc+PC9zdmc+" data-breeze="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=70&amp;d=mm&amp;r=g" alt="Marc" data-brsrcset="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=140&amp;d=mm&amp;r=g 2x" height="70" width="70" decoding="async"><div class="text"> <a href="../author/5fc2b097d603989b/index.html">Marc</a><span>January 6, 2025</span></div></div> </div>
</div>
</div>
<div class="col span_4">
<div class="inner-wrap post-906 post type-post status-publish format-standard has-post-thumbnail category-development">
<a href="../how-to-use-tdd-with-ai-to-save-money/index.html" class="img-link"><span class="post-featured-img"><img class="nectar-lazy skip-lazy br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA2MDAgNDAzJz48L3N2Zz4=" data-breeze="https://mintel.me/wp-content/uploads/2025/01/carbon-4-600x403.webp" height="403" width="600" alt="" data-nectar-img-src="https://mintel.me/wp-content/uploads/2025/01/carbon-4-600x403.webp" http%3a%2f%2fwww.w3.org%2f2000%2fsvg'%20viewbox%3d'0%200%20600%20403'%2f%3e"="" style="height: 472.843px; width: 703.984px;"></span></a>
<span class="meta-category"><a class="development" href="../development/index.html">Development</a></span>
<a class="entire-meta-link" href="../how-to-use-tdd-with-ai-to-save-money/index.html"><span class="screen-reader-text">How to use TDD with AI to save money</span></a>
<div class="article-content-wrap">
<div class="post-header">
<span class="meta">
</span>
<h3 class="title">How to use TDD with AI to save money</h3>
</div><!--/post-header-->
<div class="grav-wrap"><img class="avatar avatar-70 photo br-lazy" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA3MCA3MCc+PC9zdmc+" data-breeze="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=70&amp;d=mm&amp;r=g" alt="Marc" data-brsrcset="https://secure.gravatar.com/avatar/9995bf9c77ffc601663c67e2aa30cfd0?s=140&amp;d=mm&amp;r=g 2x" height="70" width="70" decoding="async"><div class="text"> <a href="../author/5fc2b097d603989b/index.html">Marc</a><span>January 30, 2025</span></div></div> </div>
</div>
</div>
</div></div>
<div class="comments-section" data-author-bio="false">
</div>
</div><!--/row-->
</div><!--/container main-content-->
</div><!--/container-wrap-->
<div class="nectar-social fixed visible" data-position="" data-rm-love="0" data-color-override="override"><a href="#"><i class="icon-default-style steadysets-icon-share"></i></a><div class="nectar-social-inner"><a class="facebook-share nectar-sharing" href="#" title="Share this"> <i class="fa fa-facebook"></i> <span class="social-text">Share</span> </a><a class="twitter-share nectar-sharing" href="#" title="Share this"> <i class="fa icon-salient-x-twitter"></i> <span class="social-text">Share</span> </a><a class="linkedin-share nectar-sharing" href="#" title="Share this"> <i class="fa fa-linkedin"></i> <span class="social-text">Share</span> </a><a class="pinterest-share nectar-sharing" href="#" title="Pin this"> <i class="fa fa-pinterest"></i> <span class="social-text">Pin</span> </a></div></div><style>
.nectar-shape-divider-wrap {
position: absolute;
top: auto;
bottom: 0;
left: 0;
right: 0;
width: 100%;
height: 150px;
z-index: 3;
transform: translateZ(0);
}
.post-area.span_9 .nectar-shape-divider-wrap {
overflow: hidden;
}
.nectar-shape-divider-wrap[data-front="true"] {
z-index: 50;
}
.nectar-shape-divider-wrap[data-style="waves_opacity"] svg path:first-child {
opacity: 0.6;
}
.nectar-shape-divider-wrap[data-style="curve_opacity"] svg path:nth-child(1),
.nectar-shape-divider-wrap[data-style="waves_opacity_alt"] svg path:nth-child(1) {
opacity: 0.15;
}
.nectar-shape-divider-wrap[data-style="curve_opacity"] svg path:nth-child(2),
.nectar-shape-divider-wrap[data-style="waves_opacity_alt"] svg path:nth-child(2) {
opacity: 0.3;
}
.nectar-shape-divider {
width: 100%;
left: 0;
bottom: -1px;
height: 100%;
position: absolute;
}
.nectar-shape-divider-wrap.no-color .nectar-shape-divider {
fill: #fff;
}
@media only screen and (max-width: 999px) {
.nectar-shape-divider-wrap:not([data-using-percent-val="true"]) .nectar-shape-divider {
height: 75%;
}
.nectar-shape-divider-wrap[data-style="clouds"]:not([data-using-percent-val="true"]) .nectar-shape-divider {
height: 55%;
}
}
@media only screen and (max-width: 690px) {
.nectar-shape-divider-wrap:not([data-using-percent-val="true"]) .nectar-shape-divider {
height: 33%;
}
.nectar-shape-divider-wrap[data-style="clouds"]:not([data-using-percent-val="true"]) .nectar-shape-divider {
height: 33%;
}
}
#ajax-content-wrap .nectar-shape-divider-wrap[data-height="1"] .nectar-shape-divider,
#ajax-content-wrap .nectar-shape-divider-wrap[data-height="1px"] .nectar-shape-divider {
height: 1px;
}.nectar-shape-divider-wrap[data-position="top"] {
top: -1px;
bottom: auto;
}
.nectar-shape-divider-wrap[data-position="top"] {
transform: rotate(180deg)
}#ajax-content-wrap .vc_row.inner_row.right_padding_20pct .row_col_wrap_12_inner,
.nectar-global-section .vc_row.inner_row.right_padding_20pct .row_col_wrap_12_inner {
padding-right: 20%;
} .wpb_column.border_style_solid > .vc_column-inner,
.wpb_column.border_style_solid > .n-sticky > .vc_column-inner {
border-style: solid;
}@media only screen and (min-width: 1000px) {
.nectar-highlighted-text.font_size_3vw h1,
.nectar-highlighted-text.font_size_3vw h2,
.nectar-highlighted-text.font_size_3vw h3,
.nectar-highlighted-text.font_size_3vw h4,
.nectar-highlighted-text.font_size_3vw h5,
.nectar-highlighted-text.font_size_3vw h6,
.nectar-highlighted-text.font_size_3vw p {
font-size: 3vw;
line-height: 1.1em;
}}
.nectar-highlighted-text[data-style="regular_underline"].font_size_3vw em:before,
.nectar-highlighted-text[data-style="half_text"].font_size_3vw em:before {
bottom: 0.07em;
}@keyframes nectarStrokeAnimation {
0% {
stroke-dashoffset: 1;
opacity: 0;
}
1% {
opacity: 1;
}
100% {
stroke-dashoffset: 0;
}
}.nectar-highlighted-text .nectar-scribble {
position: absolute;
left: 0;
top: 0;
z-index: -1;
}
.nectar-highlighted-text .nectar-scribble path {
stroke-dasharray: 1;
stroke-dashoffset: 1;
opacity: 0;
}
.nectar-highlighted-text em.animated .nectar-scribble path {
stroke-linecap: round;
opacity: 1;
animation: nectarStrokeAnimation 1.3s cubic-bezier(0.65,0,0.35,1) forwards;
}
.nectar-highlighted-text[data-style="scribble"] em {
background-image: none!important;
}body .nectar-scribble.circle {
width: 130%;
height: 140%;
top: -20%;
left: -15%;
}@media only screen and (max-width: 999px) {
.nectar-cta.display_tablet_inherit {
display: inherit;
}
}@media only screen and (max-width: 999px) { .vc_row.bottom_padding_tablet_20pct {
padding-bottom: 20%!important;
} }@media only screen and (max-width: 999px) { .vc_row.top_padding_tablet_10pct {
padding-top: 10%!important;
} }@media only screen and (max-width: 999px) { .vc_row.bottom_padding_tablet_10pct {
padding-bottom: 10%!important;
} }@media only screen and (max-width: 999px) { .vc_row.top_padding_tablet_20pct {
padding-top: 20%!important;
} }@media only screen and (max-width: 690px) {
.nectar-cta.display_phone_inherit {
display: inherit;
}
}</style><div class="nectar-global-section nectar_hook_global_section_footer"><div class="container normal-container row">
<div id="fws_697dec851fdff" data-column-margin="default" data-midnight="light" data-top-percent="10%" data-bottom-percent="5%" class="wpb_row vc_row-fluid vc_row full-width-section top_padding_tablet_20pct bottom_padding_tablet_10pct" style="padding-top: calc(100vw * 0.10); padding-bottom: calc(100vw * 0.05); "><div class="row-bg-wrap" data-bg-animation="none" data-bg-animation-delay="" data-bg-overlay="false"><div class="inner-wrap row-bg-layer"><div class="row-bg viewport-desktop using-bg-color" style="background-color: #000000; "></div></div></div><div class="row_col_wrap_12 col span_12 light left">
<div class="vc_col-sm-12 wpb_column column_container vc_column_container col no-extra-padding inherit_tablet inherit_phone " data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="" data-delay="0">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div id="fws_697dec85240e8" data-midnight="" data-column-margin="default" class="wpb_row vc_row-fluid vc_row inner_row right_padding_20pct" style=""><div class="row-bg-wrap"> <div class="row-bg"></div> </div><div class="row_col_wrap_12_inner col span_12 left">
<div class="vc_col-sm-12 wpb_column column_container vc_column_container col child_column no-extra-padding inherit_tablet inherit_phone " data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="" data-delay="0">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div class="nectar-highlighted-text font_size_3vw " data-style="scribble" data-exp="default" data-using-custom-color="false" data-animation-delay="false" data-color="" data-color-gradient="" style=""><h2>Dont wait any longer, <em>transform<svg class="nectar-scribble circle" role="presentation" viewBox="0 0 800 350" preserveAspectRatio="none"><path style="animation-duration: 1.8s;" transform="matrix(0.9791300296783447,0,0,0.9791300296783447,400,179)" stroke-linejoin="miter" fill-opacity="0" pathLength="1" stroke-miterlimit="4" stroke="#2365ff" stroke-opacity="1" stroke-width="8" d=" M253,-161 C253,-161 -284.78900146484375,-201.4600067138672 -376,-21 C-469,163 67.62300109863281,174.2100067138672 256,121 C564,34 250.82899475097656,-141.6929931640625 19.10700035095215,-116.93599700927734"></path></svg></em> your product visuals now.</h2>
</div>
</div>
</div>
</div>
</div></div>
</div>
</div>
</div>
</div></div>
<div id="fws_697dec85259de" data-column-margin="default" data-midnight="light" data-top-percent="5%" data-bottom-percent="10%" class="wpb_row vc_row-fluid vc_row full-width-section top_padding_tablet_10pct bottom_padding_tablet_20pct" style="padding-top: calc(100vw * 0.05); padding-bottom: calc(100vw * 0.10); "><div class="row-bg-wrap" data-bg-animation="none" data-bg-animation-delay="" data-bg-overlay="false"><div class="inner-wrap row-bg-layer"><div class="row-bg viewport-desktop using-bg-color" style="background-color: #000000; "></div></div></div><div class="nectar-shape-divider-wrap " style=" height:1px;" data-height="1" data-front="" data-style="straight_section" data-position="top"><svg class="nectar-shape-divider" aria-hidden="true" fill="#5b5b5b" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 10" preserveAspectRatio="none"> <polygon points="104 10, 104 0, 0 0, 0 10"></polygon> </svg></div><div class="row_col_wrap_12 col span_12 light left">
<div class="vc_col-sm-12 wpb_column column_container vc_column_container col no-extra-padding inherit_tablet inherit_phone border_style_solid " data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="" data-delay="0">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div id="fws_697dec852637d" data-midnight="" data-column-margin="default" class="wpb_row vc_row-fluid vc_row inner_row vc_row-o-equal-height vc_row-flex vc_row-o-content-top" style=""><div class="row-bg-wrap"> <div class="row-bg"></div> </div><div class="row_col_wrap_12_inner col span_12 left">
<div class="vc_col-sm-6 vc_col-md-6 wpb_column column_container vc_column_container col child_column has-animation no-extra-padding inherit_tablet inherit_phone " data-t-w-inherits="small_desktop" data-padding-pos="all" data-has-bg-color="false" data-bg-color="" data-bg-opacity="1" data-animation="fade-in-from-bottom" data-delay="0">
<div class="vc_column-inner">
<div class="wpb_wrapper">
<div class="wpb_text_column wpb_content_element ">
<div class="wpb_wrapper">
<h5>Get in touch</h5>
</div>
</div>
<div class="nectar-cta alignment_tablet_default alignment_phone_default display_tablet_inherit display_phone_inherit " data-color="default" data-using-bg="false" data-display="block" data-style="underline" data-alignment="left" data-text-color="std"><h4> <span class="link_wrap"><a class="link_text" role="button" href="mailto:marc@mintel.me">marc@mintel.me</a></span></h4></div>
</div>
</div>
</div>
</div></div>
</div>
</div>
</div>
</div></div>
</div></div>
<div id="footer-outer" data-midnight="light" data-cols="4" data-custom-color="false" data-disable-copyright="true" data-matching-section-color="true" data-copyright-line="false" data-using-bg-img="false" data-bg-img-overlay="0.8" data-full-width="false" data-using-widget-area="false" data-link-hover="default">
</div><!--/footer-outer-->
<div class="slide-out-widget-area-toggle slide-out-hover-icon-effect small" data-icon-animation="simple-transform"><div> <a href="#slide-out-widget-area" role="button" class="closed"> <span> <span class="screen-reader-text">Menu</span> <i class="lines-button x2" role="none"> <i class="lines"></i> </i> </span> </a> </div> </div>
</div> <!--/ajax-content-wrap-->
</div></div><div id="slide-out-widget-area" class="slide-out-from-right-hover" data-dropdown-func="separate-dropdown-parent-link" data-back-txt="Back">
<div class="inner-wrap">
<div class="inner" data-prepend-menu-mobile="false">
<a class="slide_out_area_close" href="#"><span class="screen-reader-text">Close Menu</span>
<span class="close-wrap"> <span class="close-line close-line1"></span> <span class="close-line close-line2"></span> </span> </a>
<div class="off-canvas-menu-container" role="navigation">
<ul class="menu">
<li id="menu-item-483" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-483"><a href="../index.html">Home</a></li>
<li id="menu-item-497" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-497"><a href="../services/index.html">Services</a></li>
</ul>
</div>
</div>
<div class="bottom-meta-wrap"><ul class="off-canvas-social-links"><li><a target="_blank" rel="noopener noreferrer" href="https://www.linkedin.com/in/marc-mintel-03b193134/"><span class="screen-reader-text">linkedin</span><i class="fa fa-linkedin"></i></a></li><li><a target="_blank" rel="noopener noreferrer" href="https://github.com/mmintel"><span class="screen-reader-text">github</span><i class="fa fa-github-alt"></i></a></li><li><a target="_blank" rel="noopener noreferrer" href="https://instagram.com/marcmintel"><span class="screen-reader-text">instagram</span><i class="fa fa-instagram"></i></a></li><li><a target="_blank" rel="noopener noreferrer" href="https://wa.me/491707777093?text=Hey%20there%2C%20got%20your%20number%20from%20your%20website.%20I%20just%20wanted%20to%20ask%20if..."><span class="screen-reader-text">whatsapp</span><i class="fa fa-whatsapp"></i></a></li><li><a target="_blank" rel="noopener noreferrer" href="mailto:marc@mintel.me"><span class="screen-reader-text">email</span><i class="fa fa-envelope"></i></a></li></ul></div><!--/bottom-meta-wrap--></div> <!--/inner-wrap-->
</div><div id="slide-out-widget-area-bg" class="slide-out-from-right-hover dark">
</div><!--/ocm-effect-wrap--> <script>
(function () {
const isMatchingClass = (linkRule, href, classes) => {
return classes.includes(linkRule.value)
}
const isMatchingDomain = (linkRule, href, classes) => {
if(!URL.canParse(href)) {
return false
}
const url = new URL(href)
return linkRule.value === url.host
}
const isMatchingExtension = (linkRule, href, classes) => {
if(!URL.canParse(href)) {
return false
}
const url = new URL(href)
return url.pathname.endsWith('.' + linkRule.value)
}
const isMatchingSubdirectory = (linkRule, href, classes) => {
if(!URL.canParse(href)) {
return false
}
const url = new URL(href)
return url.pathname.startsWith('/' + linkRule.value + '/')
}
const isMatchingProtocol = (linkRule, href, classes) => {
if(!URL.canParse(href)) {
return false
}
const url = new URL(href)
return url.protocol === linkRule.value + ':'
}
const isMatch = (linkRule, href, classes) => {
switch (linkRule.type) {
case 'class':
return isMatchingClass(linkRule, href, classes)
case 'domain':
return isMatchingDomain(linkRule, href, classes)
case 'extension':
return isMatchingExtension(linkRule, href, classes)
case 'subdirectory':
return isMatchingSubdirectory(linkRule, href, classes)
case 'protocol':
return isMatchingProtocol(linkRule, href, classes)
default:
return false;
}
}
const track = (element) => {
const href = element.href ?? null
const classes = Array.from(element.classList)
const parentsToMatch = [
'li.menu-item', // Non-block menu item
'li.wp-block-navigation-item', // Block menu item
'div.wp-block-button', // Block button group
]
// When a WordPress menu or button allows a user customizable class, the class is
// placed on a parent element instead of the button/a. If the parent matches one
// of these elements, then it's classes should also be considered.
if(parentsToMatch.some((toMatch) => element.parentElement.matches(toMatch))) {
classes.push(...Array.from(element.parentElement.classList))
}
const linkRules = [{"type":"extension","value":"pdf"},{"type":"extension","value":"zip"},{"type":"protocol","value":"mailto"},{"type":"protocol","value":"tel"}]
if(linkRules.length === 0) {
return
}
const hasMatch = linkRules.some((linkRule) => {
return isMatch(linkRule, href, classes)
})
if(!hasMatch) {
return
} else {
}
const url = "https://mintel.me/wp-content/uploads/iawp-click-endpoint.php";
const body = {
href: href,
classes: classes.join(' '),
...{"payload":{"resource":"singular","singular_id":900,"page":1},"signature":"ad0e479684ea668174035256146fe2a4"} };
if (navigator.sendBeacon) {
let blob = new Blob([JSON.stringify(body)], {
type: "application/json"
});
navigator.sendBeacon(url, blob);
} else {
const xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(JSON.stringify(body))
}
}
document.addEventListener('mousedown', function (event) {
if (navigator.webdriver || /bot|crawler|spider|crawling|semrushbot|chrome-lighthouse/i.test(navigator.userAgent)) {
return;
}
const element = event.target.closest('a')
if(!element) {
return
}
const isPro = true
if(!isPro) {
return
}
// Don't track left clicks with this event. The click event is used for that.
if(event.button === 0) {
return
}
track(element)
})
document.addEventListener('click', function (event) {
if (navigator.webdriver || /bot|crawler|spider|crawling|semrushbot|chrome-lighthouse/i.test(navigator.userAgent)) {
return;
}
const element = event.target.closest('a, button')
if(!element) {
return
}
const isPro = true
if(!isPro) {
return
}
track(element)
})
document.addEventListener("DOMContentLoaded", function (e) {
if (document.hasOwnProperty("visibilityState") && document.visibilityState === "prerender") {
return;
}
if (navigator.webdriver || /bot|crawler|spider|crawling|semrushbot|chrome-lighthouse/i.test(navigator.userAgent)) {
return;
}
let referrer_url = null;
if (typeof document.referrer === 'string' && document.referrer.length > 0) {
referrer_url = document.referrer;
}
const params = location.search.slice(1).split('&').reduce((acc, s) => {
const [k, v] = s.split('=');
return Object.assign(acc, {[k]: v});
}, {});
const url = "https://mintel.me/wp-json/iawp/search";
const body = {
referrer_url,
utm_source: params.utm_source,
utm_medium: params.utm_medium,
utm_campaign: params.utm_campaign,
utm_term: params.utm_term,
utm_content: params.utm_content,
gclid: params.gclid,
...{"payload":{"resource":"singular","singular_id":900,"page":1},"signature":"ad0e479684ea668174035256146fe2a4"} };
if (navigator.sendBeacon) {
let blob = new Blob([JSON.stringify(body)], {
type: "application/json"
});
navigator.sendBeacon(url, blob);
} else {
const xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(JSON.stringify(body))
}
});
})();
</script>
<script type="text/html" id="wpb-modifications"> window.wpbCustomElement = 1; </script><link data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" data-noptimize="" rel="stylesheet" id="main-styles-non-critical-css" href="../wp-content/themes/salient/css/build/style-non-critical.css" type="text/css" media="all">
<link rel="stylesheet" id="font-awesome-css" href="../wp-content/themes/salient/css/font-awesome.min.css" type="text/css" media="all">
<link data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" data-noptimize="" rel="stylesheet" id="fancyBox-css" href="../wp-content/themes/salient/css/build/plugins/jquery.fancybox.css" type="text/css" media="all">
<link rel="stylesheet" id="nectar-smooth-scroll-css" href="../wp-content/themes/salient/css/build/plugins/lenis.css" type="text/css" media="all">
<link data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" data-noptimize="" rel="stylesheet" id="nectar-ocm-core-css" href="../wp-content/themes/salient/css/build/off-canvas/core.css" type="text/css" media="all">
<link data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" data-noptimize="" rel="stylesheet" id="nectar-ocm-slide-out-right-hover-css" href="../wp-content/themes/salient/css/build/off-canvas/slide-out-right-hover.css" type="text/css" media="all">
<script type="text/javascript" src="../wp-content/plugins/device-wrapper/src/js/simplebar.min.js" id="device_wrapper-simplebar-js"></script>
<script type="text/javascript" src="../wp-content/plugins/device-wrapper/src/js/dragscroll.js" id="device_wrapper-dragscroll-js"></script>
<script type="text/javascript" src="../wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="../wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="../wp-content/plugins/device-wrapper/dist/front.build.js" id="device_wrapper-front-js-js"></script>
<script type="text/javascript" id="salient-social-js-extra">
/* <![CDATA[ */
var nectarLove = {"ajaxurl":"https:\/\/mintel.me\/wp-admin\/admin-ajax.php","postID":"900","rooturl":"https:\/\/mintel.me","loveNonce":"a1146a4fb8"};
/* ]]> */
</script>
<script type="text/javascript" src="../wp-content/plugins/salient-social/js/salient-social.js" id="salient-social-js"></script>
<script data-wpacu-skip="" data-no-optimize="" data-salient-delayed-js-loaded="true" type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/jquery.easing.min.js" id="jquery-easing-js"></script>
<script data-wpacu-skip="" data-no-optimize="" data-salient-delayed-js-loaded="true" type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/jquery.mousewheel.min.js" id="jquery-mousewheel-js"></script>
<script type="text/javascript" src="../wp-content/themes/salient/js/build/priority.js" id="nectar_priority-js"></script>
<script type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/transit.min.js" id="nectar-transit-js"></script>
<script data-wpacu-skip="" data-no-optimize="" data-salient-delayed-js-loaded="true" type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/waypoints.js" id="nectar-waypoints-js"></script>
<script type="text/javascript" src="../wp-content/plugins/salient-portfolio/js/third-party/imagesLoaded.min.js" id="imagesLoaded-js"></script>
<script data-wpacu-skip="" data-no-optimize="" data-salient-delayed-js-loaded="true" type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/hoverintent.min.js" id="hoverintent-js"></script>
<script type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/jquery.fancybox.js" id="fancyBox-js"></script>
<script type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/anime.min.js" id="anime-js"></script>
<script data-wpacu-skip="" data-no-optimize="" data-salient-delayed-js-loaded="true" type="text/javascript" src="../wp-content/themes/salient/js/build/third-party/superfish.js" id="superfish-js"></script>
<script type="text/javascript" id="nectar-frontend-js-extra">
/* <![CDATA[ */
var nectarLove = {"ajaxurl":"https:\/\/mintel.me\/wp-admin\/admin-ajax.php","postID":"900","rooturl":"https:\/\/mintel.me","disqusComments":"false","loveNonce":"a1146a4fb8","mapApiKey":""};
var nectarOptions = {"delay_js":"1","smooth_scroll":"true","smooth_scroll_strength":"50","quick_search":"false","react_compat":"disabled","header_entrance":"false","body_border_func":"default","body_border_mobile":"0","dropdown_hover_intent":"default","simplify_ocm_mobile":"0","mobile_header_format":"centered-menu","ocm_btn_position":"left","left_header_dropdown_func":"default","ajax_add_to_cart":"0","ocm_remove_ext_menu_items":"remove_images","woo_product_filter_toggle":"0","woo_sidebar_toggles":"true","woo_sticky_sidebar":"0","woo_minimal_product_hover":"default","woo_minimal_product_effect":"default","woo_related_upsell_carousel":"false","woo_product_variable_select":"default","woo_using_cart_addons":"false","view_transitions_effect":"gradient-wipe"};
var nectar_front_i18n = {"menu":"Menu","next":"Next","previous":"Previous","close":"Close"};
/* ]]> */
</script>
<script data-wpacu-skip="" data-no-optimize="" data-salient-delayed-js-loaded="true" type="text/javascript" src="../wp-content/themes/salient/js/build/init.js" id="nectar-frontend-js"></script>
<script type="text/javascript" src="../wp-content/themes/salient/js/build/nectar-smooth-scroll.js" id="nectar-smooth-scroll-js"></script>
<script data-wpacu-skip="" data-no-optimize="" data-salient-delayed-js-loaded="true" type="text/javascript" src="../wp-content/plugins/salient-core/js/third-party/touchswipe.min.js" id="touchswipe-js"></script>
<script type="text/javascript" src="../wp-content/plugins/breeze/assets/js/js-front-end/breeze-lazy-load.min.js" id="breeze-lazy-js"></script>
<script type="text/javascript" id="breeze-lazy-js-after">
/* <![CDATA[ */
document.querySelectorAll('img[data-breeze]').forEach(img=>{if(img.getBoundingClientRect().top<=window.innerHeight){img.src=img.getAttribute('data-breeze');img.removeAttribute('data-breeze')}});
/* ]]> */
</script>
<script data-wpacu-skip="" data-no-optimize="" data-salient-delayed-js-loaded="true" type="text/javascript" src="../wp-content/plugins/js_composer_salient/assets/js/dist/js_composer_front.min.js" id="wpb_composer_front_js-js"></script>
<script data-pagespeed-no-defer="" data-nowprocket="" data-wpacu-skip="" data-no-optimize="" type="text/javascript" src="../wp-content/themes/salient/js/build/nectar-delay-javascript.js" id="salient-delay-js-js"></script>
<script></script>
</body></html><!-- Cache served by breeze CACHE - Last modified: Sat, 31 Jan 2026 11:50:29 GMT -->