PageSourceSearch

https://www.msec.it/blog/playing-with-image-generative-ai/

html msec.it collected 2026-09-25 21:24:23 UTC 25,720 bytes, 280 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en-US">
3<head>
4<meta charset="UTF-8">
5<meta name="viewport" content="width=device-width, initial-scale=1">
6
7
8
9<title>Playing with image generative AI – Raw material</title>
10<meta name="robots" content="max-image-preview:large">
11	<style>img:is([sizes="auto" i], [sizes^="auto," i]) { contain-intrinsic-size: 3000px 1500px }</style>
12	<link rel="dns-prefetch" href="//fonts.googleapis.com">
13
14
15
16<link rel="stylesheet" id="bootstrap-css" href="https://www.msec.it/blog/wp-content/themes/astrid/css/bootstrap/bootstrap.min.css" type="text/css" media="all">
17<link rel="stylesheet" id="wp-block-library-css" href="https://www.msec.it/blog/wp-includes/css/dist/block-library/style.min.css" type="text/css" media="all">
18<style id="classic-theme-styles-inline-css" type="text/css">
19/*! This file is auto-generated */
20.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
21</style>
22<style id="global-styles-inline-css" type="text/css">
23: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%);
23--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);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}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;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.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;}
23.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;}
24:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
25:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
26:root :where(.wp-block-pullquote){font-size: 1.5em;line-height: 1.6;}
27</style>
28<link rel="stylesheet" id="astrid-style-css" href="https://www.msec.it/blog/wp-content/themes/astrid/style.css" type="text/css" media="all">
29<style id="astrid-style-inline-css" type="text/css">
30.site-header {position: fixed;}
31.woocommerce .woocommerce-message:before,.woocommerce #payment #place_order,.woocommerce-page #payment #place_order,.woocommerce .cart .button, .woocommerce .cart input.button,.woocommerce-cart .wc-proceed-to-checkout a.checkout-button,.woocommerce #review_form #respond .form-submit input,.woocommerce a.button,.woocommerce div.product form.cart .button,.woocommerce .star-rating,.page-header .page-title .fa,.site-footer a:hover,.footer-info a:hover,.footer-widgets a:hover,.testimonial-title a:hover,.employee-title a:hover,.fact .fa,.service-title a:hover,.widget-area .widget a:hover,.entry-meta a:hover,.entry-footer a:hover,.entry-title a:hover,.comment-navigation a:hover,.posts-navigation a:hover,.post-navigation a:hover,.main-navigation a:hover,.main-navigation li.focus > a,a,a:hover,button,.button,input[type="button"],input[type="reset"],input[type="submit"] { color:#9b8400}
32.social-menu-widget a,.woocommerce span.onsale,.woocommerce #payment #place_order:hover, .woocommerce-page #payment #place_order:hover,.woocommerce .cart .button:hover, .woocommerce .cart input.button:hover,.woocommerce-cart .wc-proceed-to-checkout a.checkout-button:hover,.woocommerce #review_form #respond .form-submit input
32:hover,.woocommerce div.product form.cart .button:hover,.woocommerce a.button:hover,.preloader-inner ul li,.progress-animate,button:hover,.button:hover,input[type="button"]:hover,input[type="reset"]:hover,input[type="submit"]:hover { background-color:#9b8400}
33.woocommerce .woocommerce-message,.woocommerce #payment #place_order,.woocommerce-page #payment #place_order,.woocommerce .cart .button, .woocommerce .cart input.button,.woocommerce-cart .wc-proceed-to-checkout a.checkout-button,.woocommerce #review_form #respond .form-submit input,.woocommerce a.button,.woocommerce div.product form.cart .button,.main-navigation li a::after,.main-navigation li a::before,button,.button,input[type="button"],input[type="reset"],input[type="submit"] { border-color:#9b8400}
34.site-title a,.site-title a:hover { color:#ffffff}
35.site-description { color:#BDBDBD}
36.site-header,.site-header.header-scrolled { background-color:rgba(32,37,41,0.9)}
37@media only screen and (max-width: 1024px) { .site-header.has-header,.site-header.has-video,.site-header.has-single,.site-header.has-shortcode { background-color:rgba(32,37,41,0.9)} }
38body, .widget-area .widget, .widget-area .widget a { color:#656D6D}
39.footer-widgets, .site-footer, .footer-info { background-color:#202529}
40body {font-family: 'Open Sans', sans-serif;}
41h1, h2, h3, h4, h5, h6, .fact .fact-number, .fact .fact-name, .site-title {font-family: 'Josefin Sans', sans-serif;}
42.site-title { font-size:36px; }
43.site-description { font-size:14px; }
44h1 { font-size:36px; }
45h2 { font-size:30px; }
46h3 { font-size:24px; }
47h4 { font-size:16px; }
48h5 { font-size:14px; }
49h6 { font-size:12px; }
50body { font-size:14px; }
51
52</style>
53<link rel="stylesheet" id="astrid-body-fonts-css" href="//fonts.googleapis.com/css?family=Open+Sans%3A300%2C300italic%2C600%2C600italic&ver=6.8.1" type="text/css" media="all">
54<link rel="stylesheet" id="astrid-headings-fonts-css" href="//fonts.googleapis.com/css?family=Josefin+Sans%3A300italic%2C300&ver=6.8.1" type="text/css" media="all">
55<link rel="stylesheet" id="font-awesome-css" href="https://www.msec.it/blog/wp-content/themes/astrid/fonts/font-awesome.min.css" type="text/css" media="all">
56<link rel="stylesheet" id="enlighterjs-css" href="https://www.msec.it/blog/wp-content/plugins/enlighter/cache/enlighterjs.min.css" type="text/css" media="all">
57<script type="text/javascript" src="https://www.msec.it/blog/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
vendor: 1 bytes, line 57
57
58<script type="text/javascript" src="https://www.msec.it/blog/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
58
59
60
61
62
63
64
65<style type="text/css" id="custom-background-css">
66body.custom-background { background-color: #ffffff; }
67</style>
68			<style type="text/css" id="wp-custom-css">
69			/* .site-info.container {
70	display: none;
71} */
72
73.wp-custom-header-video-button {
74	display: none;
75}
76
77@media only screen and (min-width: 1024px) {
78	div#wp-custom-header:before {
79    content: 'A master in the art of living \a draws no sharp distinction \a between his work and his play, \a his labour and his leisure, \a his mind and his body, \a his education and his recreation. \a He hardly knows which is which. \a He simply pursues his vision of excellence \a through whatever he is doing \a and leaves others to determine \a whether he is working or playing. \a To himself he always seems to be doing both. \a Enough for him that he does it well. \a \a Lawrence Pearsall Jacks, 1932';
80    position: absolute;
81    top: 50%;
82		left: 50%;
83		font-size: 1vw;
84    color: lightgray;
85    transform: translate(-50%, -50%);
86	  margin-top: 1vw;
87  	margin-left: 20vw;
88    white-space: pre;
89	background-color: rgba(0,0,0,0.7);
90		padding: 2vw;
91	font-style: italic;
92	text-align: right;
93}
94}
95
96.hentry {
97	border: none;
98}
99
100.widget-area .widget {
101	border: none;
102}
103
104.site-content > .container {
105	border: none;
106}
107
108.comment-respond {
109	border: none;
110}		</style>
111		</head>
112
113<body class="wp-singular post-template-default single single-post postid-1134 single-format-standard custom-background wp-theme-astrid">
114
115<div class="preloader">
116<div class="preloader-inner">
117	<ul><li><li><li><li><li><li></ul>
118</div>
119</div>
120
121<div id="page" class="site">
122	<a class="skip-link screen-reader-text" href="#content">Skip to content</a>
123
124	<header id="masthead" class="site-header " role="banner">
125		<div class="container">
126			<div class="site-branding col-md-4 col-sm-6 col-xs-12">
127				<p class="site-title"><a href="https://www.msec.it/blog/" rel="home">Raw material</a></p><p class="site-description">Software development ideas, not refined.</p>			</div>
128			<div class="btn-menu col-md-8 col-sm-6 col-xs-12"><i class="fa fa-navicon"></i></div>
129			<nav id="mainnav" class="main-navigation col-md-8 col-sm-6 col-xs-12" role="navigation">
130				<div class="menu-other-pages-container"><ul id="primary-menu" class="menu"><li id="menu-item-954" class="menu-item menu-item-type-post_type menu-item-object-page current_page_parent menu-item-954"><a href="https://www.msec.it/blog/posts/">Blog posts</a></li>
131<li id="menu-item-1122" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-1122"><a href="https://www.msec.it/blog/duel-times/">Duel Times</a></li>
132</ul></div>			</nav>
133		</div>
134	</header>
135
136			<div class="header-clone"></div>
137		
138
139				
140	
141	<div id="content" class="site-content">
142		<div class="container">
143	<div id="primary" class="content-area">
144		<main id="main" class="site-main" role="main">
145
146		
147<article id="post-1134" class="post-1134 post type-post status-publish format-standard hentry category-projects category-dev clearfix">
148
149
150	<header class="entry-header">
151		<h1 class="entry-title">Playing with image generative AI</h1>		<div class="entry-meta">
152			<span class="posted-on"><i class="fa fa-calendar"></i><a href="https://www.msec.it/blog/playing-with-image-generative-ai/" rel="bookmark"><time class="entry-date published" datetime="2025-05-04T21:09:56+02:00">May 4, 2025</time><time class="updated" datetime="2025-05-04T21:59:53+02:00">May 4, 2025</time></a></span><span class="byline"> <i class="fa fa-user"></i><span class="author vcard"><a class="url fn n" href="https://www.msec.it/blog/author/admin/">Emanuele</a></span></span><span class="cat-links"><i class="fa fa-folder-o"></i><a href="https://www.msec.it/blog/category/projects/" rel="category tag">Projects</a>, <a href="https://www.msec.it/blog/category/dev/" rel="category tag">Software development</a></span>		</div>
153			</header>	
154
155	
156		<div class="entry-content">
157		
158<p>I wanted to try out gpt-image-1, OpenAI’s new model for image generation. It’s rare that I need to generate images for a project (sometimes for fun with my kids), and while the free ChatGPT plan feels too limited for occasional image work, I don’t need a full monthly subscription either.<br>I also looked online for simple tools that directly use the gpt-image-1 API and support all its features, but I couldn’t find anything that fit my needs.</p>
159
160
161
162<p>When you have to produce multiple images with consistent characters and style, a chat-based UI can feel a bit restrictive. So I decided to build a small tool that talks directly to the OpenAI image-generation API. The interface is a very simple node-based editor that lets you link images together—so you can reliably reuse characters or environments across multiple prompts. I’ve also added inpainting support, even though gpt-image-1 doesn’t always honor an inpainting mask perfectly.</p>
163
164
165
166<figure class="wp-block-image size-full is-style-default"><a href="https://www.msec.it/blog/wp-content/uploads/2025/05/example-light.jpeg"><img fetchpriority="high" decoding="async" width="1740" height="1265" src="https://www.msec.it/blog/wp-content/uploads/2025/05/example-light.jpeg" alt="" class="wp-image-1138" title="Example screenshot" srcset="https://www.msec.it/blog/wp-content/uploads/2025/05/example-light.jpeg 1740w,https://www.msec.it/blog/wp-content/uploads/2025/05/example-light-300x218.jpeg 300w,https://www.msec.it/blog/wp-content/uploads/2025/05/example-light-1024x744.jpeg 1024
166w,https://www.msec.it/blog/wp-content/uploads/2025/05/example-light-768x558.jpeg 768w,https://www.msec.it/blog/wp-content/uploads/2025/05/example-light-1536x1117.jpeg 1536w,https://www.msec.it/blog/wp-content/uploads/2025/05/example-light-700x509.jpeg 700w,https://www.msec.it/blog/wp-content/uploads/2025/05/example-light-520x378.jpeg 520w,https://www.msec.it/blog/wp-content/uploads/2025/05/example-light-360x262.jpeg 360w,https://www.msec.it/blog/wp-content/uploads/2025/05/example-light-250x182.jpeg 250w,https://www.msec.it/blog/wp-content/uploads/2025/05/example-light-100x73.jpeg 100w" sizes="(max-width: 1740px) 100vw, 1740px"></a></figure>
167
168
169
170<p>If you’re curious, the source code on the <a href="https://github.com/colomboe/image-workbench" data-type="link" data-id="https://github.com/colomboe/image-workbench">github repo</a>, and you can try it out here: <a href="https://msec.it/image-workbench">https://msec.it/image-workbench</a></p>
171
172
173
174<p>A few things you’ll need to know before getting started:</p>
175
176
177
178<ul class="wp-block-list">
179<li>The tool is still pretty rough around the edges—there are a lot of UI/UX improvements I’d like to add.</li>
180
181
182
183<li>You should provide your own OpenAI API key enabled for the gpt-image-1 model (<em>click the key icon in the tool to set it, it will be stored locally in your browser’s local storage</em>).</li>
184
185
186
187<li>Because the tool runs entirely in your browser (it’s serverless), you have to click “New project” first and choose an empty local folder where it will save your files and images.</li>
188</ul>
189
190
191
192<p>Fell free to test and use it if you think it can be useful for you. And let me know if you have any feedback. Anyway, consider that this is just a little side-project done in my very very limited free time, so I’m not able to promise you any kind of support of future development.</p>
193
194
195
196<p>If you want to reach me out, you can find me on <a href="https://x.com/colomboe" data-type="link" data-id="https://x.com/colomboe">X</a>.</p>
197
198
199
200<p></p>
201	</div>
202	
203			
204		<footer class="entry-footer">
205			</footer>
206	</article>
207
208	<nav class="navigation post-navigation" aria-label="Posts">
209		<h2 class="screen-reader-text">Post navigation</h2>
210		<div class="nav-links"><div class="nav-previous"><a href="https://www.msec.it/blog/duel-times-finally-published/" rel="prev">Duel Times is finally published</a></div></div>
211	</nav>
212		</main>
213	</div>
214
215
216<aside id="secondary" class="widget-area" role="complementary">
217	
218		<aside id="recent-posts-6" class="widget widget_recent_entries">
219		<h4 class="widget-title">Recently</h4>
220		<ul>
221											<li>
222					<a href="https://www.msec.it/blog/playing-with-image-generative-ai/" aria-current="page">Playing with image generative AI</a>
223									</li>
224											<li>
225					<a href="https://www.msec.it/blog/duel-times-finally-published/">Duel Times is finally published</a>
226									</li>
227											<li>
228					<a href="https://www.msec.it/blog/comprehension-like-syntax-in-kotlin/">Comprehension-like syntax in Kotlin</a>
229									</li>
230											<li>
231					<a href="https://www.msec.it/blog/introducing-kio/">Introducing KIO</a>
232									</li>
233											<li>
234					<a href="https://www.msec.it/blog/effect-polymorphism-with-arrow-fx/">Effect polymorphism with Arrow FX</a>
235									</li>
236					</ul>
237
238		</aside></aside>
239
240		</div>
241	</div>
242
243	<div class="footer-wrapper">
244				
245				
246		<footer id="colophon" class="site-footer" role="contentinfo">	
247			<div class="site-info container">
248				<nav id="footernav" class="footer-navigation" role="navigation">
249					<div id="footer-menu" class="menu"><ul>
250<li class="page_item page-item-865 current_page_parent"><a href="https://www.msec.it/blog/posts/">Blog posts</a></li>
251<li class="page_item page-item-1114"><a href="https://www.msec.it/blog/duel-times/">Duel Times</a></li>
252<li class="page_item page-item-11 page_item_has_children"><a href="https://www.msec.it/blog/dukto/">Dukto R6</a></li>
253<li class="page_item page-item-831"><a href="https://www.msec.it/blog/">Welcome</a></li>
254</ul></div>
255				</nav>
256				<div class="site-copyright">
257					Theme: <a href="http://athemes.com/theme/astrid" rel="nofollow">Astrid</a> by aThemes.				</div>
258			</div>
259		</footer>
260	</div>
261
262	
262<script async defer src="https://scripts.withcabin.com/hello.js"></script>
262
263
264</div>
265
266<script type="speculationrules">
267{"prefetch":[{"source":"document","where":{"and":[{"href_matches":"\/*"},{"not":{"href_matches":["\/wp-*.php","\/wp-admin\/*","\/wp-content\/uploads\/*","\/wp-content\/*","\/wp-content\/plugins\/*","\/wp-content\/themes\/astrid\/*","\/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]}
268</script>
vendor: 1 bytes, line 268
268
269<script type="text/javascript" src="https://www.msec.it/blog/wp-content/themes/astrid/js/main.js" id="astrid-main-js"></script>
vendor: 1 bytes, line 269
269
270<script type="text/javascript" src="https://www.msec.it/blog/wp-content/themes/astrid/js/scripts.min.js" id="astrid-scripts-js"></script>
270
271
272<script type="text/javascript" src="https://www.msec.it/blog/wp-content/plugins/enlighter/cache/enlighterjs.min.js" id="enlighterjs-js"></script>
vendor: 1 bytes, line 272
272
273<script type="text/javascript" id="enlighterjs-js-after">
274/* <![CDATA[ */
275!function(e,n){if("undefined"!=typeof EnlighterJS){var o={"selectors":{"block":"pre.EnlighterJSRAW","inline":"code.EnlighterJSRAW"},"options":{"indent":2,"ampersandCleanup":true,"linehover":true,"rawcodeDbclick":false,"textOverflow":"break","linenumbers":false,"theme":"enlighter","language":"kotlin","retainCssClasses":false,"collapse":false,"toolbarOuter":"","toolbarTop":"{BTN_RAW}{BTN_COPY}{BTN_WINDOW}{BTN_WEBSITE}","toolbarBottom":""}};(e.EnlighterJSINIT=function(){EnlighterJS.init(o.selectors.block,o.selectors.inline,o.options)})()}else{(n&&(n.error||n.log)||function(){})("Error: EnlighterJS resources not loaded yet!")}}(window,console);
276/* ]]> */
277</script>
277
278
279</body>
280</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.