<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>felipe.lavin.blog</title>
	<atom:link href="https://felipe.lavin.blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://felipe.lavin.blog</link>
	<description></description>
	<lastBuildDate>Wed, 04 Mar 2026 20:53:13 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://felipe.lavin.blog/app/uploads/2025/04/favicon-1-120x120.png</url>
	<title>felipe.lavin.blog</title>
	<link>https://felipe.lavin.blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>MicroGPT</title>
		<link>https://felipe.lavin.blog/2026/03/04/microgpt/</link>
					<comments>https://felipe.lavin.blog/2026/03/04/microgpt/#comments</comments>
		
		<dc:creator><![CDATA[felipelavinz]]></dc:creator>
		<pubDate>Wed, 04 Mar 2026 20:53:12 +0000</pubDate>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[gpt]]></category>
		<category><![CDATA[llm]]></category>
		<guid isPermaLink="false">https://felipe.lavin.blog/?p=8917</guid>

					<description><![CDATA[MicroGPT explained interactively — a few days ago, Andrej Karpathy published a 200 python script for GPT training and inference. Everything else is just efficiency. This post is an illustrated guide to understand the concepts and how the script works.]]></description>
										<content:encoded><![CDATA[
<p><a href="https://growingswe.com/blog/microgpt">MicroGPT explained interactively</a> — a few days ago, Andrej Karpathy published a <a href="https://karpathy.github.io/2026/02/12/microgpt/">200 python script for GPT training</a> and inference. <em>Everything else is just efficiency</em>. This post is an illustrated guide to understand the concepts and how the script works.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://felipe.lavin.blog/2026/03/04/microgpt/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>On undoing, fixing, or removing commits in git</title>
		<link>https://felipe.lavin.blog/2026/01/20/on-undoing-fixing-or-removing-commits-in-git/</link>
		
		<dc:creator><![CDATA[felipelavinz]]></dc:creator>
		<pubDate>Tue, 20 Jan 2026 16:01:50 +0000</pubDate>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[docs]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[programming]]></category>
		<guid isPermaLink="false">https://felipe.lavin.blog/?p=8863</guid>

					<description><![CDATA[This is one of my personal favourites of all time; an excellent guide to fixing all things gone wrong when using git. It&#8217;s presented as a simple choose-your-own-adventure text guide; you can find it on: On undoing, fixing, or removing commits in git]]></description>
										<content:encoded><![CDATA[
<p>This is one of my personal favourites of all time; an excellent guide to fixing all things gone wrong when using git.</p>



<p>It&#8217;s presented as a simple <em>choose-your-own-adventure</em> text guide; you can find it on:</p>



<p><a href="https://sethrobertson.github.io/GitFixUm/fixup.html">On undoing, fixing, or removing commits in git</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>SourceGit</title>
		<link>https://felipe.lavin.blog/2025/11/03/sourcegit/</link>
		
		<dc:creator><![CDATA[felipelavinz]]></dc:creator>
		<pubDate>Tue, 04 Nov 2025 00:32:48 +0000</pubDate>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[git]]></category>
		<guid isPermaLink="false">https://felipe.lavin.blog/?p=8770</guid>

					<description><![CDATA[SourceGit is a powerful and user-friendly graphical Git client that makes working with version control more intuitive. It offers a clean interface for browsing commit history in a timeline view, making it easy to track changes over time. You can quickly filter commits by file, which is especially useful when focusing on specific parts of [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><a href="https://sourcegit-scm.github.io/">SourceGit</a> is a powerful and user-friendly graphical Git client that makes working with version control more intuitive. It offers a clean interface for browsing commit history in a timeline view, making it easy to track changes over time. You can quickly filter commits by file, which is especially useful when focusing on specific parts of a project. Overall, it provides a smooth and efficient way to explore your repository.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Simple React builds for WordPress with Symfony&#8217;s Webpack Encore</title>
		<link>https://felipe.lavin.blog/2025/05/12/simple-react-builds-for-wordpress-with-symfonys-webpack-encore/</link>
		
		<dc:creator><![CDATA[felipelavinz]]></dc:creator>
		<pubDate>Mon, 12 May 2025 23:09:51 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[react]]></category>
		<category><![CDATA[webpack]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://felipe.lavin.blog/?p=7448</guid>

					<description><![CDATA[Symfony&#8217;s Webpack Encore (docs) makes it quite easy to build your JS apps. It&#8217;s a nicer interface for the actual Webpack config, so you can also extend and customize your config to fit any use case that&#8217;s supported by webpack. One of the cool things I&#8217;ve done with it is using it for building React [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Symfony&#8217;s <a href="https://www.npmjs.com/package/@symfony/webpack-encore">Webpack Encore</a> (<a href="https://symfony.com/doc/current/frontend/encore/index.html">docs</a>) makes it quite easy to build your JS apps. It&#8217;s a nicer interface for the actual Webpack config, so you can also extend and customize your config to <em>fit any use case</em> that&#8217;s supported by webpack.</p>



<p>One of the cool things I&#8217;ve done with it is using it for building React apps that use <a href="https://wordpress.github.io/gutenberg/">WordPress code editor components</a> for my own admin tools.</p>



<p>Here&#8217;s how you can use it.</p>



<h2 class="wp-block-heading">Configure JS dependencies</h2>



<p>For a bare-bones setup you will need to add the following dependencies:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: bash; title: ; notranslate">
npm install --save-dev @symfony/wepack-encore @wordpress/babel-preset-default @wordpress/dependency-extraction-webpack-plugin
</pre></div>


<p>I&#8217;ll explain each of them:</p>



<ul class="wp-block-list">
<li><code>@symfony/webpack-encore</code> provides a simple interface for configuring Webpack; it will also pull all its required dependencies.</li>



<li><code>@wordpress/babel-preset-default</code> will provide a standard setup for js compilation, like enable JSX and more to fit into WordPress.</li>



<li><code>@wordpress/dependency-extraction-webpack-plugin</code> externalizes dependencies that are available on WordPress (like @wordpress/element and @wordpress/components) to use those versions (don&#8217;t duplicate them).</li>
</ul>



<p>After installing, you need to create a <code>.babelrc</code> file with the following contents:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
{
	&quot;presets&quot;: &#x5B; &quot;@wordpress/babel-preset-default&quot; ]
}
</pre></div>


<h2 class="wp-block-heading">Configure Webpack</h2>



<p>This is where Encore comes in. Instead of the super-verbose config that you would need here, you just need something like this on your <code>webpack.config.js</code> file:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: jscript; title: ; notranslate">
const Encore = require( &#039;@symfony/webpack-encore&#039; );
const DependencyExtractionWebpackPlugin = require( &#039;@wordpress/dependency-extraction-webpack-plugin&#039; );

Encore.setOutputPath( &#039;assets/dist&#039; )
	.setPublicPath( &#039;wp-content/plugins/my-awesome-plugin/assets/dist&#039; )
	.setManifestKeyPrefix( &#039;&#039; )
	.enableSingleRuntimeChunk()
	.addPlugin( new DependencyExtractionWebpackPlugin() )
	.addEntry( &#039;admin&#039;, &#039;./assets/src/js/admin.js&#039; )

const config =  Encore.getWebpackConfig();
module.exports = config;

</pre></div>


<p>You&#8217;ll need to adjust the paths and you&#8217;ll probably want to take a look at some of <a href="https://github.com/symfony/webpack-encore/blob/main/index.js">Encore&#8217;s configuration options</a>.</p>



<p><code>DependencyExtractionPlugin</code> will generate an <code>.asset.php</code> file for each entry point; <code>admin.asset.php</code> on this example. That file will contain the name of the WordPress javascript dependencies that you have declared on your components.</p>



<p>Keeping that in mind, then you will need to register/enqueue the required scripts on the desired pages, using WordPress&#8217; <a href="https://developer.wordpress.org/reference/functions/wp_enqueue_script/">wp_enqueue_script()</a> — you can check Queulat&#8217;s <a href="https://github.com/bloom-ux/queulat/blob/main/src/helpers/class-webpack-asset-loader.php">Webpack Asset Loader</a> helper for a simple integration (I&#8217;ll be posting an example of this soon).</p>



<p>With this setup you&#8217;ll be able to use any of WordPress components such as buttons, modals, <a href="https://wordpress.github.io/gutenberg/?path=/docs/components-focalpointpicker--docs">focal point picker</a>, etc.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How WordPress check filesystem permissions</title>
		<link>https://felipe.lavin.blog/2025/05/09/how-wordpress-check-filesystem-permissions/</link>
		
		<dc:creator><![CDATA[felipelavinz]]></dc:creator>
		<pubDate>Fri, 09 May 2025 20:38:22 +0000</pubDate>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://felipe.lavin.blog/?p=8365</guid>

					<description><![CDATA[When you&#8217;re about to perform a filesystem operation, WordPress will check if you&#8217;re able to perform the changes before actually doing it. This is defined on the get_filesystem_method() function, from /wp-admin/includes/file.php. What WordPress actually does is compare the file owner of the file itself and a temporal file created on the /wp-content/plugins folder. So, there [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>When you&#8217;re about to perform a filesystem operation, WordPress will check if you&#8217;re able to perform the changes before actually doing it.</p>



<p>This is defined on the <code>get_filesystem_method()</code> function, from <strong>/wp-admin/includes/file.php</strong>.</p>



<p>What WordPress actually does is compare the file owner of the file itself and a temporal file created on the <strong>/wp-content/plugins</strong> folder.</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: php; title: ; notranslate">
$temp_file_name = $context . &#039;temp-write-test-&#039; . str_replace( &#039;.&#039;, &#039;-&#039;, uniqid( &#039;&#039;, true ) );
$temp_handle    = @fopen( $temp_file_name, &#039;w&#039; );
if ( $temp_handle ) {

	// Attempt to determine the file owner of the WordPress files, and that of newly created files.
	$wp_file_owner   = false;
	$temp_file_owner = false;
	if ( function_exists( &#039;fileowner&#039; ) ) {
		$wp_file_owner   = @fileowner( __FILE__ );
		$temp_file_owner = @fileowner( $temp_file_name );
	}

	if ( false !== $wp_file_owner &amp;&amp; $wp_file_owner === $temp_file_owner ) {
		/*
		 * WordPress is creating files as the same owner as the WordPress files,
		 * this means it&#039;s safe to modify &amp; create new files via PHP.
		 */
		$method                                = &#039;direct&#039;;
		$GLOBALS&#x5B;&#039;_wp_filesystem_direct_method&#039;] = &#039;file_owner&#039;;
</pre></div>


<p>So, there it is. Next time that the FTP credentials screen shows up, this is what to check to quickly fix it.</p>



<p>You can check the <a href="https://github.com/WordPress/WordPress/blob/master/wp-admin/includes/file.php#L2243">full source file on Github for more context</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Content management systems specs</title>
		<link>https://felipe.lavin.blog/2025/05/09/content-management-systems-specs/</link>
		
		<dc:creator><![CDATA[felipelavinz]]></dc:creator>
		<pubDate>Fri, 09 May 2025 20:23:32 +0000</pubDate>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[cms]]></category>
		<category><![CDATA[standards]]></category>
		<guid isPermaLink="false">https://felipe.lavin.blog/?p=8503</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<ul class="wp-block-list">
<li><a href="https://phpcr.github.io/">PHPCR</a> is a PHP implementation of the Java Content Repository spec.</li>



<li><a href="https://sulu.io/">Sulu</a> is a content management system built with Symfony and using PHPCR.</li>



<li><a href="https://www.oasis-open.org/standard/cmisv1-1/">CMIS</a> is another content-manangement spec, supported by a some other Java CMSs.</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Big AI is eating up your bandwidth</title>
		<link>https://felipe.lavin.blog/2025/04/28/big-ai-is-eating-up-your-bandwidth/</link>
		
		<dc:creator><![CDATA[felipelavinz]]></dc:creator>
		<pubDate>Mon, 28 Apr 2025 15:03:34 +0000</pubDate>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[technology]]></category>
		<guid isPermaLink="false">https://felipe.lavin.blog/?p=8483</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[
<ul class="wp-block-list">
<li>Wikimedia on <a href="https://diff.wikimedia.org/2025/04/01/how-crawlers-impact-the-operations-of-the-wikimedia-projects/">how crawlers impact the operation of Wikipedia Project</a>.</li>



<li>Jeremy Keith writes about the ongoing problem that&#8217;s the training of LLMs <a href="http://When we talk about the unfair practices and harm done by training large language models, we usually talk about it in the past tense: how they were trained on other people’s creative work without permission. But this is an ongoing problem that’s just getting worse">as a DDoS attack at the good parts of the internet</a>.</li>



<li>Jan Wildeboer exposes the shady way that some AI companies are using to create <a href="https://jan.wildeboer.net/2025/04/Web-is-Broken-Botnet-Part-2/">botnets with &#8220;network sharing&#8221; on some apps</a>.</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sobre blogs, AIs y más en tecnolocuras.com</title>
		<link>https://felipe.lavin.blog/2025/04/25/sobre-blogs-ais-y-mas-en-tecnolocuras-com/</link>
		
		<dc:creator><![CDATA[felipelavinz]]></dc:creator>
		<pubDate>Fri, 25 Apr 2025 22:14:03 +0000</pubDate>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[blogs]]></category>
		<category><![CDATA[Tecnología]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://felipe.lavin.blog/?p=8424</guid>

					<description><![CDATA[Henry de tecnolocuras me contactó para participar en su serie de Conversaciones con blogueros, lo que dio la oportunidad para explayarse desde la burbuja de las punto com a los gestores de contenido y LLMs. Se puede leer en Conversaciones con blogueros #24.]]></description>
										<content:encoded><![CDATA[
<p>Henry de <strong>tecnolocuras</strong> me contactó para participar en su serie de <em>Conversaciones con blogueros</em>, lo que dio la oportunidad para explayarse desde la burbuja de las punto com a los gestores de contenido y LLMs.</p>



<p>Se puede leer en <a href="https://tecnolocuras.com/entrevistas/conversaciones-con-blogueros-felipe-lavin/">Conversaciones con blogueros #24.</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to enable PDF thumbnails on WordPress</title>
		<link>https://felipe.lavin.blog/2025/01/31/how-to-enable-pdf-thumbnails-on-wordpress/</link>
		
		<dc:creator><![CDATA[felipelavinz]]></dc:creator>
		<pubDate>Fri, 31 Jan 2025 18:57:24 +0000</pubDate>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[pdf]]></category>
		<category><![CDATA[WordPress]]></category>
		<guid isPermaLink="false">https://felipe.lavin.blog/?p=8373</guid>

					<description><![CDATA[First, you need Ghostscript and Imagemagick installed on the server. If in doubt, run sudo apt install ghostscript php{YOUR_VERSION}-imagick Then, check if the security policy allows PDF read/write. For instance, on a Debian 12 installation you would check /etc/ImageMagick-6/policy.xml Check if there&#8217;s already a &#8220;PDF&#8221; policy and edit or add the following line: If you&#8217;re [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>First, you need <strong>Ghostscript and Imagemagick</strong> installed on the server. If in doubt, run <code>sudo apt install ghostscript php{YOUR_VERSION}-imagick</code></p>



<p>Then, check if the security policy allows PDF read/write. For instance, on a Debian 12 installation you would check <code>/etc/ImageMagick-6/policy.xml</code></p>



<p>Check if there&#8217;s already a &#8220;PDF&#8221; policy and edit or add the following line:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: xml; title: ; notranslate">
&lt;policy domain=&quot;coder&quot; rights=&quot;read | write&quot; pattern=&quot;PDF&quot; /&gt;
</pre></div>


<p>If you&#8217;re using PHP as FPM, you will need to restart the FPM process and then it should be available.</p>



<p>If you need to debug deeper, check the <code>class-wp-image-editor-imagick.php</code> file <a href="https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-image-editor-imagick.php#L143-L160">around line ~143</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Understanding embeddings</title>
		<link>https://felipe.lavin.blog/2024/11/07/understanding-embeddings/</link>
		
		<dc:creator><![CDATA[felipelavinz]]></dc:creator>
		<pubDate>Thu, 07 Nov 2024 18:51:37 +0000</pubDate>
				<category><![CDATA[Notes]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[embeddings]]></category>
		<category><![CDATA[search]]></category>
		<guid isPermaLink="false">https://felipe.lavin.blog/?p=8377</guid>

					<description><![CDATA[tldr: embeddings are numeric representations of text on an n-dimensional space that can be used to calculate semantic proximity. For more details, check:]]></description>
										<content:encoded><![CDATA[
<p>tldr: embeddings are numeric representations of text on an n-dimensional space that can be used to calculate semantic proximity.</p>



<p>For more details, check:</p>



<ul class="wp-block-list">
<li><a href="https://technicalwriting.dev/data/embeddings.html">Embeddings are underrated</a> &#8211; a concise theorical and practical approach to embeddings for discovering connections between texts.</li>



<li><a href="https://jalammar.github.io/illustrated-word2vec/">The Illustrated Word2vec</a> &#8211; has lots of diagrams and visualizations for word embeddings, language model training, sliding word windows (skipgrams) and text generation.</li>
</ul>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
