<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ivaj O'Franc</title>
    <description>The latest articles on Forem by Ivaj O'Franc (@ivajofranc).</description>
    <link>https://forem.com/ivajofranc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3408208%2F0c291153-d5c7-44ac-acdf-3d9e549307f2.jpg</url>
      <title>Forem: Ivaj O'Franc</title>
      <link>https://forem.com/ivajofranc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ivajofranc"/>
    <language>en</language>
    <item>
      <title>Monthly Partitioning and Automatic Rotation of Tables in PostgreSQL (AWS RDS)</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Tue, 04 Nov 2025 18:46:01 +0000</pubDate>
      <link>https://forem.com/ivajofranc/monthly-partitioning-and-automatic-rotation-of-tables-in-postgresql-aws-rds-25pl</link>
      <guid>https://forem.com/ivajofranc/monthly-partitioning-and-automatic-rotation-of-tables-in-postgresql-aws-rds-25pl</guid>
      <description>&lt;h1&gt;
  
  
  Monthly Partitioning and Automatic Rotation of Tables in PostgreSQL (AWS RDS)
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/ivajofranc/particionamiento-mensual-y-rotacion-automatica-de-tablas-en-postgresql-aws-rds-2p3c"&gt;🇪🇸 Lee también este post en español&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Introduction
&lt;/h2&gt;

&lt;p&gt;This tutorial explains how to transform the &lt;code&gt;my_table&lt;/code&gt; table in your PostgreSQL database (on AWS RDS) into a monthly partitioned structure using a UTC range, with automatic rotation and minimal downtime. The process is designed to maintain compatibility with existing applications and to make it easy to maintain and automatically delete old data according to retention policies.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Environment Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL 14.17 (AWS RDS)
&lt;/li&gt;
&lt;li&gt;TimeZone: UTC
&lt;/li&gt;
&lt;li&gt;Main table: &lt;code&gt;public.my_table&lt;/code&gt; (names have been changed for anonymity)
&lt;/li&gt;
&lt;li&gt;Automation via Python (AWS Lambda) and/or pg_cron
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Problem Found
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;code&gt;my_table&lt;/code&gt; table was not partitioned and grew quickly.
&lt;/li&gt;
&lt;li&gt;Need to split the data by month (UTC) without stopping services.
&lt;/li&gt;
&lt;li&gt;Retention must be respected: 2 months.
&lt;/li&gt;
&lt;li&gt;It should be possible to create and drop partitions automatically.
&lt;/li&gt;
&lt;li&gt;Rename old indexes and constraints to free reserved names and avoid conflicts during migration.
&lt;/li&gt;
&lt;li&gt;Compatible with current scripts and applications.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Step-by-Step Tutorial
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Rename the current table and release names
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Rename table my_table to my_table_old
ALTER TABLE public.my_table RENAME TO my_table_old;

-- Rename primary index (example)
ALTER INDEX public.my_table_pkey RENAME TO my_table_pkey_old;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Create the new partitioned table
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Create audit_log parent table partitioned by RANGE on "event_time"
CREATE TABLE public.audit_log (
    event_time timestamptz NOT NULL,
    action_type text NOT NULL,
    user_id int,
    details text,
    request_payload text,
    query_params text,
    app_instance text,
    response_payload text,
    log_id int NOT NULL,
    duration_ms int,
    source_ip text,
    CONSTRAINT audit_log_pkey PRIMARY KEY (log_id, event_time)
) PARTITION BY RANGE (event_time);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Create the needed monthly partitions
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Previous month partition
CREATE TABLE public.audit_log_2025_09 PARTITION OF public.audit_log
    FOR VALUES FROM ('2025-09-01 00:00:00+00') TO ('2025-10-01 00:00:00+00');

-- Current month partition
CREATE TABLE public.audit_log_2025_10 PARTITION OF public.audit_log
    FOR VALUES FROM ('2025-10-01 00:00:00+00') TO ('2025-11-01 00:00:00+00');

-- Next month partition
CREATE TABLE public.audit_log_2025_11 PARTITION OF public.audit_log
    FOR VALUES FROM ('2025-11-01 00:00:00+00') TO ('2025-12-01 00:00:00+00');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Create global indexes if needed
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Example of global index on "event_time"
CREATE INDEX audit_log_event_time_idx ON public.audit_log(event_time);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. (Optional) Migrate some recent test data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Insert recent records for testing (without complete history)
INSERT INTO public.audit_log (
    event_time, action_type, user_id, details, request_payload, query_params, app_instance, response_payload, log_id, duration_ms, source_ip
)
SELECT
    event_time, action_type, user_id, details, request_payload, query_params, app_instance, response_payload, log_id, duration_ms, source_ip
FROM public.audit_log_old
WHERE event_time &amp;gt;= '2025-10-01 00:00:00+00';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Update your scripts and applications
&lt;/h3&gt;

&lt;p&gt;Make sure you have updated the necessary references to operate on the new &lt;code&gt;my_table&lt;/code&gt;, now partitioned. If you previously used &lt;code&gt;my_table&lt;/code&gt;, names should be retained unless additional requirements exist.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Automate partition rotation
&lt;/h3&gt;

&lt;p&gt;Implement maintenance via pg_cron or Lambda + Python:&lt;/p&gt;

&lt;h4&gt;
  
  
  Example rotation function in PL/pgSQL
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION audit_log_rotate(retention_months INT, horizon_months INT) RETURNS VOID AS $$
DECLARE
    current_month date := date_trunc('month', now() AT TIME ZONE 'UTC');
    first_keep date := current_month - INTERVAL '1 month' * retention_months;
    last_create date := current_month + INTERVAL '1 month' * horizon_months;
BEGIN
    -- Create future partitions
    FOR m IN 0..horizon_months LOOP
        EXECUTE format(
            'CREATE TABLE IF NOT EXISTS public.audit_log_%s PARTITION OF public.audit_log FOR VALUES FROM (%L) TO (%L);',
            to_char(current_month + INTERVAL '1 month' * m, 'YYYY_MM'),
            current_month + INTERVAL '1 month' * m,
            current_month + INTERVAL '1 month' * (m+1)
        );
    END LOOP;

    -- Drop old partitions
    FOR r IN 1..retention_months LOOP
        EXECUTE format(
            'DROP TABLE IF EXISTS public.audit_log_%s CASCADE;',
            to_char(first_keep - INTERVAL '1 month' * r, 'YYYY_MM')
        );
    END LOOP;
END;
$$ LANGUAGE plpgsql;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Schedule execution via pg_cron each day:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT cron.schedule('rotate_audit_log', '5 0 1 * *', 'SELECT audit_log_rotate(2,2);');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, implement the logic in AWS Lambda with Python and pg8000, connecting to each database with secure credentials (using AWS Secrets Manager).&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Recommendations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rename all objects before swapping to avoid naming conflicts.
&lt;/li&gt;
&lt;li&gt;Automate rotation: create future partitions and drop old ones based on retention.
&lt;/li&gt;
&lt;li&gt;Make sure your applications and scripts don't depend on specific partitions; always operate on the parent.
&lt;/li&gt;
&lt;li&gt;Protect and centralize your maintenance parameters (retention, horizon, etc.).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.postgresql.org/docs/current/ddl-partitioning.html" rel="noopener noreferrer"&gt;Official PostgreSQL Partitioning Documentation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/citusdata/pg_cron" rel="noopener noreferrer"&gt;pg_cron for automation&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/services-rds.html" rel="noopener noreferrer"&gt;AWS Lambda and RDS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tlocke/pg8000" rel="noopener noreferrer"&gt;pg8000 - Python driver for PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgres</category>
      <category>partitioning</category>
      <category>automation</category>
      <category>aws</category>
    </item>
    <item>
      <title>Particionamiento mensual y rotación automática de tablas en PostgreSQL (AWS RDS)</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Tue, 04 Nov 2025 18:45:08 +0000</pubDate>
      <link>https://forem.com/ivajofranc/particionamiento-mensual-y-rotacion-automatica-de-tablas-en-postgresql-aws-rds-2p3c</link>
      <guid>https://forem.com/ivajofranc/particionamiento-mensual-y-rotacion-automatica-de-tablas-en-postgresql-aws-rds-2p3c</guid>
      <description>&lt;h1&gt;
  
  
  Particionamiento mensual y rotación automática de tablas en PostgreSQL (AWS RDS)
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/ivajofranc/monthly-partitioning-and-automatic-rotation-of-tables-in-postgresql-aws-rds-25pl"&gt;🇬🇧 Also read this post in English&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Introducción
&lt;/h2&gt;

&lt;p&gt;Este tutorial explica cómo transformar la tabla &lt;code&gt;my_table&lt;/code&gt; de tu base de datos PostgreSQL (en AWS RDS) a una estructura particionada por mes usando rango sobre UTC, con rotación automática y mínima caída de servicio. El proceso está pensado para mantener la compatibilidad con las aplicaciones existentes y facilitar el mantenimiento y borrado automático de datos antiguos según las políticas de retención.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Entorno usado
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL 14.17 (AWS RDS)&lt;/li&gt;
&lt;li&gt;TimeZone: UTC&lt;/li&gt;
&lt;li&gt;Tabla principal: &lt;code&gt;public.my_table&lt;/code&gt; (nombres modificados para anonimidad)
&lt;/li&gt;
&lt;li&gt;Automatización vía Python (AWS Lambda) y/o pg_cron&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧩 Problema encontrado
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;La tabla &lt;code&gt;my_table&lt;/code&gt; era no particionada y acumulaba datos rápidamente.&lt;/li&gt;
&lt;li&gt;Necesidad de dividir los datos por mes (UTC) sin detener los servicios.
&lt;/li&gt;
&lt;li&gt;Se debe respetar la retención: 2 meses.
&lt;/li&gt;
&lt;li&gt;Debe ser posible crear y eliminar particiones de forma automática.
&lt;/li&gt;
&lt;li&gt;Renombrar índices y constraints antiguos para liberar nombres reservados y evitar conflictos durante la migración.
&lt;/li&gt;
&lt;li&gt;Compatible con scripts y aplicaciones actuales.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔧 Tutorial paso a paso
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Renombrar la tabla actual y liberar nombres
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Renombrar tabla my_table a my_table_old
ALTER TABLE public.my_table RENAME TO my_table_old;

-- Renombrar índice primario (ejemplo)
ALTER INDEX public.my_table_pkey RENAME TO my_table_pkey_old;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Crear la nueva tabla particionada
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Crear tabla audit_log parent particionada por RANGE en la columna "event_time"
CREATE TABLE public.audit_log (
    event_time timestamptz NOT NULL,
    action_type text NOT NULL,
    user_id int,
    details text,
    request_payload text,
    query_params text,
    app_instance text,
    response_payload text,
    log_id int NOT NULL,
    duration_ms int,
    source_ip text,
    CONSTRAINT audit_log_pkey PRIMARY KEY (log_id, event_time)
) PARTITION BY RANGE (event_time);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Crear los partitions mensuales necesarias
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Partición para el mes anterior
CREATE TABLE public.audit_log_2025_09 PARTITION OF public.audit_log
    FOR VALUES FROM ('2025-09-01 00:00:00+00') TO ('2025-10-01 00:00:00+00');

-- Partición para el mes actual
CREATE TABLE public.audit_log_2025_10 PARTITION OF public.audit_log
    FOR VALUES FROM ('2025-10-01 00:00:00+00') TO ('2025-11-01 00:00:00+00');

-- Partición para el mes siguiente
CREATE TABLE public.audit_log_2025_11 PARTITION OF public.audit_log
    FOR VALUES FROM ('2025-11-01 00:00:00+00') TO ('2025-12-01 00:00:00+00');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Crear índices globales si se requiere
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Ejemplo de índice global en campo "date" 
CREATE INDEX my_table_date_idx ON public.my_table(date);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. (Opcional) Migrar algunos datos de prueba
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Insertar registros recientes para pruebas (sin histórico completo)
INSERT INTO public.audit_log (
    event_time, action_type, user_id, details, request_payload, query_params, app_instance, response_payload, log_id, duration_ms, source_ip
)
SELECT
    event_time, action_type, user_id, details, request_payload, query_params, app_instance, response_payload, log_id, duration_ms, source_ip
FROM public.audit_log_old
WHERE event_time &amp;gt;= '2025-10-01 00:00:00+00';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Actualiza tus scripts y aplicaciones
&lt;/h3&gt;

&lt;p&gt;Confirma que modificaste las referencias necesarias para operar sobre la nueva tabla &lt;code&gt;my_table&lt;/code&gt;, ahora particionada. Si usabas &lt;code&gt;my_table&lt;/code&gt;, los nombres se deben conservar salvo si hubo requerimientos extra.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Automatiza la rotación de particiones
&lt;/h3&gt;

&lt;p&gt;Implementa el mantenimiento con pg_cron o Lambda + Python:&lt;/p&gt;

&lt;h4&gt;
  
  
  Ejemplo función de rotación en PL/pgSQL
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE OR REPLACE FUNCTION audit_log_rotate(retention_months INT, horizon_months INT) RETURNS VOID AS $$
DECLARE
    current_month date := date_trunc('month', now() AT TIME ZONE 'UTC');
    first_keep date := current_month - INTERVAL '1 month' * retention_months;
    last_create date := current_month + INTERVAL '1 month' * horizon_months;
BEGIN
    -- Crear particiones futuras
    FOR m IN 0..horizon_months LOOP
        EXECUTE format(
            'CREATE TABLE IF NOT EXISTS public.audit_log_%s PARTITION OF public.audit_log FOR VALUES FROM (%L) TO (%L);',
            to_char(current_month + INTERVAL '1 month' * m, 'YYYY_MM'),
            current_month + INTERVAL '1 month' * m,
            current_month + INTERVAL '1 month' * (m+1)
        );
    END LOOP;
    -- Borrar antiguas
    FOR r IN 1..retention_months LOOP
        EXECUTE format(
            'DROP TABLE IF EXISTS public.audit_log_%s CASCADE;',
            to_char(first_keep - INTERVAL '1 month' * r, 'YYYY_MM')
        );
    END LOOP;
END;
$$ LANGUAGE plpgsql;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Programar ejecución vía pg_cron todos los días:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT cron.schedule('rotate_audit_log', '5 0 1 * *', 'SELECT audit_log_rotate(2,2);');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O implementa la lógica en AWS Lambda con Python y pg8000, conectando a cada base con los credentials seguros (usando AWS Secrets Manager).&lt;/p&gt;




&lt;h2&gt;
  
  
  💡 Recomendaciones
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Renombra todos los objetos antes del swap para evitar conflictos de nombres.
&lt;/li&gt;
&lt;li&gt;Automatiza la rotación: crea las particiones futuras y borra las antiguas según retención.
&lt;/li&gt;
&lt;li&gt;Valida que las aplicaciones y scripts no dependan de particiones específicas; opera siempre sobre el parent.
&lt;/li&gt;
&lt;li&gt;Protege y centraliza los parámetros de mantenimiento (retención, horizon, etc.).
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Enlaces útiles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.postgresql.org/docs/current/ddl-partitioning.html" rel="noopener noreferrer"&gt;Documentación oficial de particionamiento PostgreSQL&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/citusdata/pg_cron" rel="noopener noreferrer"&gt;pg_cron para automatizaciones&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/services-rds.html" rel="noopener noreferrer"&gt;AWS Lambda y RDS&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tlocke/pg8000" rel="noopener noreferrer"&gt;pg8000 - Python driver para PostgreSQL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>postgres</category>
      <category>particionamiento</category>
      <category>automatización</category>
      <category>aws</category>
    </item>
    <item>
      <title>Report-Tutorial: Installing and Compiling u2vpodcast on an Oracle Linux VM (ARM64)</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Thu, 02 Oct 2025 16:54:30 +0000</pubDate>
      <link>https://forem.com/ivajofranc/report-tutorial-installing-and-compiling-u2vpodcast-on-an-oracle-linux-vm-arm64-c15</link>
      <guid>https://forem.com/ivajofranc/report-tutorial-installing-and-compiling-u2vpodcast-on-an-oracle-linux-vm-arm64-c15</guid>
      <description>&lt;h1&gt;
  
  
  Report-Tutorial: Installing and Compiling u2vpodcast on an Oracle Linux VM (ARM64)
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/ivajofranc/informe-tutorial-instalacion-y-compilacion-de-u2vpodcast-en-una-vm-oracle-linux-arm64-41pj"&gt;🇪🇸 Lee también este post en español&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This tutorial documents how the &lt;strong&gt;u2vpodcast&lt;/strong&gt; project was prepared, compiled, and installed inside an ARM64 virtual machine running Oracle Linux.&lt;br&gt;&lt;br&gt;
It is written as a didactic guide and reference for future installations.&lt;/p&gt;


&lt;h2&gt;
  
  
  1️⃣ Technical Details of the Virtual Machine
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OS&lt;/strong&gt;: Oracle Linux Server 8.10
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kernel&lt;/strong&gt;: Linux 5.4.x
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Architecture&lt;/strong&gt;: ARM64 (aarch64)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU&lt;/strong&gt;: 1 Neoverse-N1 core (ARMv8)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAM&lt;/strong&gt;: 5.6 GiB
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swap&lt;/strong&gt;: 4 GiB
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disk&lt;/strong&gt;: 46 GiB total (~50% free)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Interpretation&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAM is sufficient to compile and run containers.
&lt;/li&gt;
&lt;li&gt;The single CPU is the main bottleneck (compilation and video conversion take longer).
&lt;/li&gt;
&lt;li&gt;Disk space is adequate.
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  2️⃣ Initial System Preparation
&lt;/h2&gt;

&lt;p&gt;Update packages and install basic tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; git curl wget unzip &lt;span class="nb"&gt;tar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3️⃣ Install Docker and Docker Compose
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; docker-ce docker-ce-cli containerd.io
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4️⃣ Clone the u2vpodcast Project
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/user/u2vpodcast.git
&lt;span class="nb"&gt;cd &lt;/span&gt;u2vpodcast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5️⃣ Initial Problem: Architecture Incompatibility
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The official Docker image was built for &lt;strong&gt;amd64&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;The VM is &lt;strong&gt;ARM64 (aarch64)&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Result: &lt;code&gt;exec format error&lt;/code&gt; when trying to run the image.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6️⃣ Solution: Native ARM64 Build
&lt;/h2&gt;

&lt;p&gt;Compile directly inside the VM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/u2vpodcast
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; u2vpodcast:arm64 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 &lt;strong&gt;Notes&lt;/strong&gt;:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5.6 GB RAM was enough to complete the build.
&lt;/li&gt;
&lt;li&gt;The single CPU made compilation slower, but it finished successfully.
&lt;/li&gt;
&lt;li&gt;The result: a native ARM64 image ready to run.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7️⃣ Docker Compose Configuration
&lt;/h2&gt;

&lt;p&gt;Two files are provided:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker-compose.yml&lt;/code&gt; → main service
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker-compose.proxy.yml&lt;/code&gt; → reverse proxy with &lt;strong&gt;Caddy&lt;/strong&gt; (automatic HTTPS)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Run both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.yml &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.proxy.yml up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  8️⃣ Verifying Operation
&lt;/h2&gt;

&lt;p&gt;Check running containers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;View logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; u2vpodcast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query the database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; u2vpodcast sqlite3 /app/db/u2vpodcast.db   &lt;span class="s2"&gt;"select count(*), coalesce(sum(listen),0) from episodes;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List processed audios:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; u2vpodcast sh &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'find /app/audios -type f | sort | tail -n 20'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  9️⃣ Hardware Limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RAM (5.6 GB)&lt;/strong&gt;: more than enough for Docker, SQLite, and ffmpeg.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU (1 Neoverse-N1 core)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Long compilations
&lt;/li&gt;
&lt;li&gt;Slow video conversions
&lt;/li&gt;
&lt;li&gt;High CPU usage with &lt;code&gt;yt-dlp&lt;/code&gt; and &lt;code&gt;ffmpeg&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Configured with &lt;code&gt;-N 1&lt;/code&gt; to process tasks sequentially.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Recommendation&lt;/strong&gt;: keep downloads and conversions serial to avoid overload.  &lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Conclusions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The VM works well thanks to sufficient RAM.
&lt;/li&gt;
&lt;li&gt;The single CPU is the only real bottleneck.
&lt;/li&gt;
&lt;li&gt;Native ARM64 build solved architecture incompatibility.
&lt;/li&gt;
&lt;li&gt;Final setup: u2vpodcast running behind &lt;strong&gt;Caddy&lt;/strong&gt; with automatic HTTPS.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🙌 Créditos y enlaces útiles
&lt;/h2&gt;

&lt;p&gt;El proyecto &lt;strong&gt;u2vpodcast&lt;/strong&gt; es desarrollado por &lt;strong&gt;Lorenzo Carbonell (Atareao)&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://atareao.es/" rel="noopener noreferrer"&gt;Author’s website: Atareao&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📌 &lt;a href="https://github.com/usuario/u2vpodcast" rel="noopener noreferrer"&gt;u2vpodcast GitHub repository&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>arm64</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Informe-Tutorial: Instalación y Compilación de u2vpodcast en una VM Oracle Linux (ARM64)</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Wed, 24 Sep 2025 20:02:49 +0000</pubDate>
      <link>https://forem.com/ivajofranc/informe-tutorial-instalacion-y-compilacion-de-u2vpodcast-en-una-vm-oracle-linux-arm64-41pj</link>
      <guid>https://forem.com/ivajofranc/informe-tutorial-instalacion-y-compilacion-de-u2vpodcast-en-una-vm-oracle-linux-arm64-41pj</guid>
      <description>&lt;h1&gt;
  
  
  📘 Tutorial: Instalación y compilación de u2vpodcast en una VM Oracle Linux (ARM64)
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/ivajofranc/report-tutorial-installing-and-compiling-u2vpodcast-on-an-oracle-linux-vm-arm64-c15"&gt;🇬🇧 Also read this post in English&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Objetivo
&lt;/h2&gt;

&lt;p&gt;Documentar la instalación y compilación del proyecto &lt;strong&gt;u2vpodcast&lt;/strong&gt; en una máquina virtual ARM64 con recursos limitados, usando &lt;strong&gt;Oracle Linux 8.10&lt;/strong&gt; y Docker.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 Datos técnicos de la máquina virtual
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SO:&lt;/strong&gt; Oracle Linux Server 8.10
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kernel:&lt;/strong&gt; Linux 5.4.x
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arquitectura:&lt;/strong&gt; ARM64 (aarch64)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU:&lt;/strong&gt; 1 núcleo Neoverse-N1 (ARMv8)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAM:&lt;/strong&gt; 5,6 GiB
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swap:&lt;/strong&gt; 4 GiB
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disco:&lt;/strong&gt; 46 GiB totales (~50% libre)
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 &lt;strong&gt;Interpretación&lt;/strong&gt;: La RAM es suficiente para compilar y ejecutar contenedores. El principal cuello de botella es la CPU única, que ralentiza compilaciones y procesamientos.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ Preparación inicial del sistema
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf update &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; git curl wget unzip &lt;span class="nb"&gt;tar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🐳 Instalación de Docker y Docker Compose
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; docker-ce docker-ce-cli containerd.io
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; docker

docker &lt;span class="nt"&gt;--version&lt;/span&gt;
docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📂 Clonar el proyecto u2vpodcast
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/usuario/u2vpodcast.git
&lt;span class="nb"&gt;cd &lt;/span&gt;u2vpodcast
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚠️ Problema inicial: incompatibilidad de arquitectura
&lt;/h2&gt;

&lt;p&gt;La imagen oficial estaba compilada para &lt;strong&gt;amd64&lt;/strong&gt;, lo que en ARM64 genera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;exec format error
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔧 Solución: compilación nativa en ARM64
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/u2vpodcast
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; u2vpodcast:arm64 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Gracias a los &lt;strong&gt;5.6 GB de RAM&lt;/strong&gt;, la compilación fue estable aunque más lenta por la CPU única.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Configuración de Docker Compose
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;docker-compose.yml&lt;/strong&gt; → servicio principal
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;docker-compose.proxy.yml&lt;/strong&gt; → proxy inverso con Caddy (HTTPS automático)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.yml &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.proxy.yml up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Verificación de funcionamiento
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker ps
docker logs &lt;span class="nt"&gt;-f&lt;/span&gt; u2vpodcast

docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; u2vpodcast sqlite3 /app/db/u2vpodcast.db   &lt;span class="s2"&gt;"select count(*), coalesce(sum(listen),0) from episodes;"&lt;/span&gt;

docker &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; u2vpodcast sh &lt;span class="nt"&gt;-lc&lt;/span&gt; &lt;span class="s1"&gt;'find /app/audios -type f | sort | tail -n 20'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚡ Impacto de las limitaciones de hardware
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RAM (5.6 GB):&lt;/strong&gt; suficiente.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CPU (1 core):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Compilaciones largas
&lt;/li&gt;
&lt;li&gt;Conversión de vídeos lenta
&lt;/li&gt;
&lt;li&gt;Uso intensivo en ffmpeg y yt-dlp
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 Recomendación: mantener procesos en serie y evitar paralelismo.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Conclusiones
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Instalación funcional en VM ARM64.
&lt;/li&gt;
&lt;li&gt;Docker y Caddy operativos con HTTPS.
&lt;/li&gt;
&lt;li&gt;Compilación nativa resolvió incompatibilidad de arquitectura.
&lt;/li&gt;
&lt;li&gt;Principal limitación: la CPU única.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🙌 Créditos y enlaces útiles
&lt;/h2&gt;

&lt;p&gt;El proyecto &lt;strong&gt;u2vpodcast&lt;/strong&gt; es desarrollado por &lt;strong&gt;Lorenzo Carbonell (Atareao)&lt;/strong&gt;.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 &lt;a href="https://atareao.es" rel="noopener noreferrer"&gt;Web oficial de Atareao&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;a href="https://github.com/atareao/u2vpodcast" rel="noopener noreferrer"&gt;Repositorio en GitHub de u2vpodcast&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>docker</category>
      <category>arm64</category>
      <category>linux</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Tutorial: Dual Boot Arch Linux + Windows 11 on UEFI Systems</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Wed, 27 Aug 2025 15:49:36 +0000</pubDate>
      <link>https://forem.com/ivajofranc/tutorial-dual-boot-arch-linux-windows-11-on-uefi-systems-5dpd</link>
      <guid>https://forem.com/ivajofranc/tutorial-dual-boot-arch-linux-windows-11-on-uefi-systems-5dpd</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2803423&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tutorial:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Dual&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Boot&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Arch&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Linux&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;+&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Windows&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;11&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;UEFI&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Systems"&lt;/span&gt;
&lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;archlinux"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;windows11"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dualboot"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tutorial"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;series&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Fixed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;It&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Don't&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Know&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;How"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Step-by-step&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tutorial&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;install&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Arch&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Linux&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;alongside&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Windows&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;11&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dual&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;boot&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;mode&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;with&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;UEFI&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;GRUB,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;without&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;breaking&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;your&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;existing&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;installation."&lt;/span&gt;
&lt;span class="na"&gt;canonical_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/ivajofranc/tutorial-dual-boot-arch-linux-windows-11-on-uefi-systems-5dpd"&lt;/span&gt;
&lt;span class="na"&gt;cover_image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihfsj83k7whyvxlnamwe.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Tutorial: Dual Boot Arch Linux + Windows 11 on UEFI Systems
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/ivajofranc/tutorial-instalar-arch-linux-en-dual-boot-con-windows-11-35d5"&gt;🇪🇸 Lee también este post en español&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This tutorial documents how to install &lt;strong&gt;Arch Linux&lt;/strong&gt; alongside &lt;strong&gt;Windows 11&lt;/strong&gt; in dual boot mode, including GRUB setup, browser installation, and tools like Python.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Step-by-Step Guide (Practical Walkthrough)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Preparation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Enter the laptop BIOS (e.g., Asus: &lt;code&gt;F2&lt;/code&gt; or &lt;code&gt;Del&lt;/code&gt;) and set boot from USB.
&lt;/li&gt;
&lt;li&gt;Download the official Arch Linux ISO:
👉 &lt;a href="https://archlinux.org/download/" rel="noopener noreferrer"&gt;https://archlinux.org/download/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Create a bootable USB (e.g., with &lt;strong&gt;Rufus&lt;/strong&gt;, &lt;strong&gt;balenaEtcher&lt;/strong&gt;, or &lt;code&gt;dd&lt;/code&gt;).
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  2. Installation with &lt;code&gt;archinstall&lt;/code&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Boot from the USB.
&lt;/li&gt;
&lt;li&gt;Connect to the internet:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   iwctl
   station wlan0 connect NETWORK_NAME
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run the guided installer:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   archinstall
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Choose:

&lt;ul&gt;
&lt;li&gt;Region and language
&lt;/li&gt;
&lt;li&gt;Disk and partitioning scheme (&lt;strong&gt;do not erase Windows&lt;/strong&gt;)
&lt;/li&gt;
&lt;li&gt;Recommended base packages
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  3. Partition Setup
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create partitions for:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;/boot/efi&lt;/strong&gt; → mount on Windows’ existing EFI partition
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;/&lt;/strong&gt; (root)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;swap&lt;/strong&gt; (optional)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;/home&lt;/strong&gt; (optional)
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. GRUB Installation and Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Install GRUB and tools:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   pacman &lt;span class="nt"&gt;-S&lt;/span&gt; grub os-prober efibootmgr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Edit &lt;code&gt;/etc/default/grub&lt;/code&gt; to enable &lt;code&gt;os-prober&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nv"&gt;GRUB_DISABLE_OS_PROBER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Regenerate configuration:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   grub-mkconfig &lt;span class="nt"&gt;-o&lt;/span&gt; /boot/grub/grub.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;To make Windows the default system, edit &lt;code&gt;/etc/default/grub&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nv"&gt;GRUB_DEFAULT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Windows Boot Manager (on /dev/nvme0n1pX)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(replace with the correct entry detected by GRUB)&lt;/em&gt;  &lt;/p&gt;




&lt;h3&gt;
  
  
  5. Browser Installation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firefox&lt;/strong&gt; (official repository):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; firefox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Chrome&lt;/strong&gt; (AUR):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  yay &lt;span class="nt"&gt;-S&lt;/span&gt; google-chrome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Edge&lt;/strong&gt; (AUR):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  yay &lt;span class="nt"&gt;-S&lt;/span&gt; microsoft-edge-stable-bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  6. Python and Tools Installation
&lt;/h3&gt;

&lt;p&gt;One command to install everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; python python-pip python-setuptools python-wheel python-virtualenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Issues and Solutions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GRUB didn’t show and booted straight into Windows&lt;/strong&gt; → Fixed by enabling &lt;code&gt;os-prober&lt;/code&gt; and regenerating &lt;code&gt;grub.cfg&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows didn’t boot&lt;/strong&gt; → Regenerated GRUB correctly.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arch showed as default in GRUB&lt;/strong&gt; → Set &lt;code&gt;GRUB_DEFAULT&lt;/code&gt; to make Windows the default system.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partitioning confusion&lt;/strong&gt; → Recommended mounting Windows EFI and creating new partitions for Arch.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Arch Linux official documentation → &lt;a href="https://wiki.archlinux.org/" rel="noopener noreferrer"&gt;https://wiki.archlinux.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Archinstall (official installer) → &lt;a href="https://wiki.archlinux.org/title/Archinstall" rel="noopener noreferrer"&gt;https://wiki.archlinux.org/title/Archinstall&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dual boot with Windows → &lt;a href="https://wiki.archlinux.org/title/Dual_boot_with_Windows" rel="noopener noreferrer"&gt;https://wiki.archlinux.org/title/Dual_boot_with_Windows&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GRUB → &lt;a href="https://wiki.archlinux.org/title/GRUB" rel="noopener noreferrer"&gt;https://wiki.archlinux.org/title/GRUB&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AUR (Arch User Repository) → &lt;a href="https://aur.archlinux.org/" rel="noopener noreferrer"&gt;https://aur.archlinux.org/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>archlinux</category>
      <category>windows11</category>
      <category>dualboot</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Tutorial: Instalar Arch Linux en dual boot con Windows 11</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Wed, 27 Aug 2025 15:49:34 +0000</pubDate>
      <link>https://forem.com/ivajofranc/tutorial-instalar-arch-linux-en-dual-boot-con-windows-11-35d5</link>
      <guid>https://forem.com/ivajofranc/tutorial-instalar-arch-linux-en-dual-boot-con-windows-11-35d5</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2803422&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tutorial:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Instalar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Arch&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Linux&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dual&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;boot&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;con&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Windows&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;11"&lt;/span&gt;
&lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;archlinux"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;windows11"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dualboot"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tutorial"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;series&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Lo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Arreglé&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;No&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Sé&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Cómo"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Guía&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;práctica&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;paso&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;paso&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;para&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;instalar&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Arch&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Linux&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;dual&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;boot&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;con&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Windows&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;11,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;configurando&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;GRUB,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;navegadores,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Python&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;resolviendo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;problemas&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;comunes."&lt;/span&gt;
&lt;span class="na"&gt;canonical_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/ivajofranc/tutorial-instalar-arch-linux-en-dual-boot-con-windows-11-35d5"&lt;/span&gt;
&lt;span class="na"&gt;cover_image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fihfsj83k7whyvxlnamwe.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Tutorial: Instalar Arch Linux en dual boot con Windows 11
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/ivajofranc/tutorial-dual-boot-arch-linux-windows-11-on-uefi-systems-5dpd"&gt;🇬🇧 Also read this post in English&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este tutorial documenta cómo instalar &lt;strong&gt;Arch Linux&lt;/strong&gt; junto a &lt;strong&gt;Windows 11&lt;/strong&gt; en modo dual boot, incluyendo configuración de GRUB, instalación de navegadores y herramientas como Python.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Pasos secuenciales (guía práctica)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Preparación
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Entrar en la BIOS del portátil (ej. Asus: &lt;code&gt;F2&lt;/code&gt; o &lt;code&gt;Supr&lt;/code&gt;) y configurar el arranque desde USB.
&lt;/li&gt;
&lt;li&gt;Descargar la ISO oficial de Arch Linux:
👉 &lt;a href="https://archlinux.org/download/" rel="noopener noreferrer"&gt;https://archlinux.org/download/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Crear un USB booteable (ej. con &lt;strong&gt;Rufus&lt;/strong&gt;, &lt;strong&gt;balenaEtcher&lt;/strong&gt; o &lt;code&gt;dd&lt;/code&gt;).
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  2. Instalación con &lt;code&gt;archinstall&lt;/code&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Iniciar desde el USB.
&lt;/li&gt;
&lt;li&gt;Conectar a Internet:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   iwctl
   station wlan0 connect NOMBRE_RED
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Ejecutar el instalador guiado:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   archinstall
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Elegir:

&lt;ul&gt;
&lt;li&gt;Región e idioma
&lt;/li&gt;
&lt;li&gt;Disco y esquema de particionado (&lt;strong&gt;no borrar Windows&lt;/strong&gt;)
&lt;/li&gt;
&lt;li&gt;Paquetes base recomendados
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  3. Configuración de particiones
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Crear particiones para:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;/boot/efi&lt;/strong&gt; → montar en la partición EFI ya existente de Windows
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;/&lt;/strong&gt; (root)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;swap&lt;/strong&gt; (opcional)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;/home&lt;/strong&gt; (opcional)
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. Instalación y configuración de GRUB
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Instalar GRUB y herramientas:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   pacman &lt;span class="nt"&gt;-S&lt;/span&gt; grub os-prober efibootmgr
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Editar &lt;code&gt;/etc/default/grub&lt;/code&gt; para habilitar &lt;code&gt;os-prober&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nv"&gt;GRUB_DISABLE_OS_PROBER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Regenerar la configuración:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   grub-mkconfig &lt;span class="nt"&gt;-o&lt;/span&gt; /boot/grub/grub.cfg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Para que Windows sea el sistema por defecto, ajustar en &lt;code&gt;/etc/default/grub&lt;/code&gt;:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nv"&gt;GRUB_DEFAULT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Windows Boot Manager (on /dev/nvme0n1pX)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(reemplazar con la entrada correcta detectada por GRUB)&lt;/em&gt;  &lt;/p&gt;




&lt;h3&gt;
  
  
  5. Instalación de navegadores
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Firefox&lt;/strong&gt; (repositorio oficial):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; firefox
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Chrome&lt;/strong&gt; (AUR):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  yay &lt;span class="nt"&gt;-S&lt;/span&gt; google-chrome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft Edge&lt;/strong&gt; (AUR):
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  yay &lt;span class="nt"&gt;-S&lt;/span&gt; microsoft-edge-stable-bin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  6. Instalación de Python y herramientas
&lt;/h3&gt;

&lt;p&gt;Un solo comando para instalar todo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; python python-pip python-setuptools python-wheel python-virtualenv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Problemas y soluciones
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GRUB no aparecía y arrancaba directo en Windows&lt;/strong&gt; → Se corrigió habilitando &lt;code&gt;os-prober&lt;/code&gt; y regenerando &lt;code&gt;grub.cfg&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows no arrancaba&lt;/strong&gt; → Se regeneró GRUB correctamente.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arch aparecía como predeterminado en GRUB&lt;/strong&gt; → Se configuró &lt;code&gt;GRUB_DEFAULT&lt;/code&gt; para que Windows fuera el sistema por defecto.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Particionado confuso&lt;/strong&gt; → Se recomendó montar la EFI de Windows y crear nuevas particiones para Arch.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔗 Enlaces útiles
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Documentación oficial de Arch Linux → &lt;a href="https://wiki.archlinux.org/" rel="noopener noreferrer"&gt;https://wiki.archlinux.org/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Archinstall (instalador oficial) → &lt;a href="https://wiki.archlinux.org/title/Archinstall" rel="noopener noreferrer"&gt;https://wiki.archlinux.org/title/Archinstall&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Dual boot con Windows → &lt;a href="https://wiki.archlinux.org/title/Dual_boot_with_Windows" rel="noopener noreferrer"&gt;https://wiki.archlinux.org/title/Dual_boot_with_Windows&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GRUB → &lt;a href="https://wiki.archlinux.org/title/GRUB" rel="noopener noreferrer"&gt;https://wiki.archlinux.org/title/GRUB&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AUR (Arch User Repository) → &lt;a href="https://aur.archlinux.org/" rel="noopener noreferrer"&gt;https://aur.archlinux.org/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>archlinux</category>
      <category>windows11</category>
      <category>dualboot</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Automation of OBS Scene Loading in Windows</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Sat, 23 Aug 2025 16:06:48 +0000</pubDate>
      <link>https://forem.com/ivajofranc/automation-of-obs-scene-loading-in-windows-22cb</link>
      <guid>https://forem.com/ivajofranc/automation-of-obs-scene-loading-in-windows-22cb</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2788202&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Automation&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;OBS&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Scene&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Loading&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Windows"&lt;/span&gt;
&lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;obs"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;powershell"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;windows"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;automation"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;series&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Fixed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;It&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Don't&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Know&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;How"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🎬&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fixed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;it&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;don’t&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;know&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;how:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Automating&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;OBS&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Scene&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Loading&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Windows&lt;/span&gt;&lt;span class="nv"&gt;   &lt;/span&gt;&lt;span class="s"&gt;🇪🇸&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Leer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;este..."&lt;/span&gt;
&lt;span class="na"&gt;canonical_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/ivajofranc/automation-of-obs-scene-loading-in-windows-26p5"&lt;/span&gt;
&lt;span class="na"&gt;cover_image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5afeg9yiacrvhcc0law.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🎬 I fixed it and I don’t know how: Automating OBS Scene Loading on Windows
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/ivajofranc/automatizacion-de-carga-de-escenas-obs-en-windows-1554"&gt;🇪🇸 Leer este post en español&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It all started with something that seemed simple: &lt;strong&gt;I wanted that every time any user logged into a PC, an OBS scene file (&lt;code&gt;scenes.json&lt;/code&gt;) would automatically be copied into their profile&lt;/strong&gt;. In theory, it was just a PowerShell script. In practice, it was another story.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 The basic PowerShell script
&lt;/h2&gt;

&lt;p&gt;First, I put together the script &lt;code&gt;copy_scenes_test.ps1&lt;/code&gt;, which basically copied the &lt;code&gt;scenes.json&lt;/code&gt; file to the OBS scenes folder in the user’s profile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\Path\Source\scenes.json"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$destDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;APPDATA&lt;/span&gt;&lt;span class="s2"&gt;\obs-studio\basic\scenes"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$dest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Join-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$destDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ChildPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"scenes.json"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$destDir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ItemType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$destDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-Null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Copy-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$dest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, right? Now I just had to make it run on &lt;strong&gt;every logon&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 First idea: the official way (GPO)
&lt;/h2&gt;

&lt;p&gt;The first solution I thought of was: &lt;strong&gt;use a GPO in Active Directory&lt;/strong&gt; to run the script at user logon.&lt;br&gt;&lt;br&gt;
On paper, perfect: centralized, controlled, with logs.&lt;br&gt;&lt;br&gt;
In reality… too heavy for just one machine. I decided to look for something simpler.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 The alternative: common startup folder
&lt;/h2&gt;

&lt;p&gt;I went for the classic startup folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  First attempt: a shortcut with &lt;code&gt;.bat&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;I made a &lt;code&gt;.bat&lt;/code&gt; that created a shortcut to run PowerShell. It worked, but with one annoying detail: &lt;strong&gt;the PowerShell window popped up&lt;/strong&gt; at logon. Not pretty.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠 The final solution: a &lt;code&gt;.vbs&lt;/code&gt; to hide it
&lt;/h2&gt;

&lt;p&gt;The trick was to use a &lt;code&gt;.vbs&lt;/code&gt; that executed the PowerShell script &lt;strong&gt;hidden&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set objShell = CreateObject("Wscript.Shell")
objShell.Run "powershell.exe -ExecutionPolicy Bypass -File \"C:\Path\copy_scenes_test.ps1\"", 0, False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then a &lt;code&gt;.bat&lt;/code&gt; to create the shortcut pointing to that &lt;code&gt;.vbs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;@echo &lt;span class="na"&gt;off&lt;/span&gt;
&lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="kd"&gt;startup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;%ProgramData%&lt;/span&gt;\Microsoft\Windows\Start &lt;span class="kd"&gt;Menu&lt;/span&gt;\Programs\Startup
&lt;span class="kd"&gt;powershell&lt;/span&gt; &lt;span class="s2"&gt;"$s=(New-Object -COM WScript.Shell).CreateShortcut('&lt;/span&gt;&lt;span class="nv"&gt;%startup%&lt;/span&gt;&lt;span class="s2"&gt;\Copy scenes test.lnk');$s.TargetPath='wscript.exe';$s.Arguments='\"&lt;/span&gt;&lt;span class="kd"&gt;C&lt;/span&gt;:\Path\hidden_test.vbs\&lt;span class="s2"&gt;"';$s.WorkingDirectory='C:\Path';$s.Save()"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now it worked: it ran at logon, with no annoying windows, and without requiring strange privileges.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Silent check
&lt;/h2&gt;

&lt;p&gt;To make sure everything was working, I added a log at the end of the &lt;code&gt;.ps1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Add-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;TEMP&lt;/span&gt;&lt;span class="s2"&gt;\obs_test_log.txt"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Copied on &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That way I could verify it without asking users.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Result
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;On every logon, the &lt;code&gt;scenes.json&lt;/code&gt; file is copied to the correct profile.
&lt;/li&gt;
&lt;li&gt;Execution is &lt;strong&gt;invisible to the user&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;No admin rights required.
&lt;/li&gt;
&lt;li&gt;No need to touch global execution policies.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: it looked like a mess, but it ended up working fine. Another case of &lt;strong&gt;“I fixed it and I don’t know how”&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>obs</category>
      <category>powershell</category>
      <category>windows</category>
      <category>automation</category>
    </item>
    <item>
      <title>Automatización de carga de escenas OBS en Windows</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Sat, 23 Aug 2025 16:06:26 +0000</pubDate>
      <link>https://forem.com/ivajofranc/automatizacion-de-carga-de-escenas-obs-en-windows-1554</link>
      <guid>https://forem.com/ivajofranc/automatizacion-de-carga-de-escenas-obs-en-windows-1554</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2788027&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Automatización&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;carga&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;escenas&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;OBS&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Windows"&lt;/span&gt;
&lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;obs"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;powershell"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;windows"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;automation"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;series&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Lo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Arreglé&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;No&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Sé&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Cómo"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🎬&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Lo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;arreglé&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;no&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sé&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;cómo:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Automatización&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;carga&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;escenas&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;OBS&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Windows&lt;/span&gt;&lt;span class="nv"&gt;   &lt;/span&gt;&lt;span class="s"&gt;🇬🇧&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Also&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;read..."&lt;/span&gt;
&lt;span class="na"&gt;canonical_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/ivajofranc/automatizacion-de-carga-de-escenas-obs-en-windows-4al2"&lt;/span&gt;
&lt;span class="na"&gt;cover_image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp5afeg9yiacrvhcc0law.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🎬 Lo arreglé y no sé cómo: Automatización de carga de escenas OBS en Windows
&lt;/h1&gt;

&lt;p&gt;🇬🇧 &lt;a href="https://dev.to/ivajofranc/automation-of-obs-scene-loading-in-windows-22cb"&gt;Also read this post in English&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Todo empezó con algo que parecía sencillo: &lt;strong&gt;quería que cada vez que cualquier usuario iniciara sesión en un PC, se copiara automáticamente un archivo de escenas de OBS (&lt;code&gt;scenes.json&lt;/code&gt;) en su perfil&lt;/strong&gt;. En teoría, solo era un script de PowerShell. En la práctica, fue otra historia.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 El script PowerShell básico
&lt;/h2&gt;

&lt;p&gt;Primero armé el script &lt;code&gt;copiar_escenas_test.ps1&lt;/code&gt;, que básicamente se encargaba de copiar el archivo &lt;code&gt;scenes.json&lt;/code&gt; a la carpeta de escenas de OBS en el perfil del usuario:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$origen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:\Ruta\Origen\scenes.json"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$destinoDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;APPDATA&lt;/span&gt;&lt;span class="s2"&gt;\obs-studio\basic\scenes"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$destino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Join-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$destinoDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ChildPath&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"scenes.json"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Test-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$destinoDir&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="n"&gt;New-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ItemType&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$destinoDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Out-Null&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="n"&gt;Copy-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$origen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Destination&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$destino&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sencillo, ¿no? Pues ahora había que hacer que se ejecutara en &lt;strong&gt;cada inicio de sesión&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Primeras ideas: la vía oficial (GPO)
&lt;/h2&gt;

&lt;p&gt;La primera solución que pensé fue: &lt;strong&gt;usar una GPO en Active Directory&lt;/strong&gt; para lanzar el script al inicio de sesión del usuario.&lt;br&gt;&lt;br&gt;
En papel, perfecto: centralizado, controlado y con logs.&lt;br&gt;&lt;br&gt;
En la realidad… demasiado pesado para un solo equipo. Decidí buscar algo más simple.&lt;/p&gt;


&lt;h2&gt;
  
  
  🚀 La alternativa: carpeta de inicio común
&lt;/h2&gt;

&lt;p&gt;Me fui por la clásica carpeta de inicio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Primer intento: un acceso directo con &lt;code&gt;.bat&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Hice un &lt;code&gt;.bat&lt;/code&gt; que creaba un acceso directo para ejecutar el PowerShell. Funcionó, pero con un detalle incómodo: &lt;strong&gt;se abría la ventana de PowerShell&lt;/strong&gt; al iniciar sesión. Visualmente quedaba feo.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠 La solución final: un &lt;code&gt;.vbs&lt;/code&gt; para esconderlo
&lt;/h2&gt;

&lt;p&gt;El truco fue interponer un &lt;code&gt;.vbs&lt;/code&gt; que ejecutara el script de PowerShell &lt;strong&gt;oculto&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Set objShell = CreateObject("Wscript.Shell")
objShell.Run "powershell.exe -ExecutionPolicy Bypass -File \"C:\Ruta\copiar_escenas_test.ps1\"", 0, False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y luego un &lt;code&gt;.bat&lt;/code&gt; para crear el acceso directo hacia ese &lt;code&gt;.vbs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;@echo &lt;span class="na"&gt;off&lt;/span&gt;
&lt;span class="kd"&gt;set&lt;/span&gt; &lt;span class="kd"&gt;startup&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;%ProgramData%&lt;/span&gt;\Microsoft\Windows\Start &lt;span class="kd"&gt;Menu&lt;/span&gt;\Programs\Startup
&lt;span class="kd"&gt;powershell&lt;/span&gt; &lt;span class="s2"&gt;"$s=(New-Object -COM WScript.Shell).CreateShortcut('&lt;/span&gt;&lt;span class="nv"&gt;%startup%&lt;/span&gt;&lt;span class="s2"&gt;\Copiar escenas test.lnk');$s.TargetPath='wscript.exe';$s.Arguments='\"&lt;/span&gt;&lt;span class="kd"&gt;C&lt;/span&gt;:\Ruta\oculto_test.vbs\&lt;span class="s2"&gt;"';$s.WorkingDirectory='C:\Ruta';$s.Save()"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahora sí: se ejecutaba al inicio de sesión, sin ventanas molestas y sin depender de privilegios raros.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Comprobación silenciosa
&lt;/h2&gt;

&lt;p&gt;Para asegurarme de que todo funcionaba, añadí un log al final del &lt;code&gt;.ps1&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Add-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$&lt;/span&gt;&lt;span class="nn"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;TEMP&lt;/span&gt;&lt;span class="s2"&gt;\obs_test_log.txt"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Copiado el &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="n"&gt;Get-Date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Así podía verificarlo sin preguntar a los usuarios.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Resultado
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cada inicio de sesión copia el archivo &lt;code&gt;scenes.json&lt;/code&gt; al perfil correcto.
&lt;/li&gt;
&lt;li&gt;La ejecución es &lt;strong&gt;invisible para el usuario&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;No requiere permisos de administrador.
&lt;/li&gt;
&lt;li&gt;No hubo que tocar políticas de ejecución globales.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En resumen: parecía un lío, pero quedó funcionando fino. Otro caso de &lt;strong&gt;“Lo arreglé y no sé cómo”&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>obs</category>
      <category>powershell</category>
      <category>windows</category>
      <category>automation</category>
    </item>
    <item>
      <title>Recovery of Microsoft Dynamics NAV 2002 R2 and SQL Server</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Mon, 18 Aug 2025 20:57:02 +0000</pubDate>
      <link>https://forem.com/ivajofranc/recovery-of-microsoft-dynamics-nav-2002-r2-and-sql-server-1n07</link>
      <guid>https://forem.com/ivajofranc/recovery-of-microsoft-dynamics-nav-2002-r2-and-sql-server-1n07</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2781896&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Recovery&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Microsoft&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Dynamics&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;NAV&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2002&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;R2&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;SQL&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Server"&lt;/span&gt;
&lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dynamicsnav"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sqlserver"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;windowsserver"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;recovery"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;series&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Fixed&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;It&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;I&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Don't&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Know&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;How"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Recovery&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Microsoft&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Dynamics&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;NAV&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2009&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;R2&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;SQL&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Server&lt;/span&gt;&lt;span class="nv"&gt;   &lt;/span&gt;&lt;span class="s"&gt;🇪🇸&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Leer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;este&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;post&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en..."&lt;/span&gt;
&lt;span class="na"&gt;canonical_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/ivajofranc/recovery-of-microsoft-dynamics-nav-2002-r2-and-sql-server-1n07"&lt;/span&gt;
&lt;span class="na"&gt;cover_image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjci633q2o59qd4yu187q.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Recovery of Microsoft Dynamics NAV 2009 R2 and SQL Server
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/ivajofranc/recuperacion-de-microsoft-dynamics-nav-2009-r2-y-sql-server-en-windows-server-2022-4gpc"&gt;🇪🇸 Leer este post en español&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 Original Environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ERP&lt;/strong&gt;: Microsoft Dynamics NAV 2009 R2 (version 6.00.32012)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: SQL Server 2008 R2 Express (32-bit)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server&lt;/strong&gt;: Windows Server 2022 Datacenter (virtual machine)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NAV Client&lt;/strong&gt;: Classic and RTC
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database restored&lt;/strong&gt;: Existing &lt;code&gt;.mdf&lt;/code&gt; and &lt;code&gt;.ldf&lt;/code&gt; files from the previous instance
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Issues Found
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SQL Server 2008 R2 x86 did not start&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Key ERRORLOG messages:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TDSSNIClient initialization failed with error 0x139f
&lt;/li&gt;
&lt;li&gt;Unable to initialize SSL support
&lt;/li&gt;
&lt;li&gt;security.dll missing or corrupt
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dependency Walker showed multiple missing dependencies (&lt;code&gt;API-MS-WIN-CORE-*&lt;/code&gt;).  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Repair and installation of SQL Server 2014 failed&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The installation returned errors in critical services (Database Engine, Reporting Services, etc.).  &lt;/p&gt;

&lt;p&gt;After repair and reboot, the service could not start due to encryption errors (&lt;code&gt;schannel.dll&lt;/code&gt;, &lt;code&gt;bcrypt.dll&lt;/code&gt;, etc.).  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SQL Server 2014 started but with severe errors&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It searched for &lt;code&gt;.mdf&lt;/code&gt; and &lt;code&gt;.ldf&lt;/code&gt; files in internal build paths like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   E:\sql12_main_t.obj.x86Release\sql\mkmastr\databases\mkmastr.proj\
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This caused the service to shut down automatically.  &lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Change of Strategy
&lt;/h2&gt;

&lt;p&gt;The following steps were decided:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Completely uninstall SQL Server 2014.
&lt;/li&gt;
&lt;li&gt;Install SQL Server 2008 R2 (x64).
&lt;/li&gt;
&lt;li&gt;Manually restore the databases from the &lt;code&gt;.mdf&lt;/code&gt; and &lt;code&gt;.ldf&lt;/code&gt; files.
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🔧 Actions Taken
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SQL Server
&lt;/h3&gt;

&lt;p&gt;Executed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;DBName&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILENAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'...mdf'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILENAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'...ldf'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="n"&gt;ATTACH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirmed data paths in:&lt;br&gt;&lt;br&gt;
&lt;code&gt;C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA&lt;/code&gt;  &lt;/p&gt;


&lt;h3&gt;
  
  
  NAV and Extended DLL
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Copied &lt;code&gt;xp_ndo_x64.dll&lt;/code&gt; into &lt;code&gt;C:\Windows\System32&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Executed:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXEC&lt;/span&gt; &lt;span class="n"&gt;sp_addextendedproc&lt;/span&gt; &lt;span class="s1"&gt;'xp_ndo_enumusergroups'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'xp_ndo_x64.dll'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  NAV License
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Loaded manually from the Classic client: &lt;strong&gt;Tools &amp;gt; License Information &amp;gt; Import&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The old license only allowed 2 companies. After importing the correct license, this was fixed.
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔐 Permissions and Errors Fixed
&lt;/h2&gt;

&lt;p&gt;Initial errors:  &lt;/p&gt;

&lt;p&gt;❌ &lt;code&gt;xp_ndo_enumusergroups&lt;/code&gt; – access denied&lt;br&gt;&lt;br&gt;
❌ &lt;code&gt;VIEW SERVER STATE&lt;/code&gt; – required by the NAV client  &lt;/p&gt;

&lt;p&gt;Solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- For a specific user&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;xp_ndo_enumusergroups&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;DOMAIN&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="k"&gt;STATE&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;DOMAIN&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;-- Or for all users:&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;xp_ndo_enumusergroups&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="k"&gt;STATE&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Connectivity from NAV Client
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Classic client connected successfully from the server.
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;From other machines, it failed due to:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Closed port
&lt;/li&gt;
&lt;li&gt;SQL Browser service stopped
&lt;/li&gt;
&lt;li&gt;User without permissions
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Checked configuration and confirmed client used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SERVER:7046/DynamicsNAV
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instance was accessible after fixes.  &lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Final Result
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Complete recovery of SQL Server 2008 R2 x64 instance.
&lt;/li&gt;
&lt;li&gt;NAV runs correctly from Classic and RTC clients.
&lt;/li&gt;
&lt;li&gt;All databases restored with their original license and fully functional users.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📁 Files Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;NAV2009R2_Data.mdf&lt;/code&gt; / &lt;code&gt;NAV2009R2_log.ldf&lt;/code&gt; (NAV database)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xp_ndo_x64.dll&lt;/code&gt; (required extended procedure)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.flf&lt;/code&gt; NAV license file
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Recommendations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Always back up &lt;code&gt;.mdf&lt;/code&gt;, &lt;code&gt;.ldf&lt;/code&gt;, and &lt;code&gt;.flf&lt;/code&gt; license files.
&lt;/li&gt;
&lt;li&gt;Document the exact recovery process for future failures.
&lt;/li&gt;
&lt;li&gt;Avoid newer SQL Server versions with NAV 2009 unless compatibility is guaranteed.
&lt;/li&gt;
&lt;li&gt;Ensure ports and services (SQL Browser, SQL Server) are always active.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dynamicsnav</category>
      <category>sqlserver</category>
      <category>windowsserver</category>
      <category>recovery</category>
    </item>
    <item>
      <title>Recuperación de Microsoft Dynamics NAV 2009 R2 y SQL Server en Windows Server 2022</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Mon, 18 Aug 2025 20:43:51 +0000</pubDate>
      <link>https://forem.com/ivajofranc/recuperacion-de-microsoft-dynamics-nav-2009-r2-y-sql-server-en-windows-server-2022-4gpc</link>
      <guid>https://forem.com/ivajofranc/recuperacion-de-microsoft-dynamics-nav-2009-r2-y-sql-server-en-windows-server-2022-4gpc</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2781883&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Recuperación&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Microsoft&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Dynamics&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;NAV&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2009&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;R2&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;SQL&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Server&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;en&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Windows&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Server&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2022"&lt;/span&gt;
&lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dynamicsnav"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sqlserver"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;windowsserver"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;recovery"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;series&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Lo&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Arreglé&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;No&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Sé&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Cómo"&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;📝&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Recuperación&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Microsoft&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Dynamics&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;NAV&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;2009&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;R2&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;SQL&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Server&lt;/span&gt;&lt;span class="nv"&gt;   &lt;/span&gt;&lt;span class="s"&gt;🇬🇧&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Also&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;read&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;this&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;post&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in..."&lt;/span&gt;
&lt;span class="na"&gt;canonical_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/ivajofranc/recuperacion-de-microsoft-dynamics-nav-2009-r2-y-sql-server-en-windows-server-2022-4gpc"&lt;/span&gt;
&lt;span class="na"&gt;cover_image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjci633q2o59qd4yu187q.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  📝 Recuperación de Microsoft Dynamics NAV 2009 R2 y SQL Server
&lt;/h1&gt;

&lt;p&gt;🇬🇧 &lt;a href="https://dev.to/ivajofranc/recovery-of-microsoft-dynamics-nav-2002-r2-and-sql-server-1n07"&gt;Also read this post in English&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Objetivo del proceso
&lt;/h2&gt;

&lt;p&gt;Restaurar el entorno de &lt;strong&gt;Microsoft Dynamics NAV 2009 R2&lt;/strong&gt; que había dejado de funcionar debido a un fallo crítico en la instancia de &lt;strong&gt;SQL Server 2008 R2 (x86)&lt;/strong&gt; en un servidor actualizado con &lt;strong&gt;Windows Server 2022 Datacenter&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ Problemas encontrados
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. SQL Server 2008 R2 x86 no arrancaba
&lt;/h3&gt;

&lt;p&gt;Mensajes clave en el ERRORLOG:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TDSSNIClient initialization failed with error 0x139f
Unable to initialize SSL support
security.dll missing or corrupt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;Dependency Walker&lt;/code&gt; mostró muchas dependencias faltantes (&lt;code&gt;API-MS-WIN-CORE-*&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Reparación e instalación de SQL Server 2014 fallida
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fallos en servicios críticos (Motor de BD, Reporting Services, etc.).
&lt;/li&gt;
&lt;li&gt;Tras reparación y reinicio, el servicio no iniciaba por errores en &lt;code&gt;schannel.dll&lt;/code&gt;, &lt;code&gt;bcrypt.dll&lt;/code&gt;, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. SQL Server 2014 arrancaba pero con errores graves
&lt;/h3&gt;

&lt;p&gt;Buscaba archivos &lt;code&gt;.mdf&lt;/code&gt; y &lt;code&gt;.ldf&lt;/code&gt; en rutas internas de compilación como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;E:\sql12_main_t.obj.x86Release\sql\mkmastr\databases\mkmastr.proj\
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El servicio se detenía automáticamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Acciones realizadas
&lt;/h2&gt;

&lt;h3&gt;
  
  
  SQL Server
&lt;/h3&gt;

&lt;p&gt;Se ejecutó:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;DATABASE&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;NombreBD&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILENAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'...mdf'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;FILENAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'...ldf'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FOR&lt;/span&gt; &lt;span class="n"&gt;ATTACH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rutas de datos confirmadas en:&lt;br&gt;&lt;br&gt;
&lt;code&gt;C:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\DATA&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  NAV y DLL extendida
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Copia de &lt;code&gt;xp_ndo_x64.dll&lt;/code&gt; a &lt;code&gt;C:\Windows\System32&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Ejecución:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXEC&lt;/span&gt; &lt;span class="n"&gt;sp_addextendedproc&lt;/span&gt; &lt;span class="s1"&gt;'xp_ndo_enumusergroups'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'xp_ndo_x64.dll'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Licencia NAV
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Importada desde cliente Classic en:
&lt;code&gt;Herramientas &amp;gt; Información de licencia &amp;gt; Importar&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;La licencia correcta permitió más de 2 empresas.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔐 Permisos y errores corregidos
&lt;/h2&gt;

&lt;p&gt;Errores iniciales:&lt;br&gt;&lt;br&gt;
❌ &lt;code&gt;xp_ndo_enumusergroups&lt;/code&gt; – acceso denegado&lt;br&gt;&lt;br&gt;
❌ &lt;code&gt;VIEW SERVER STATE&lt;/code&gt; – requerido por cliente NAV  &lt;/p&gt;

&lt;p&gt;Solución:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Para usuario específico&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;xp_ndo_enumusergroups&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;DOMINIO&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="k"&gt;STATE&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;DOMINIO&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;usuario&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="c1"&gt;-- O para todos los usuarios:&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;EXECUTE&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;xp_ndo_enumusergroups&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;GRANT&lt;/span&gt; &lt;span class="k"&gt;VIEW&lt;/span&gt; &lt;span class="n"&gt;SERVER&lt;/span&gt; &lt;span class="k"&gt;STATE&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Conectividad desde cliente NAV
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cliente Classic conectaba correctamente desde el servidor.
&lt;/li&gt;
&lt;li&gt;Desde otros equipos fallaba por:

&lt;ul&gt;
&lt;li&gt;Puerto cerrado
&lt;/li&gt;
&lt;li&gt;SQL Browser detenido
&lt;/li&gt;
&lt;li&gt;Usuario sin permisos
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Configuración final:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SERVIDOR:7046/DynamicsNAV
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ✅ Resultado final
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Instancia recuperada en &lt;strong&gt;SQL Server 2008 R2 x64&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;NAV funcionando en cliente Classic y RTC.
&lt;/li&gt;
&lt;li&gt;Todas las bases de datos restauradas con licencia original y usuarios activos.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📁 Archivos utilizados
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;TESTNAV2009R2_Data.mdf&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;TESTNAV2009R2_log.ldf&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;xp_ndo_x64.dll&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.flf&lt;/code&gt; de licencia NAV
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🛠️ Recomendaciones
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Realizar backup de &lt;code&gt;.mdf&lt;/code&gt;, &lt;code&gt;.ldf&lt;/code&gt; y licencia &lt;code&gt;.flf&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Documentar paso a paso el procedimiento de recuperación.
&lt;/li&gt;
&lt;li&gt;Evitar versiones modernas de SQL Server en NAV 2009 sin compatibilidad garantizada.
&lt;/li&gt;
&lt;li&gt;Verificar puertos y servicios (SQL Browser, SQL Server) activos permanentemente.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>dynamicsnav</category>
      <category>sqlserver</category>
      <category>windowsserver</category>
      <category>recovery</category>
    </item>
    <item>
      <title>Automatic Backup and Synchronization of All Repositories from a Git Account or Organization</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Sun, 10 Aug 2025 14:32:19 +0000</pubDate>
      <link>https://forem.com/ivajofranc/automatic-backup-and-synchronization-of-all-repositories-from-a-git-account-or-organization-2ehi</link>
      <guid>https://forem.com/ivajofranc/automatic-backup-and-synchronization-of-all-repositories-from-a-git-account-or-organization-2ehi</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2763189&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Automatic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Backup&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Synchronization&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;All&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Repositories&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Git&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Account&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Organization"&lt;/span&gt;
&lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;git"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;github"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bash"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;automation"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;series&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;I Fixed It and I Don't Know How&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Automatic&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Backup&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Synchronization&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;of&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;All&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Repositories&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Git&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Account&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or..."&lt;/span&gt;
&lt;span class="na"&gt;canonical_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/ivajofranc/automatic-backup-and-synchronization-of-all-repositories-from-a-git-account-or-organization-2ehi"&lt;/span&gt;
&lt;span class="na"&gt;cover_image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F522asln7hhm2jpp96qar.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Automatic Backup and Synchronization of All Repositories from a Git Account or Organization
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/ivajofranc/copia-de-seguridad-y-sincronizacion-automatica-de-todos-los-repositorios-de-una-cuenta-u-cj"&gt;🇪🇸 Read this post in Spanish&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this tutorial, I’ll explain how I cloned and kept &lt;strong&gt;all&lt;/strong&gt; repositories from a GitHub account/organization synchronized. It also works for GitLab, Bitbucket, or any Git server that exposes an API and supports &lt;code&gt;git clone&lt;/code&gt; and &lt;code&gt;git pull&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Goal
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Download all repositories (public and private) from an account/organization.&lt;/li&gt;
&lt;li&gt;Store them in a local folder (optionally synced with OneDrive, Dropbox, etc.).&lt;/li&gt;
&lt;li&gt;Update them with a single command (&lt;code&gt;git pull&lt;/code&gt; in each one).&lt;/li&gt;
&lt;li&gt;Log everything into a file for auditing purposes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ Environment Used
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OS&lt;/strong&gt;: Windows 10/11&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminal&lt;/strong&gt;: Git Bash (included with Git for Windows)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Required tools&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;git (pre-installed)&lt;/li&gt;
&lt;li&gt;curl (included in Git Bash)&lt;/li&gt;
&lt;li&gt;jq (&lt;a href="https://stedolan.github.io/jq/" rel="noopener noreferrer"&gt;https://stedolan.github.io/jq/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔑 Steps Taken and Lessons Learned
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Creating the Access Token
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;strong&gt;Personal Access Token (PAT)&lt;/strong&gt; in GitHub with permissions:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;repo&lt;/code&gt; (for private repos)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;read:org&lt;/code&gt; (for organizations)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt; Using the organization endpoint on a user account returned &lt;code&gt;404 Not Found&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solution:&lt;/strong&gt; Differentiate between user (&lt;code&gt;/users/username/repos&lt;/code&gt;) and organization (&lt;code&gt;/orgs/org/repos&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ Initial Cloning Script
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ORG_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Example-Organization"&lt;/span&gt;
&lt;span class="nv"&gt;OUTPUT_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;
&lt;span class="nv"&gt;REPOS_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT_DIR&lt;/span&gt;&lt;span class="s2"&gt;/repos.txt"&lt;/span&gt;
&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YOUR_TOKEN_HERE"&lt;/span&gt;

&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1

curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: token &lt;/span&gt;&lt;span class="nv"&gt;$GITHUB_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"https://api.github.com/orgs/&lt;/span&gt;&lt;span class="nv"&gt;$ORG_NAME&lt;/span&gt;&lt;span class="s2"&gt;/repos?per_page=100&amp;amp;type=all"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].clone_url'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPOS_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; repo_url&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt; &amp;lt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPOS_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Works for cloning all repos.&lt;br&gt;&lt;br&gt;
❌ Fails on repeated execution: &lt;code&gt;fatal: destination path already exists&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3️⃣ Improved for Synchronization (&lt;code&gt;git pull&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;repo_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; .git&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;/.git"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;git &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; pull
&lt;span class="k"&gt;else
    &lt;/span&gt;git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Updates if it already exists.&lt;br&gt;&lt;br&gt;
❌ Fails if folder name ≠ repo name (case sensitivity issues).&lt;/p&gt;

&lt;h3&gt;
  
  
  4️⃣ Robust Solution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;/.git"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git pull&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"⚠️ Folder &lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt; exists but is not a Git repo"&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Correctly updates all existing repos.&lt;/p&gt;

&lt;h3&gt;
  
  
  5️⃣ Logging
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;LOG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/sync-repos.log"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; - Starting synchronization"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; repo_url&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;repo_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; .git&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;/.git"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"📥 Updating &lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git pull &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;&amp;amp;1&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"📦 Cloning &lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;&amp;amp;1
    &lt;span class="k"&gt;fi
done&lt;/span&gt; &amp;lt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPOS_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; - Finished"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📂 Backup Location
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;OUTPUT_DIR="."&lt;/code&gt; → saves in the current folder.
&lt;/li&gt;
&lt;li&gt;Fixed location in Windows + Git Bash:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nv"&gt;OUTPUT_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/c/Users/username/OneDrive/Backups/github
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔄 Adapting for GitLab or Bitbucket
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitLab: &lt;code&gt;https://gitlab.com/api/v4/groups/&amp;lt;group&amp;gt;/projects&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Bitbucket: &lt;code&gt;https://api.bitbucket.org/2.0/repositories/&amp;lt;user&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Adjust authentication (Bearer token, Basic Auth, etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Final Recommendations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Test first in a sandbox folder.
&lt;/li&gt;
&lt;li&gt;Avoid spaces in paths or escape them with &lt;code&gt;\&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Handle network errors with &lt;code&gt;set -e&lt;/code&gt; or validations.
&lt;/li&gt;
&lt;li&gt;Schedule execution with &lt;strong&gt;Task Scheduler&lt;/strong&gt; (Windows) or &lt;strong&gt;cron&lt;/strong&gt; (Linux).
&lt;/li&gt;
&lt;li&gt;Keep logs for historical records.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📌 Useful Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/rest" rel="noopener noreferrer"&gt;Official GitHub API Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stedolan.github.io/jq/" rel="noopener noreferrer"&gt;jq - JSON processor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/doc" rel="noopener noreferrer"&gt;Git - Official Manual&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>bash</category>
      <category>automation</category>
    </item>
    <item>
      <title>Copia de seguridad y sincronización automática de todos los repositorios de una cuenta u organización Git</title>
      <dc:creator>Ivaj O'Franc</dc:creator>
      <pubDate>Sun, 10 Aug 2025 14:32:18 +0000</pubDate>
      <link>https://forem.com/ivajofranc/copia-de-seguridad-y-sincronizacion-automatica-de-todos-los-repositorios-de-una-cuenta-u-cj</link>
      <guid>https://forem.com/ivajofranc/copia-de-seguridad-y-sincronizacion-automatica-de-todos-los-repositorios-de-una-cuenta-u-cj</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2763188&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Copia&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;seguridad&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sincronización&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;automática&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;todos&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;los&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;repositorios&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;una&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;cuenta&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;u&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;organización&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Git"&lt;/span&gt;
&lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;git&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;github&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;bash&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;automatizacion&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;series&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Lo Arreglé y No Sé Cómo&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Copia&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;seguridad&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;y&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;sincronización&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;automática&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;todos&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;los&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;repositorios&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;de&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;una&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;cuenta&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;u..."&lt;/span&gt;
&lt;span class="na"&gt;canonical_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://dev.to/ivajofranc/copia-de-seguridad-y-sincronizacion-automatica-de-todos-los-repositorios-de-una-cuenta-u-cj"&lt;/span&gt;
&lt;span class="na"&gt;cover_image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrorsebd4936cvl1dz7f.png"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Copia de seguridad y sincronización automática de todos los repositorios de una cuenta u organización Git
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://dev.to/ivajofranc/automatic-backup-and-synchronization-of-all-repositories-from-a-git-account-or-organization-2ehi"&gt;🇬🇧 Also read this post in English&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En este tutorial te cuento cómo cloné y mantuve sincronizados &lt;strong&gt;todos&lt;/strong&gt; los repositorios de una cuenta/organización GitHub, pero que también funciona para GitLab, Bitbucket o cualquier servidor Git que exponga una API y soporte &lt;code&gt;git clone&lt;/code&gt; y &lt;code&gt;git pull&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Objetivo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Descargar todos los repositorios (públicos y privados) de una cuenta/organización.&lt;/li&gt;
&lt;li&gt;Guardarlos en una carpeta local (opcionalmente sincronizada con OneDrive, Dropbox, etc.).&lt;/li&gt;
&lt;li&gt;Actualizarlos con un solo comando (&lt;code&gt;git pull&lt;/code&gt; en cada uno).&lt;/li&gt;
&lt;li&gt;Registrar todo en un archivo de log para auditoría.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ Entorno usado
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SO&lt;/strong&gt;: Windows 10/11&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terminal&lt;/strong&gt;: Git Bash (incluido con Git para Windows)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Herramientas necesarias&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;git (instalado previamente)&lt;/li&gt;
&lt;li&gt;curl (incluido en Git Bash)&lt;/li&gt;
&lt;li&gt;jq (&lt;a href="https://stedolan.github.io/jq/" rel="noopener noreferrer"&gt;https://stedolan.github.io/jq/&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔑 Pasos realizados y aprendizajes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Creación del token de acceso
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Crear un &lt;strong&gt;Personal Access Token (PAT)&lt;/strong&gt; en GitHub con permisos:

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;repo&lt;/code&gt; (para repos privados)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;read:org&lt;/code&gt; (para organizaciones)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Problema:&lt;/strong&gt; usar el endpoint de organización en una cuenta de usuario devolvía &lt;code&gt;404 Not Found&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Solución:&lt;/strong&gt; diferenciar entre usuario (&lt;code&gt;/users/usuario/repos&lt;/code&gt;) y organización (&lt;code&gt;/orgs/org/repos&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ Script inicial de clonado
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;ORG_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Organizacion-Ejemplo"&lt;/span&gt;
&lt;span class="nv"&gt;OUTPUT_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;
&lt;span class="nv"&gt;REPOS_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT_DIR&lt;/span&gt;&lt;span class="s2"&gt;/repos.txt"&lt;/span&gt;
&lt;span class="nv"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"TOKEN_AQUI"&lt;/span&gt;

&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$OUTPUT_DIR&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1

curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: token &lt;/span&gt;&lt;span class="nv"&gt;$GITHUB_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"https://api.github.com/orgs/&lt;/span&gt;&lt;span class="nv"&gt;$ORG_NAME&lt;/span&gt;&lt;span class="s2"&gt;/repos?per_page=100&amp;amp;type=all"&lt;/span&gt; | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.[].clone_url'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPOS_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; repo_url&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt; &amp;lt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPOS_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Funciona para clonar todos los repos.&lt;br&gt;&lt;br&gt;
❌ Falla al repetir ejecución: &lt;code&gt;fatal: destination path already exists&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3️⃣ Mejora para sincronizar (&lt;code&gt;git pull&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;repo_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; .git&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;/.git"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;git &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; pull
&lt;span class="k"&gt;else
    &lt;/span&gt;git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Actualiza si ya existe.&lt;br&gt;&lt;br&gt;
❌ Falla si nombre de carpeta ≠ nombre repo (mayúsculas/minúsculas).&lt;/p&gt;

&lt;h3&gt;
  
  
  4️⃣ Solución robusta
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;/.git"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
    &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git pull&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"⚠️ Carpeta &lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt; existe pero no es repo Git"&lt;/span&gt;
&lt;span class="k"&gt;else
    &lt;/span&gt;git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Actualiza correctamente todos los repos existentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  5️⃣ Registro en log
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;LOG_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/sync-repos.log"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; - Iniciando sincronización"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="nb"&gt;read&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; repo_url&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
    &lt;/span&gt;&lt;span class="nv"&gt;repo_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;basename&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; .git&lt;span class="si"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;/.git"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"📥 Actualizando &lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git pull &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;&amp;amp;1&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else
        &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"📦 Clonando &lt;/span&gt;&lt;span class="nv"&gt;$repo_name&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        git clone &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$repo_url&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; 2&amp;gt;&amp;amp;1
    &lt;span class="k"&gt;fi
done&lt;/span&gt; &amp;lt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$REPOS_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; - Finalizado"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$LOG_FILE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📂 Ubicación de las copias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;OUTPUT_DIR="."&lt;/code&gt; → se guarda en la carpeta actual.
&lt;/li&gt;
&lt;li&gt;Ubicación fija en Windows + Git Bash:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nv"&gt;OUTPUT_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/c/Users/usuario/OneDrive/Backups/github
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔄 Adaptar para GitLab o Bitbucket
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitLab: &lt;code&gt;https://gitlab.com/api/v4/groups/&amp;lt;grupo&amp;gt;/projects&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Bitbucket: &lt;code&gt;https://api.bitbucket.org/2.0/repositories/&amp;lt;usuario&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ajustar autenticación (Bearer token, Basic Auth, etc.).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💡 Recomendaciones finales
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Probar primero en carpeta de pruebas.
&lt;/li&gt;
&lt;li&gt;Evitar espacios en rutas o escaparlos con &lt;code&gt;\&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Controlar errores de red con &lt;code&gt;set -e&lt;/code&gt; o validaciones.
&lt;/li&gt;
&lt;li&gt;Programar ejecución con &lt;strong&gt;Task Scheduler&lt;/strong&gt; (Windows) o &lt;strong&gt;cron&lt;/strong&gt; (Linux).
&lt;/li&gt;
&lt;li&gt;Respaldar logs para histórico.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📌 Enlaces de interés
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/rest" rel="noopener noreferrer"&gt;Documentación oficial de la API de GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stedolan.github.io/jq/" rel="noopener noreferrer"&gt;jq - JSON processor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://git-scm.com/doc" rel="noopener noreferrer"&gt;Git - Manual oficial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>bash</category>
      <category>automatizacion</category>
    </item>
  </channel>
</rss>
