<?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>DEV Community: Timo</title>
    <description>The latest articles on DEV Community by Timo (@tim012432).</description>
    <link>https://dev.to/tim012432</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%2F687996%2Ff03824c3-d17a-40ee-a254-067f298f4466.gif</url>
      <title>DEV Community: Timo</title>
      <link>https://dev.to/tim012432</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tim012432"/>
    <language>en</language>
    <item>
      <title>Streamline Your LaTeX Workflow with Docker and VS Code: The Ultimate Setup Guide</title>
      <dc:creator>Timo</dc:creator>
      <pubDate>Tue, 16 Sep 2025 13:30:00 +0000</pubDate>
      <link>https://dev.to/tim012432/streamline-your-latex-workflow-with-docker-and-vs-code-the-ultimate-setup-guide-3mnc</link>
      <guid>https://dev.to/tim012432/streamline-your-latex-workflow-with-docker-and-vs-code-the-ultimate-setup-guide-3mnc</guid>
      <description>&lt;p&gt;As many other students I had to write my Bachelor thesis in Latex. So I had to choose between Overleaf, the complete integrated tool for Latex work, or setting up some local writing environment myself. As I wanted to have full control over my setup and sync my work across multiple devices using Git (which is also available in a paid subscription of Overleaf), and I also kinda hate myself a bit, I decided to go with the local setup.&lt;/p&gt;

&lt;p&gt;As the work was growing more and more in terms of pages and the compilation got slower and slower, I had to think of some ways to improve and optimize the build process to make it more comfortable for me.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;The general suggestion is to use as much precompilation as possible to avoid double compilation and therefore significantly speed up the document build process. Use the draft mode to avoid the need for rendering the entire document in the first compilation steps. A possible pipeline setup that performed really good for me is as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;pdflatex precompile preamble&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;pdflatex draft&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;bibtex&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;makeglossaries&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;pdflatex draft&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;pdflatex final&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With that I was able to achieve about 1 second per page compilation time on a 60 page document with many large images.&lt;/p&gt;

&lt;p&gt;Checkout the &lt;a href="https://github.com/tim0-12432/latex-vscode-docker-template" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; for the complete setup.&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Compiling LaTeX Documents in the Earlier Days&lt;/li&gt;
&lt;li&gt;The Standard Workflow Today&lt;/li&gt;
&lt;li&gt;Measures and Benchmarks&lt;/li&gt;
&lt;li&gt;Optimizations&lt;/li&gt;
&lt;li&gt;Dockerizing the LaTeX Build&lt;/li&gt;
&lt;li&gt;Setting up VS Code for LaTeX Development&lt;/li&gt;
&lt;li&gt;Additional Notes&lt;/li&gt;
&lt;li&gt;Summary and Results&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🕰️ &lt;a&gt;&lt;/a&gt;Compiling LaTeX Documents in the Earlier Days
&lt;/h2&gt;

&lt;p&gt;As Martin Isaksson [1] described in his article, compiling LaTeX to PDF used to require several separate steps that are largely avoidable today. You would typically run &lt;code&gt;latex&lt;/code&gt; to produce a DVI file, convert that to PostScript with &lt;code&gt;dvips&lt;/code&gt;, and finally produce a PDF using &lt;code&gt;ps2pdf&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Later &lt;code&gt;dvipdfm&lt;/code&gt; and &lt;code&gt;dvipdfmx&lt;/code&gt; simplified this process a bit by allowing direct conversion from DVI to PDF. The introduction of &lt;code&gt;pdflatex&lt;/code&gt; and &lt;code&gt;xelatex&lt;/code&gt; simplified the workflow even more by allowing the direct compilation of LaTeX files to PDF.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ The Standard Workflow Today &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Today we usually use &lt;code&gt;pdfLaTeX&lt;/code&gt; (or its alternatives) in a larger process that typically includes multiple compilation steps. The exact sequence depends on document complexity and packages, but a common pattern is: [1]&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;pdfLaTeX&lt;/code&gt; parses the source and generates an &lt;code&gt;.aux&lt;/code&gt; file containing information about citations, cross-references, and glossary entries.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;BibTeX&lt;/code&gt; processes bibliography data and generates a &lt;code&gt;.bbl&lt;/code&gt; file with formatted references.&lt;/li&gt;
&lt;li&gt; &lt;code&gt;pdfLaTeX&lt;/code&gt; incorporates the generated &lt;code&gt;.bbl&lt;/code&gt; into a full document,     still containing unresolved citations and references "[?]".&lt;/li&gt;
&lt;li&gt; One or more additional &lt;code&gt;pdfLaTeX&lt;/code&gt; runs resolve cross-references and finalize the PDF output.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5bew5rne5x85bulytguz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5bew5rne5x85bulytguz.png" alt="old build process"&gt;&lt;/a&gt;&lt;/p&gt;
Fig.1 - The standard build steps today


&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  📄 &lt;code&gt;pdfLaTeX&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;This is the core tool in the described process. It uses &lt;code&gt;pdftex&lt;/code&gt; under the hood to compile LaTeX documents directly to PDF files. Alternatives that you might now are &lt;code&gt;XeLaTeX&lt;/code&gt; and &lt;code&gt;LuaLaTeX&lt;/code&gt;. First of all it generates a structure of the document described in the &lt;code&gt;.tex&lt;/code&gt; and &lt;code&gt;.sty&lt;/code&gt; files If you don’t provide any other arguments, by default it will also generate images and markup information and output it to a PDF file.&lt;/p&gt;

&lt;h3&gt;
  
  
  📚 &lt;code&gt;BibTeX&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Also an important to note tool, that is used to manage bibliographies and citations in LaTeX documents. It reads the bibliography information from the &lt;code&gt;.bib&lt;/code&gt; file and the citation information from the &lt;code&gt;.aux&lt;/code&gt; file, and generates a &lt;code&gt;.bbl&lt;/code&gt; file that contains the formatted bibliography. &lt;code&gt;bibtex&lt;/code&gt; works well together with &lt;code&gt;pdflatex&lt;/code&gt; to ensure that all citations are correctly formatted and included in the final document. &lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Measures and Benchmarks &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;In order to evaluate the optimizations I propose, I created a small benchmark script based on the template that I will provide later. The benchmark is also included in the GitHub repository. It uses a Docker container that encapsulates all dependencies and ensures a consistent environment for the tests (as far as that is even possible). The benchmark script measures the time taken for each step of the LaTeX build process so we can quantify the impact of each optimization.&lt;/p&gt;

&lt;p&gt;The machine used for the tests had the following specifications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardware&lt;/strong&gt;: AMD Ryzen 7 PRO 4750U with integrated Radeon GPU, 32 GB   RAM, Samsung 980 1 TB NVMe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Software&lt;/strong&gt;: Windows 11 24H2, TeX Live 2024 Docker image with pdfTeX 3.141592653-2.6-1.40.26.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using this system and the described benchmark we get the following results for the template document containing 18 pages:&lt;/p&gt;

&lt;p&gt;

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Total build time: 30.778 secondsAverage build time per page: 1.710 seconds

\small
\boxed{%
\begin{array}{l}
\textsf{\textbf{Total build time:} 30.778 seconds}\newline
\textsf{\textbf{Average build time per page:} 1.710 seconds}
\end{array}%
}

&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord sizing reset-size6 size5"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="boxpad"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Total build time:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 30.778 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Average build time per page:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 1.710 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="stretchy fbox"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;Thirty seconds are still pretty usable, but there is definitely room for improvement. And also keep in mind that these results will increase with growing document size.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcegyt264064rd8lms2vg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcegyt264064rd8lms2vg.png" alt="old build timeline"&gt;&lt;/a&gt;&lt;/p&gt;
Fig.2 - Today's build steps on a timeline


&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🛠️ Optimizations &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;So now let’s go through all the optimizations I tested and adopted to speed up the LaTeX build process step by step.&lt;/p&gt;

&lt;h3&gt;
  
  
  📑 Introduction to &lt;code&gt;makeglossaries&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;makeglossaries&lt;/code&gt; is a Perl script that generates an index of glossary entries for later generation of the glossary itself, but also the list of acronyms and all necessary cross-references. The tool is part of the &lt;code&gt;glossaries&lt;/code&gt; package and will be executed automatically during the LaTeX build process.&lt;/p&gt;

&lt;p&gt;Calling &lt;code&gt;makeglossaries&lt;/code&gt; explicitly during the build lets us pre-generate these indices and avoid re-generating them during repeated &lt;code&gt;pdfLaTeX&lt;/code&gt; runs, which speeds up the overall process. To use it we just have to use other declaration commands for the creation of glossaries and of course call the &lt;code&gt;makeglossaries&lt;/code&gt; command in our build process.&lt;/p&gt;

&lt;p&gt;Typical changes when switching from the no-index approach are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;\makenoidxglossaries&lt;/code&gt; with &lt;code&gt;\makeglossaries&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Replace &lt;code&gt;\printnoidxglossary&lt;/code&gt; with &lt;code&gt;\printglossary&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So of course I ran the benchmark with this change and produced the following results:&lt;/p&gt;

&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Total build time: 16.710 secondsAverage build time per page: 0.928 secondsSpeed increase: 45.7%

\small
\boxed{%
\begin{array}{l}
\textsf{\textbf{Total build time:} 16.710 seconds}\newline
\textsf{\textbf{Average build time per page:} 0.928 seconds}\newline
\textsf{\textbf{Speed increase:} 45.7\%}
\end{array}%
}

&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord sizing reset-size6 size5"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="boxpad"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Total build time:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 16.710 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Average build time per page:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 0.928 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Speed increase:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 45.7%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="stretchy fbox"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  📋 Preamble Precompilation
&lt;/h3&gt;

&lt;p&gt;Precompiling the preamble is one of the most effective ways to speed up LaTeX compilation [2]. The preamble (everything before &lt;code&gt;\begin{document}&lt;/code&gt;) usually contains many package imports and definitions. Compiling these takes most of the time. So by precompiling them beforehand we save us some time in the later repeating steps. [3]&lt;/p&gt;

&lt;p&gt;The preamble can be stored in a separate file or kept in the main document and dumped into a format file (&lt;code&gt;.fmt&lt;/code&gt;) using format-dumping utilities. The resulting &lt;code&gt;.fmt&lt;/code&gt; file is then loaded by &lt;code&gt;pdfLaTeX&lt;/code&gt;, which avoids reprocessing package code on each run. [1]&lt;/p&gt;

&lt;blockquote&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;pdflatex &lt;span class="nt"&gt;-ini&lt;/span&gt; &lt;span class="nt"&gt;-jobname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"thesis"&lt;/span&gt; &lt;span class="s2"&gt;"&amp;amp;pdflatex"&lt;/span&gt; mylatexformat.ltx thesis.tex
pdflatex &lt;span class="s2"&gt;"&amp;amp;thesis"&lt;/span&gt; thesis.tex
&lt;/code&gt;&lt;/pre&gt;
Listing.1 - PdfLaTeX commands for using a preamble precompilation



&lt;/blockquote&gt;

&lt;p&gt;Note that not every package is compatible with precompilation; test your document thoroughly after adopting this strategy.&lt;/p&gt;

&lt;p&gt;As described before, this precompilation speeds up the overall process significantly. This is also shown by the following benchmark results:&lt;/p&gt;

&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Total build time: 13.160 secondsAverage build time per page: 0.731 secondsSpeed increase: 57.2%

\small
\boxed{%
\begin{array}{l}
\textsf{\textbf{Total build time:} 13.160 seconds}\newline
\textsf{\textbf{Average build time per page:} 0.731 seconds}\newline
\textsf{\textbf{Speed increase:} 57.2\%}
\end{array}%
}

&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord sizing reset-size6 size5"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="boxpad"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Total build time:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 13.160 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Average build time per page:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 0.731 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Speed increase:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 57.2%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="stretchy fbox"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;So we already achieved a reduction in build time by the half of the original time. Not that bad.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎛️ pdfLaTeX Commandline Arguments
&lt;/h3&gt;

&lt;p&gt;There are some special command line arguments for pdfLaTeX that we can utilize to make our doument compilation faster and more efficient.&lt;/p&gt;

&lt;p&gt;One of them is the "&lt;code&gt;-interaction=batchmode&lt;/code&gt;" argument, which suppresses all interaction with the user [1], [2], [3]. This means that if there are any errors or prompts, pdfLaTeX will not stop to ask for input, making it suitable for automated builds. If you want to see the errors, you will have to open the log file, which will be generated nevertheless. But all the writing to the user terminal takes so much time that we can save by suppressing it. This leads to the following benchmark results:&lt;/p&gt;

&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Total build time: 13.225 secondsAverage build time per page: 0.735 secondsSpeed increase: 57.0%

\small
\boxed{%
\begin{array}{l}
\textsf{\textbf{Total build time:} 13.225 seconds}\newline
\textsf{\textbf{Average build time per page:} 0.735 seconds}\newline
\textsf{\textbf{Speed increase:} 57.0\%}
\end{array}%
}

&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord sizing reset-size6 size5"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="boxpad"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Total build time:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 13.225 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Average build time per page:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 0.735 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Speed increase:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 57.0%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="stretchy fbox"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;Another useful flag is the "&lt;code&gt;-draftmode&lt;/code&gt;" argument [1], [2], [3]. It tells pdfLaTeX to compile the document only draft wise, which means that it won’t generate the whole document. Instead it just generates some auxiliary files and uses the constraints of the document class to create a fast preview. This significantly reduces the compilation time as you can see:&lt;/p&gt;

&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Total build time: 16.171 secondsAverage build time per page: 0.898 secondsSpeed increase: 47.5%

\small
\boxed{%
\begin{array}{l}
\textsf{\textbf{Total build time:} 16.171 seconds}\newline
\textsf{\textbf{Average build time per page:} 0.898 seconds}\newline
\textsf{\textbf{Speed increase:} 47.5\%}
\end{array}%
}

&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord sizing reset-size6 size5"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="boxpad"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Total build time:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 16.171 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Average build time per page:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 0.898 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Speed increase:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 47.5%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="stretchy fbox"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  📚 Using &lt;code&gt;biblatex&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Replacing &lt;code&gt;BibTeX&lt;/code&gt; with &lt;code&gt;biber&lt;/code&gt; as the backend for bibliography processing via the &lt;code&gt;biblatex&lt;/code&gt; package is another avenue for optimization. &lt;code&gt;biblatex&lt;/code&gt; offers a more modern and flexible interface for bibliographies and can reduce the number of required compilation steps in many cases.&lt;/p&gt;

&lt;p&gt;I did not pursue this approach for the current project because it would have required restructuring bibliography handling across the document. Still, it is a promising option for future improvements.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 New Compilation Process
&lt;/h3&gt;

&lt;p&gt;After trying out all the different approaches, combining the techniques above yields a new compilation pipeline that balances speed and reliability. The adopted steps are as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;pdflatex precompile preamble&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;pdflatex -interaction=batchmode -draftmode&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;bibtex&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;makeglossaries&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;pdflatex -interaction=batchmode -draftmode&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt; &lt;code&gt;pdflatex&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;How these steps are connected together can be seen in the following process overview:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6i59sdl375v8o7plnfzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6i59sdl375v8o7plnfzt.png" alt="new build process"&gt;&lt;/a&gt;&lt;/p&gt;
Fig.3 - Build process with optimizations


&lt;/blockquote&gt;

&lt;p&gt;Of course the most important thing in this comparison are the benchmark results. These results clearly show the improvements achieved by the new process.&lt;/p&gt;

&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Total build time: 9.212 secondsAverage build time per page: 0.512 secondsSpeed increase: 70.1%

\small
\boxed{%
\begin{array}{l}
\textsf{\textbf{Total build time:} 9.212 seconds}\newline
\textsf{\textbf{Average build time per page:} 0.512 seconds}\newline
\textsf{\textbf{Speed increase:} 70.1\%}
\end{array}%
}

&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord sizing reset-size6 size5"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="boxpad"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Total build time:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 9.212 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Average build time per page:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 0.512 seconds&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Speed increase:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 70.1%&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="stretchy fbox"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsm1dl3oewzxr5v8lsrig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsm1dl3oewzxr5v8lsrig.png" alt="new build timeline"&gt;&lt;/a&gt;&lt;/p&gt;
Fig.4 - The optimized build steps on a timeline


&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🚢 Dockerizing the LaTeX Build &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;A very important point is the topic of installing all tools and dependencies for Latex. As I wanted to make the setup as reproducible and easy as possible (and didn’t want to install all those programs manually), I decided to use Docker for this purpose. You probably already know Docker. It’s a technique to encapsulate a whole environment, including all dependencies, you need for running an application inside a container. These container use images that define the environment’s configuration and structure. For Latex there are already some prebuilt Docker images you could use [4]. I chose the &lt;code&gt;texlive/texlive:latest&lt;/code&gt; image from &lt;a href="https://hub.docker.com/r/texlive/texlive" rel="noopener noreferrer"&gt;Docker Hub&lt;/a&gt;. This delivers for example pdflatex, bibtex and makeglossaries already installed. So instead of using the tools locally, I can run the docker container providing the same command that would normally execute in commandline [4].&lt;/p&gt;

&lt;blockquote&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"%WORKSPACE_FOLDER%:/workdir"&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; /workdir texlive/texlive:latest pdflatex thesis
&lt;/code&gt;&lt;/pre&gt;
Listing.2 - Example for running PdfLaTeX through Docker



&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧑‍💻 &lt;a&gt;&lt;/a&gt;Setting up VS Code for LaTeX Development
&lt;/h2&gt;

&lt;p&gt;So now that we have a Docker container set up for our LaTeX development, we need some text editor or IDE to write in it. For this purpose, I chose Visual Studio Code (VS Code) as it has excellent support for LaTeX through extensions. The main extension for overall Latex support is &lt;code&gt;LaTeX Workshop&lt;/code&gt; [5]. Using it you can setup pipelines and shortcuts for building your LaTeX documents efficiently. [6]&lt;/p&gt;

&lt;p&gt;VS Code provides an easy solution for managing settings and configurations for your projects. You can configure project-specific settings to customize the behavior of the editor and the LaTeX Workshop extension by creating a &lt;code&gt;.vscode/settings.json&lt;/code&gt; file in the repository [6]. This settings file can be transferred to other computers and shared with collaborators, ensuring a consistent development environment with the same configuration across different machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  📝 Additional Notes &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;For easy reuse I created a template in a GitHub repository that you can fork or clone and use by yourself. It comes with some special additional scripts and tools to enhance your LaTeX development experience even further:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic PlantUML diagram generation using the &lt;a href="https://marketplace.visualstudio.com/items?itemName=appulate.filewatcher" rel="noopener noreferrer"&gt;FileWatcher&lt;/a&gt; extension
for VS Code.&lt;/li&gt;
&lt;li&gt;Scripts that detect unused/unreferenced labels and figures in your
document.&lt;/li&gt;
&lt;li&gt;A script for PDF compression using &lt;a href="https://github.com/pts/pdfsizeopt" rel="noopener noreferrer"&gt;&lt;code&gt;pdfsizeopt&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Scripts for Markdown conversion using either &lt;a href="https://pandoc.org/" rel="noopener noreferrer"&gt;Pandoc&lt;/a&gt; or &lt;a href="https://poppler.freedesktop.org/" rel="noopener noreferrer"&gt;Poppler&lt;/a&gt; utilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔎 Further Possibilities for Experimentation
&lt;/h3&gt;

&lt;p&gt;There are some topics that might be worth looking into them deeper.&lt;/p&gt;

&lt;p&gt;For example some other build drivers like &lt;code&gt;latexmk&lt;/code&gt; or &lt;code&gt;arara&lt;/code&gt; could be explored to see if they offer any advantages over the current setup. They might provide more flexibility or additional features that could further optimize the build process. [1]&lt;/p&gt;

&lt;p&gt;For users of TikZ and PGFPlots, consider precompiling heavy diagrams to PDF. The pre-generated graphics can then be reused in subsequent runs to speed up compilation. [2], [3]&lt;/p&gt;

&lt;p&gt;If you include many large images, add an image-processing pipeline: Downscale images to the display size used in the document and convert raster images to appropriately compressed JPEGs, or prefer vector formats (PDF/SVG) where possible. These changes could significantly reduce build time. [2]&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Tips and Tricks collection
&lt;/h3&gt;

&lt;p&gt;A brief set of miscellaneous suggestions from the literature. I did not need all of these, but they may be helpful in your contexts [2].&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Consider removing &lt;code&gt;todonotes&lt;/code&gt; for performance-sensitive builds as it relies on TikZ and can noticeably slow compilation.&lt;/li&gt;
&lt;li&gt;Maintain two image variants (high-resolution for final builds, low-resolution for drafts) and switch between them in your build pipeline to speed iteration.&lt;/li&gt;
&lt;li&gt;Avoid loading heavy math packages unless your document requires their specific features.&lt;/li&gt;
&lt;li&gt;Be cautious mixing &lt;code&gt;inputenc&lt;/code&gt; and &lt;code&gt;fontenc&lt;/code&gt; as it results in slower compilation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧾 Summary and Results &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This article addresses a common and stubborn problem: a growing LaTeX project whose edit-compile cycle becomes progressively slower as content accumulates. Rather than resigning ourselves to perpetual waiting (and an unhealthy relationship with coffee), we instrumented the build, measured bottlenecks, and evaluated targeted, low-risk optimizations. In brief: precompiling the preamble and indices, applying a few well-chosen &lt;code&gt;pdfLaTeX&lt;/code&gt; flags, and using a reproducible, containerized build yield substantial time savings.&lt;/p&gt;

&lt;p&gt;Key numerical results from the template benchmark (18 pages):&lt;/p&gt;

&lt;p&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;Baseline total build time: 30.778 seconds (1.710 s/page)Combined new pipeline (precompile + flags+ prebuilt indices): 9.212 seconds (0.512 s/page);roughly a 70% speedup compared to baseline.

\boxed{%
\begin{array}{l}
\textsf{\textbf{Baseline total build time:} 30.778 seconds (1.710 s/page)}\newline
\textsf{\textbf{Combined new pipeline} (precompile + flags}\newline
\textsf{+ prebuilt indices): 9.212 seconds (0.512 s/page);}\newline
\text{roughly a 70\% speedup compared to baseline.}
\end{array}%
}

&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="boxpad"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mord"&gt;&lt;span class="mtable"&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;span class="col-align-l"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Baseline total build time:&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; 30.778 seconds (1.710 s/page)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf textbf"&gt;Combined new pipeline&lt;/span&gt;&lt;/span&gt;&lt;span class="mord textsf"&gt; (precompile + flags&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord textsf"&gt;+ prebuilt indices): 9.212 seconds (0.512 s/page);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord text"&gt;&lt;span class="mord"&gt;roughly a 70% speedup compared to baseline.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="arraycolsep"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="stretchy fbox"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;Practical takeaways (what to do now):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Precompile the preamble where possible. It removes repeated package processing and usually gives the largest single win.&lt;/li&gt;
&lt;li&gt; Pre-generate indices and glossaries (&lt;code&gt;makeglossaries&lt;/code&gt;) instead of regenerating them on each run.&lt;/li&gt;
&lt;li&gt; Use &lt;code&gt;pdfLaTeX&lt;/code&gt; flags in automated builds (&lt;code&gt;-interaction=batchmode&lt;/code&gt;) and &lt;code&gt;-draftmode&lt;/code&gt; during interactive iteration for faster feedback.&lt;/li&gt;
&lt;li&gt; Consider modern bibliography tooling (&lt;code&gt;biblatex&lt;/code&gt;+&lt;code&gt;biber&lt;/code&gt;) and precompiling heavy TikZ/PGFPlots figures into PDFs for repeatable speed improvements.&lt;/li&gt;
&lt;li&gt; Containerize the build (Docker) to make results reproducible across machines and CI.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;See the repository README for the LaTeX template, Docker instructions, and the benchmark scripts.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tim0-12432" rel="noopener noreferrer"&gt;
        tim0-12432
      &lt;/a&gt; / &lt;a href="https://github.com/tim0-12432/latex-vscode-docker-template" rel="noopener noreferrer"&gt;
        latex-vscode-docker-template
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A template implementing some optimizations to the standard Latex compilation process using VS Code and Docker containers
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
    &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Latex Template&lt;/h1&gt;

&lt;/div&gt;
    &lt;span&gt;implementing some build process optimizations using VS Code and Docker.&lt;/span&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Usage&lt;/h2&gt;

&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;Requirements: VS Code, Docker, Python&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Clone or download the repository&lt;/li&gt;
&lt;li&gt;Open folder with VS Code&lt;/li&gt;
&lt;li&gt;Copy the keybindings from within &lt;code&gt;.vscode/keybindings.json&lt;/code&gt; into the VS Code shortcuts (&lt;code&gt;Ctrl+K&lt;/code&gt; &lt;code&gt;Ctrl+S&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Apply changes to the LaTeX document&lt;/li&gt;
&lt;li&gt;Hit &lt;code&gt;Ctrl+Alt+S&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Observe the build process&lt;/li&gt;
&lt;li&gt;Open the generated PDF to view the results&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can also use this template directly through GitHub.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/tim0-12432/latex-vscode-docker-template/./src/figures/github_screenshot.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftim0-12432%2Flatex-vscode-docker-template%2F.%2Fsrc%2Ffigures%2Fgithub_screenshot.png" height="150px"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Implemented features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Pregenerate glossaries separately&lt;/li&gt;
&lt;li&gt;Precompile the preamble&lt;/li&gt;
&lt;li&gt;Use draft mode the first runs&lt;/li&gt;
&lt;li&gt;Disable console output&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Change requests, proposals or other contributions&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Feel free to contribute by opening issues or pull requests if you see some ways for further improvement.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tim0-12432/latex-vscode-docker-template" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;I hope this deep dive into LaTeX compilation helps you speed up local LaTeX writing and provides a practical alternative to Overleaf.&lt;/p&gt;

&lt;p&gt;Happy compiling.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;[1] M. Isaksson, “Optimizing Your LaTeX Workflow: A Guide to Choosing a Build System,” &lt;em&gt;Martin’s blog&lt;/em&gt;. Oct. 2023. Accessed: May 04, 2025. [Online]. Available: &lt;a href="https://blog.martisak.se/2023/10/01/compiling/" rel="noopener noreferrer"&gt;https://blog.martisak.se/2023/10/01/compiling/&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[2] L. B. Tables, “Speeding up LaTeX compilation,” &lt;em&gt;TeX - LaTeX Stack Exchange&lt;/em&gt;. Jul. 2016. Accessed: May 04, 2025. [Online]. Available: &lt;a href="https://tex.stackexchange.com/questions/8791/speeding-up-latex-compilation" rel="noopener noreferrer"&gt;https://tex.stackexchange.com/questions/8791/speeding-up-latex-compilation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[3] T. Zorman, “Speeding up LaTeX compilation.” Jan. 30, 2025. Accessed: May 04, 2025. [Online]. Available: &lt;a href="https://tony-zorman.com/posts/speeding-up-latex.html" rel="noopener noreferrer"&gt;https://tony-zorman.com/posts/speeding-up-latex.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[4] M. Isaksson, “How to annoy your co-authors: A Gitlab CI pipeline for LaTeX,” &lt;em&gt;Martin’s blog&lt;/em&gt;. May 2020. Accessed: May 04, 2025. [Online]. Available: &lt;a href="https://blog.martisak.se/2020/05/11/gitlab-ci-latex-pipeline/" rel="noopener noreferrer"&gt;https://blog.martisak.se/2020/05/11/gitlab-ci-latex-pipeline/&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[5] Fabian, “VS Code + Docker + LaTeX Setup,” &lt;em&gt;Medium&lt;/em&gt;. Jan. 2020. Accessed: May 04, 2025. [Online]. Available: &lt;a href="https://medium.com/@kombustor/vs-code-docker-latex-setup-f84128c6f790" rel="noopener noreferrer"&gt;https://medium.com/@kombustor/vs-code-docker-latex-setup-f84128c6f790&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;[6] T. J, “LaTeX + VS Code + Docker = 🚀. How to use LaTeX without installing…,” &lt;em&gt;Medium&lt;/em&gt;. Sep. 11, 2025. Accessed: May 04, 2025. [Online]. Available: &lt;a href="https://medium.com/@timju/latex-setup-with-vs-code-and-docker-612f998e1f23" rel="noopener noreferrer"&gt;https://medium.com/@timju/latex-setup-with-vs-code-and-docker-612f998e1f23&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>productivity</category>
      <category>docker</category>
      <category>vscode</category>
      <category>automation</category>
    </item>
    <item>
      <title>Markdown blog with Appwrite connection</title>
      <dc:creator>Timo</dc:creator>
      <pubDate>Thu, 05 May 2022 21:55:44 +0000</pubDate>
      <link>https://dev.to/tim012432/markdown-blog-with-appwrite-connection-fgc</link>
      <guid>https://dev.to/tim012432/markdown-blog-with-appwrite-connection-fgc</guid>
      <description>&lt;h3&gt;
  
  
  Overview of My Submission
&lt;/h3&gt;

&lt;p&gt;I wanted to learn NextJS for a longer time now and started the development of a concept of a markdown blog. When the team of appwrite and dev.to came up with this hackathon I decided to participate by adding an appwrite functionality to this blog. My idea was to store the mdx files, which are originally stored in the posts directory, in the appwrite storage database. I am programming for nearly a month now and it's finally done. You just need an appwrite container and my markdown-blog image containerized. Additional information about configuration and setup can be found in the &lt;a href="https://github.com/tim0-12432/markdown-blog" rel="noopener noreferrer"&gt;README.md&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the technological hand I am using NextJS with dynamic frontend rendering, next-MDX-remote for mdx parsing and TailwindCss for styling.&lt;/p&gt;

&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;Web2 Wizards&lt;/p&gt;

&lt;h3&gt;
  
  
  Link to Code
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tim0-12432" rel="noopener noreferrer"&gt;
        tim0-12432
      &lt;/a&gt; / &lt;a href="https://github.com/tim0-12432/markdown-blog" rel="noopener noreferrer"&gt;
        markdown-blog
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Markdown blog
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Markdown Blog&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/tim0-12432/markdown-blog/doc/images/cover.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ftim0-12432%2Fmarkdown-blog%2Fdoc%2Fimages%2Fcover.png" alt="Cover image for this repo"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/tim0-12432/markdown-blog/LICENSE.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/0843a109228053fc8a81ef07286872d016c6bb08e7d2475fd9ddbc2ee2caf8f2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f74696d302d31323433322f6d61726b646f776e2d626c6f673f636f6c6f723d626c7565266c6162656c3d4c6963656e7365266c6f676f3d676974687562267374796c653d666c6174" alt="GitHub"&gt;&lt;/a&gt;
&lt;a href="https://github.com/tim0-12432/markdown-blog/actions/workflows/docker-image.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/tim0-12432/markdown-blog/actions/workflows/docker-image.yml/badge.svg" alt="Docker Image CI"&gt;&lt;/a&gt;
&lt;a href="https://github.com/tim0-12432/markdown-blog/actions/workflows/release.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/tim0-12432/markdown-blog/actions/workflows/release.yml/badge.svg" alt="Release CI"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Motivation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;I wanted to learn NextJS for a few months. Now the time have come and I created a server for displaying markdown blog posts. So this is my first project using NextJS.&lt;/p&gt;
&lt;p&gt;When noticing the new appwrite hackathon, I decided to add a feature to store your markdown post files in a appwrite database.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation and usage&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Prerequisites&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;If you are planning to add posts via the &lt;a href="https://github.com/appwrite/appwrite" rel="noopener noreferrer"&gt;Appwrite Database&lt;/a&gt; capability, you need to have a &lt;a href="https://github.com/appwrite/appwrite" rel="noopener noreferrer"&gt;Appwrite instance&lt;/a&gt; running on your local machine or on a server.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Files should be stored in a bucket in the storage and their ids must match the file name in order to be found!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Configuration&lt;/h3&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/tim0-12432/markdown-blogconfig/configuration.json" rel="noopener noreferrer"&gt;&lt;code&gt;configuration.json&lt;/code&gt;&lt;/a&gt; in &lt;code&gt;config&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Example AppwriteDB&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-json notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;    &lt;span class="pl-ent"&gt;"appwriteDatabase"&lt;/span&gt;: {
        &lt;span class="pl-ent"&gt;"url"&lt;/span&gt;: {
            &lt;span class="pl-ent"&gt;"host"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;localhost&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
            &lt;span class="pl-ent"&gt;"port"&lt;/span&gt;: &lt;span class="pl-c1"&gt;3000&lt;/span&gt;
        },
        &lt;span class="pl-ent"&gt;"projectId"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;YOUR_PROJECT_ID&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
        &lt;span class="pl-ent"&gt;"postBucketId"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;YOUR_POST_BUCKET_ID&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
        &lt;span class="pl-ent"&gt;"apiKey"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;YOUR_API_KEY&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tim0-12432/markdown-blog" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;h4&gt;
  
  
  License
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/tim0-12432/markdown-blog/blob/main/LICENSE.md" rel="noopener noreferrer"&gt;MIT&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Appwrite dashboard
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw5fa7hi4kr6yn6oc6wop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw5fa7hi4kr6yn6oc6wop.png" alt="statistics" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Storage bucket
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxry66epzkt2ruktterq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxry66epzkt2ruktterq6.png" alt="bucket" width="601" height="773"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Markdown files
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1juh6b5c58vhrlad7rd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw1juh6b5c58vhrlad7rd.png" alt="files" width="800" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9uou7884m9p908cgt6t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9uou7884m9p908cgt6t.png" alt="file details" width="800" height="693"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Homescreen
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuj0t4vcplzz8ca09ha3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuj0t4vcplzz8ca09ha3.png" alt="homescreen desktop" width="800" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrbhu1vszd6o6ds06l5b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgrbhu1vszd6o6ds06l5b.png" alt="homescreen mobile" width="800" height="1617"&gt;&lt;/a&gt;&lt;/p&gt;





&lt;div class="ltag__user ltag__user__id__687996"&gt;
    &lt;a href="/tim012432" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F687996%2Ff03824c3-d17a-40ee-a254-067f298f4466.gif" alt="tim012432 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/tim012432"&gt;Timo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/tim012432"&gt;&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>appwritehack</category>
      <category>markdown</category>
      <category>nextjs</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Quickstart template with CI for React project</title>
      <dc:creator>Timo</dc:creator>
      <pubDate>Fri, 12 Nov 2021 16:59:48 +0000</pubDate>
      <link>https://dev.to/tim012432/quickstart-template-with-ci-for-react-project-1nde</link>
      <guid>https://dev.to/tim012432/quickstart-template-with-ci-for-react-project-1nde</guid>
      <description>&lt;h3&gt;
  
  
  My Workflow
&lt;/h3&gt;

&lt;p&gt;I created a &lt;a href="https://github.com/tim0-12432/react-ci-template"&gt;template project&lt;/a&gt; for using the GitHub workflow with a example React project.&lt;br&gt;
The workflow itself is inside the repository: &lt;a href="https://github.com/tim0-12432/react-ci-template/blob/main/.github/workflows/production.yml"&gt;production.yml&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Input:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;pull-request on main branch&lt;/li&gt;
&lt;li&gt;manual dispatch&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;
  
  
  Output:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;1.0.0-information.zip containing coverage and license report&lt;/li&gt;
&lt;li&gt;deploys build files directly on GitHub Pages&lt;/li&gt;
&lt;li&gt;creates a tag and a release and pushes the build files to the release&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Submission Category:
&lt;/h3&gt;

&lt;p&gt;DIY Deployments&lt;/p&gt;
&lt;h3&gt;
  
  
  Yaml File or Link to Code
&lt;/h3&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i3JOwpme--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev.to/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/tim0-12432"&gt;
        tim0-12432
      &lt;/a&gt; / &lt;a href="https://github.com/tim0-12432/react-ci-template"&gt;
        react-ci-template
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A template for react projects with includes linting and github actions workflow.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
CReactApp Template with CI&lt;/h1&gt;
&lt;p&gt;This project was bootstrapped with &lt;a href="https://github.com/facebook/create-react-app"&gt;Create React App&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/tim0-12432/react-ci-template/actions/workflows/production.yml"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TOiAoUYH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://github.com/tim0-12432/react-ci-template/actions/workflows/production.yml/badge.svg" alt="Production"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
Usage&lt;/h2&gt;
&lt;p&gt;To change the content of the page, just change the files in the public and src directories.&lt;/p&gt;
&lt;h2&gt;
Available Scripts&lt;/h2&gt;
&lt;p&gt;In the project directory, you can run:&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;npm start&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;Runs the app in the development mode on &lt;a href="http://localhost:3000" rel="nofollow"&gt;http://localhost:3000&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;npm test&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;Launches the test runner in the interactive watch mode.&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;npm run build&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;Builds the app for production to the &lt;code&gt;build&lt;/code&gt; folder.&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;npm run eject&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Note: this is a one-way operation. Once you &lt;code&gt;eject&lt;/code&gt;, you can’t go back!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you aren’t satisfied with the build tool and configuration choices, you can &lt;code&gt;eject&lt;/code&gt; at any time. This command will remove the single build dependency from your project.&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;npm run ci:test&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;CI: Runs the test runner in the continuous integration mode.&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;npm run ci:licenses&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;CI: Generates the license report as a csv-file.&lt;/p&gt;
&lt;h3&gt;
&lt;code&gt;npm run lint:es&lt;/code&gt;
&lt;/h3&gt;
&lt;p&gt;CI: Runs the…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/tim0-12432/react-ci-template"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tim0-12432/react-ci-template/blob/main/README.md"&gt;README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tim0-12432/react-ci-template/blob/main/.github/workflows/production.yml"&gt;WORKFLOW&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tim0-12432/react-ci-template/blob/main/LICENSE.md"&gt;LICENSE&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Production&lt;/span&gt;

&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Linting_and_tests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;matrix&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;node&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;14.x&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;15.x&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;16.x&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;install node&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ matrix.node }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;get version&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;package-version&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;martinbeentjes/npm-get-version-action@master&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;npm install&lt;/span&gt;
          &lt;span class="s"&gt;npm install -g license-report&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eslint&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run lint:es&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stylelint&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run lint:style&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;run tests&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run ci:test&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;licenses&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run ci:licenses&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;upload artifacts&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.package-version.outputs.current-version }}-information&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
            &lt;span class="s"&gt;coverage/&lt;/span&gt;
            &lt;span class="s"&gt;licenses.csv&lt;/span&gt;
          &lt;span class="na"&gt;if-no-files-found&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;error&lt;/span&gt;

  &lt;span class="na"&gt;Build_and_deploy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git checkout&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;install node&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;16.x&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;get version&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;package-version&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;martinbeentjes/npm-get-version-action@master&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm run build&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zip build files&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;montudor/action-zip@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zip -qq -r build.zip build&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;deploy&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;JamesIves/github-pages-deploy-action@4.1.1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;branch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;built-page&lt;/span&gt;
          &lt;span class="na"&gt;folder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;release&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;avakar/tag-and-release@v1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;tag_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v${{ steps.package-version.outputs.current-version }}&lt;/span&gt;
          &lt;span class="na"&gt;release_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v${{ steps.package-version.outputs.current-version }}&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;release&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;upload binaries to release&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-release-asset@v1&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;GITHUB_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;asset_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build.zip&lt;/span&gt;
          &lt;span class="na"&gt;asset_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;built-page-ready-to-deploy-v${{ steps.package-version.outputs.current-version }}.zip&lt;/span&gt;
          &lt;span class="na"&gt;asset_content_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/zip&lt;/span&gt;
          &lt;span class="na"&gt;upload_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ steps.release.outputs.upload_url }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Additional Resources / Info
&lt;/h3&gt;

&lt;p&gt;So what actions did I use in my workflow and what do the different steps in my yaml file?&lt;/p&gt;
&lt;h4&gt;
  
  
  Linting and tests
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;actions/checkout@v2&lt;/code&gt;: checks out the current branch&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;actions/setup-node@v2&lt;/code&gt;: installs few versions of NodeJS&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;martinbeentjes/npm-get-version-action&lt;/code&gt;: gets the current version of the package&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm install&lt;/code&gt;: install the dependencies used by the package&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run lint:es&lt;/code&gt;: runs linter for JS-files&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run lint:style&lt;/code&gt;: runs linter for stylesheets&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run ci:test&lt;/code&gt;: runs tests&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run ci:licenses&lt;/code&gt;: gets the licenses from used packages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;actions/upload-artifact@v2&lt;/code&gt;: uploads the generated reports as an artifact&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;
  
  
  Build and deploy
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;actions/checkout@v2&lt;/code&gt;: checks out the current branch&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;actions/setup-node@v2&lt;/code&gt;: installs NodeJS 16&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;martinbeentjes/npm-get-version-action&lt;/code&gt;: gets the current version of the package&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm install&lt;/code&gt;: install the dependencies used by the package&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;npm run build&lt;/code&gt;: builds the app for production&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;montudor/action-zip@v1&lt;/code&gt;: zips the build folder&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;JamesIves/github-pages-deploy-action@4.1.1&lt;/code&gt;: deploys the build to GitHub Pages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;avakar/tag-and-release@v1&lt;/code&gt;: creates a tag and release&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;actions/upload-release-asset@v1&lt;/code&gt;: uploads the build files to the release&lt;/li&gt;
&lt;/ol&gt;




&lt;div class="ltag__user ltag__user__id__687996"&gt;
  
    .ltag__user__id__687996 .follow-action-button {
      background-color: #000000 !important;
      color: #b8ffff !important;
      border-color: #000000 !important;
    }
  
    &lt;a href="/tim012432" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0Ake6opS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://res.cloudinary.com/practicaldev/image/fetch/s--lQav2NML--/c_fill%2Cf_auto%2Cfl_progressive%2Ch_150%2Cq_66%2Cw_150/https://dev-to-uploads.s3.amazonaws.com/uploads/user/profile_image/687996/f03824c3-d17a-40ee-a254-067f298f4466.gif" alt="tim012432 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/tim012432"&gt;Timo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/tim012432"&gt;&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Created with ❤️ by &lt;a href="https://hashnode.com/@tim012432"&gt;Timo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>actionshackathon21</category>
    </item>
    <item>
      <title>Do not put skill bars on your resume!</title>
      <dc:creator>Timo</dc:creator>
      <pubDate>Wed, 10 Nov 2021 21:10:00 +0000</pubDate>
      <link>https://dev.to/tim012432/do-not-put-skill-bars-on-your-resume-lh6</link>
      <guid>https://dev.to/tim012432/do-not-put-skill-bars-on-your-resume-lh6</guid>
      <description>&lt;p&gt;I see a lot of programming beginners doing webdev-projects building skill bars. When I was starting and done programming for about one or two years, in my perception skill bars were common sense to show your skill level. So in a result, something similar to this (Fig.1) had found its way onto my first real resume.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffv55mravbmx25emqiyvp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffv55mravbmx25emqiyvp.png" alt="my resume skills" width="410" height="292"&gt;&lt;/a&gt;&lt;/p&gt;
Fig.1 - Skill section on my resume


&lt;/blockquote&gt;

&lt;p&gt;Nowadays, I think &lt;strong&gt;skill bars are an illogical style of presentation and completely meaningless&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visually attracting
&lt;/h2&gt;

&lt;p&gt;A few years ago, my opinion was completely different. I thought, skill bars are a cute-looking point system and a creative way to visualize your skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meaningless
&lt;/h2&gt;

&lt;p&gt;But even if it looks cute, it is completely meaningless.&lt;br&gt;
When creating a skill bar you are also creating some kind of point scale system, e.g. 10 points, 5 points or 100 percent.&lt;br&gt;
But how do you compare your skills to that? To rate your skills equally on your scale, you would need to create some sort of criteria and equal tests for each one which measures the skill on your 10 point - or whatever - scale.&lt;/p&gt;



&lt;p&gt;When not showing your criteria, the employer will not know what the criteria for your rating were. Do you even know?&lt;br&gt;
Also, the point system makes no sense.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Example: English 4/5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Answer one question: What is the difference between 3/5 and 4/5?&lt;br&gt;
I don't know, probably there is no difference because the points mean nothing.&lt;/p&gt;
&lt;h2&gt;
  
  
  Equal difficulty
&lt;/h2&gt;

&lt;p&gt;Seeing such skill bars gives the impression that every skill has the same difficulty.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Example:
    Java 4/5
    Python 3/5
    HTML 5/5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Basically saying it's a unique point scale comparing completely different languages or skills on that scale, no matter of difference in quality and difficulty.&lt;br&gt;
It makes no sense!&lt;/p&gt;
&lt;h2&gt;
  
  
  Shows design skills
&lt;/h2&gt;

&lt;p&gt;Some people say skill bars show web-development or design skills because&lt;br&gt;
graphics like skill bars stand out of the application or resume and maybe bias the employer positively.&lt;br&gt;
But even people on &lt;a href="https://www.notion.so/Shows-webdev-or-design-skills-fd50be7b52d04d6ca3c42de98d667302#e4fc30e7dac74f0bb1d3f58beda4fe6a" rel="noopener noreferrer"&gt;Reddit&lt;/a&gt; dislike this trend!&lt;/p&gt;
&lt;h2&gt;
  
  
  Waste of space
&lt;/h2&gt;

&lt;p&gt;Skill bars use a lot of space which could be used much better, e.g. to provide more information about your skill set. When considering graphics &lt;a href="https://www.notion.so/wasting-space-visually-distracting-317d9042b17d47e68f93f41fac7268b9#27abee85b03f49739ca784d10221e55d" rel="noopener noreferrer"&gt;can't be read by machines&lt;/a&gt; (ATS systems), skill bars seem to be quite a large &lt;a href="https://www.notion.so/wasting-space-visually-distracting-317d9042b17d47e68f93f41fac7268b9#fc813acb0d3e4aba9c21f4a4a0dc8482" rel="noopener noreferrer"&gt;waste of space&lt;/a&gt;.&lt;br&gt;
Also, graphics on a resume distract from the professional appearance of your resume and make it look more like a flyer - what you probably not want.&lt;/p&gt;
&lt;h2&gt;
  
  
  Subjective and unreliable
&lt;/h2&gt;

&lt;p&gt;But the biggest issue with skill bars is that they are subjective and unreliable because people are bad in rating themselves.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frebd0iejrnbhpnczilwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frebd0iejrnbhpnczilwm.png" alt="rate yourself" width="720" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;According to &lt;a href="https://qr.ae/pGDsZP" rel="noopener noreferrer"&gt;Emilie Thewon&lt;/a&gt;, a Marketing and Business Development Director,"self-evaluating their own performance, competences and skills is flawed and inaccurate" for the most people.&lt;br&gt;
Studies show that intelligent people often think deeper about the problem and rather rate themselves lower for tasks they are good at, where less intelligent persons or people who have less expertise in a certain topic rather rate themselves higher than an objective rating would be.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57yhv1eodgvvjdbjnwpt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F57yhv1eodgvvjdbjnwpt.png" alt="lies on job applications" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;
Fig.2 - Most common lies on job applications according to CNBC (https://www.cnbc.com/2020/02/19/how-many-job-seekers-lie-on-their-job-application.html) originally from Checkster (https://www.checkster.com/are_you_hiring_charlatans)


&lt;/blockquote&gt;

&lt;p&gt;To accomplish this, many people cheat in their resume to have a favorable effect on the employer. As you can see in Fig.2 misrepresenting yourself in the application seems to be almost normal nowadays.&lt;/p&gt;
&lt;h2&gt;
  
  
  Solutions
&lt;/h2&gt;

&lt;p&gt;In my opinion the only thing what matters in the skill section is what you have worked with before.&lt;br&gt;
So a better practice is just listing your skills and show your exact skill level suitable to the type of skill, e.g. "basic", "proficiency level" or "experienced". Also, you can add facts like certifications, degree or licenses.&lt;br&gt;
If your resume is online you can show projects, link them and maybe add what you used to complete that projects.&lt;/p&gt;







&lt;blockquote&gt;
&lt;p&gt;People using skill bars are "generally quite intelligent but have very poor social skills and lack self-awareness" ~ &lt;a href="https://qr.ae/pGDseB" rel="noopener noreferrer"&gt;Brian Grubba, District Manager&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  &lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Please feel free to write your opinion in the comment section!&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__687996"&gt;
    &lt;a href="/tim012432" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F687996%2Ff03824c3-d17a-40ee-a254-067f298f4466.gif" alt="tim012432 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/tim012432"&gt;Timo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/tim012432"&gt;&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/tim0-12432" rel="noopener noreferrer"&gt;tim0-12432&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Why it is not important what programming languages you know in 2021</title>
      <dc:creator>Timo</dc:creator>
      <pubDate>Sat, 23 Oct 2021 18:52:27 +0000</pubDate>
      <link>https://dev.to/tim012432/why-it-is-not-important-what-programming-languages-you-know-in-2021-4gl</link>
      <guid>https://dev.to/tim012432/why-it-is-not-important-what-programming-languages-you-know-in-2021-4gl</guid>
      <description>&lt;p&gt;There are about &lt;a href="https://careerkarma.com/blog/how-many-coding-languages-are-there/" rel="noopener noreferrer"&gt;8945&lt;/a&gt; programming languages out there existing. When speaking of notable widely used languages, there are about &lt;a href="https://careerkarma.com/blog/how-many-coding-languages-are-there/" rel="noopener noreferrer"&gt;245&lt;/a&gt; of them. According to &lt;a href="https://en.wikipedia.org/wiki/Comparison_of_web_frameworks" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt; there are about 130 web-frameworks extending the feature set of the most used languages.&lt;/p&gt;



&lt;p&gt;If you know every language and are able to use it properly, you are a genius. In my opinion, it is even impossible to know every framework. So let's think the other way round. When it does not matter what programming language you know, &lt;strong&gt;it might be better to learn understanding technical patterns and paradigms and adapt these learning languages or techniques quickly,&lt;/strong&gt; because they are too many to know all.&lt;/p&gt;



&lt;p&gt;The amount of languages and frameworks is simply too large that it is even impossible to achieve basic knowledge in every one of them.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1es04dq9zpuomyqhhg5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft1es04dq9zpuomyqhhg5.PNG" alt="evolution of languages" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

    Fig.1 - Most important programming languages over time according to tiobe at https://www.tiobe.com/tiobe-index



&lt;/blockquote&gt;

&lt;p&gt;Even if it were possible, the feature set and diversity of languages evolves so fast you would have to learn more than 24/7 to keep being updated. As you can see in figure 2 the average update amount of the three languages is one per year. Java gets even two new versions per year since 2018. The updates add new features and paradigms, and let old features deprecate by changing the compiler or the structure of the standard library. So you will constantly have to stay up-to-date and learn these new things anyway, but in the same way this constant stream of new versions makes it difficult to keep updated on multiple languages or frameworks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9sptzb5hjikzl1zmqfss.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9sptzb5hjikzl1zmqfss.PNG" alt="update releases" width="775" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

    Fig.2 - Releases of updates for Java, Python and C# over the last 11 years



&lt;/blockquote&gt;

&lt;p&gt;But that in my opinion is not important. All languages are pretty similar in structure and coding patterns, e.g. statements and loops. Some of them are even similar in syntax, especially if they are descended from each other.&lt;br&gt;
So if you start with one language and know it well, you will feel pretty familiar with other languages as well.&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="c"&gt;# Bash if statement&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt; gt 100 &lt;span class="o"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;Your param is greater than 100!
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// C++ if statement&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cin&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Your param is greater than 100!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// C# if statement&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Convert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToInt32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReadLine&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Your param is greater than 100!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Java if statement&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;console&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;readLine&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Your param is greater than 100!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python if statement
&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;input&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Your param is greater than 100!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Decisions whether to learn this language or that are really pointless and self-defeating.&lt;br&gt;
Later, you may have to use the other language anyway.&lt;br&gt;
So just learn the one which seems more suitable to you at the moment - also good advice for beginners.&lt;/p&gt;

&lt;p&gt;It makes more sense just to learn the technique you need at the moment for a specific task. So start with the language you need for the project you want to work on and try to understand the rules and patterns of programming more than just learning the syntax of the languages.&lt;/p&gt;



&lt;p&gt;So overall when you think about it, it is nonsense to say: "I know this language, this and that". If you ever want to say which languages or frameworks you worked with, express that you have experience in working with it. In my opinion, it's the experience that matters. If you are programming for years, you will be quite an expert in one language and adjust to a new language quickly, or you are the one who has tried a lot of languages and switched between them, so you have experience in adjusting to a new language. But from my point of view both types are on an equal level of experience and probably skills. This implies that apparently the language does not matter and what they had programmed with.&lt;/p&gt;

&lt;p&gt;But that's good news for beginners, too.&lt;br&gt;
It implies, as well, that it doesn't matter that you have no experience. By just programming, you will gain experience and expertise.&lt;/p&gt;
&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;It does not matter what programming languages you know or what frameworks you are able to use or not. What matters is that you are able to learn concepts quickly and adapt them to learn new languages and techniques.&lt;/p&gt;





&lt;p&gt;&lt;em&gt;Please feel free to write your opinion in the comment section!&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__687996"&gt;
    &lt;a href="/tim012432" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F687996%2Ff03824c3-d17a-40ee-a254-067f298f4466.gif" alt="tim012432 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/tim012432"&gt;Timo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/tim012432"&gt;&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/tim0-12432" rel="noopener noreferrer"&gt;tim0-12432&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>career</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why copying tutorial projects does not help you to learn React</title>
      <dc:creator>Timo</dc:creator>
      <pubDate>Wed, 13 Oct 2021 06:13:31 +0000</pubDate>
      <link>https://dev.to/tim012432/why-copying-tutorial-projects-does-not-help-you-to-learn-react-jhn</link>
      <guid>https://dev.to/tim012432/why-copying-tutorial-projects-does-not-help-you-to-learn-react-jhn</guid>
      <description>&lt;p&gt;One year ago I needed React for a Project at work. I have wanted to learn it before, but I never had the time to do it. Now the time has come and I decided to dive deeper into web development with the React framework.&lt;/p&gt;

&lt;p&gt;First of all I decided to watch some tutorials on YouTube because that's what you usually do when learning new programming things.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jdrkx3qj0n7ch6heltf.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jdrkx3qj0n7ch6heltf.PNG" alt="screenshot of youtube tutorials" width="800" height="359"&gt;&lt;/a&gt;&lt;br&gt;
Fig.1 - YouTube search results for React Tutorials&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My first decision was a very informative tutorial by &lt;a href="https://www.youtube.com/watch?v=pCA4qpQDZD8" rel="noopener noreferrer"&gt;DevEd&lt;/a&gt; where he shows how to develop a simple to-do app.&lt;br&gt;
After that, I watched more and more tutorials and copied their projects.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In my opinion that was not the best start I could have had. By just copying and following a tutorial, you do not learn the basics. It would be better to learn concepts and understand how the framework itself works than just copy lines of code.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Comparison
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Todo App
&lt;/h3&gt;

&lt;p&gt;My first ever React project.&lt;br&gt;
Obviously not only mine.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgqikqm8n9l6ie8gx5dh8.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgqikqm8n9l6ie8gx5dh8.PNG" alt="todo app by Chirag" width="800" height="805"&gt;&lt;/a&gt;&lt;br&gt;
Fig.2 - TodoList by &lt;a href="https://chiragsaini.github.io/Todo-List/" rel="noopener noreferrer"&gt;Chirag&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dgud54gthnp9ne9viv7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dgud54gthnp9ne9viv7.PNG" alt="todo app by Auxfuse" width="800" height="806"&gt;&lt;/a&gt;&lt;br&gt;
Fig.3 - TodoList by &lt;a href="https://auxfuse.github.io/todoR/" rel="noopener noreferrer"&gt;Auxfuse&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbbkqssbz7y69xexh6db.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbbbkqssbz7y69xexh6db.PNG" alt="todo app by mine" width="800" height="816"&gt;&lt;/a&gt;&lt;br&gt;
Fig.4 - &lt;a href="https://todos.tim0-12432.me/" rel="noopener noreferrer"&gt;My version of the TodoList&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As you see, the difference between the compared screenshots of to-do apps is not wide.&lt;br&gt;
Even if I conquered my weaker self and extended the feature set, it seems like they are a one to one copy of each other. No wonder.&lt;/p&gt;
&lt;h3&gt;
  
  
  Corona Tracker
&lt;/h3&gt;

&lt;p&gt;In Covid-19 pandemic, I wanted to create a page where I can find all important key numbers for Germany.&lt;br&gt;
For that I followed a tutorial by Javascript Mastery and extended it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5p5nz3n9cy9utft0j2u6.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5p5nz3n9cy9utft0j2u6.PNG" alt="corona tracker by Javascript Mastery" width="800" height="807"&gt;&lt;/a&gt;&lt;br&gt;
Fig.5 - Corona Tracker by &lt;a href="https://covid19statswebsite.netlify.app/" rel="noopener noreferrer"&gt;JavascriptMastery&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6y5cyyxy1727erhx2al.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp6y5cyyxy1727erhx2al.PNG" alt="corona tracker by Mine" width="800" height="814"&gt;&lt;/a&gt;&lt;br&gt;
Fig.6 - &lt;a href="https://covid.tim0-12432.me/" rel="noopener noreferrer"&gt;My version of the Corona Tracker&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The difference is a bit wider than in the above example. Most likely because of the added dark mode (#hateAgainstLightMode xD). But with a closer look you can see the components are very similar.&lt;/p&gt;
&lt;h2&gt;
  
  
  Better approach
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Search for a good project at the skill level that suits you&lt;/li&gt;
&lt;li&gt;Implement the idea in the way you image it&lt;/li&gt;
&lt;li&gt;Search for solutions or best practices on the internet whenever you don't know how to achieve a certain behavior, or you want a better way of implementation&lt;/li&gt;
&lt;li&gt;As a sideline you can watch videos explaining little concepts such as states, context and so on&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;For a first entry point to learning a new framework or language, it could help to copy a tutorial and enhance it a bit afterwards.&lt;br&gt;
But after copying one or two projects, copying does not lead you to getting better, learning the technique really or understanding basic principles.&lt;br&gt;
&lt;strong&gt;Try to write code yourself.&lt;/strong&gt;&lt;/p&gt;





&lt;p&gt;&lt;em&gt;Please feel free to write your opinion in the comment section!&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;div class="ltag__user ltag__user__id__687996"&gt;
    &lt;a href="/tim012432" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F687996%2Ff03824c3-d17a-40ee-a254-067f298f4466.gif" alt="tim012432 image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/tim012432"&gt;Timo&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/tim012432"&gt;&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/tim0-12432" rel="noopener noreferrer"&gt;tim0-12432&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>react</category>
      <category>codenewbie</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
