user80641: Note: This is a reference question (but feel free to write answers of your own!)

My Arduino takes too long to start up, I need to use the space taken up by the bootloader and I don't want a brown-out to be able to move the program counter to bootloader code, which could lead to my code being corrupted.
I considered buying an Arduino programmer, but since I already have an Uno lying around doing nothing, I would rather use that as a programmer.
I found a few guides on the internet, but most of them leave important details out and aren't specific enough.
So, how can I upload a sketch without a bootloader, using another Arduino as a programmer?

user80641: There are a few guides on the internet that explain how to do this, but I've
found that most of them contain too much ambiguity or leave important details
out. This is my attempt at writing a short but complete guide that's easy to
follow.
Prerequisites

The board that will run your sketch
A board that will act as a programmer (a.k.a. "ISP")
7 wires
Any small capacitor

Steps
Programming the programmer
First, you'll need to upload the ArduinoISP sketch to the programmer. Here's
how:

In the Arduino IDE, press Alt+F and open Examples ->
11.ArduinoISP -> ArduinoISP.
Plug in the programmer board (USB).
Press Alt+T and set "Board" to your programmer
board's type and "Port" to your programmer board's serial port.
Press Ctrl+U to upload the sketch to your programmer.

Connecting the boards
Then you need to connect the programmer to the board that will run your sketch.

Unplug the programmer board. This is to prevent accidental short-circuits.
Connect pins GND, 10, MOSI, MISO, SCK and 5V of the programmer to pins
GND, RESET, MOSI, MISO, SCK and 5V of the board that will run your
sketch, respectively. Pins MOSI, MISO and SCK correspond to pins 11, 12 and
13, respectively, on the Uno and the Nano. Consult your board's datasheet if
you're uncertain.
Connect the capacitor between pins 5V and RESET of the programmer board. This
is to prevent it from auto-resetting while programming.
Plug in the programmer board. You will never need to plug in the board that
will run your sketch.

Uploading your sketch
The order of these steps is important due to a bug in the Arduino IDE.

Press Alt+T and set "Board" to the board that will run
your sketch's type, "Port" to your programmer board's serial port and
"Programmer" to "Arduino as ISP".
Open the sketch you would like to upload.
Press Ctrl+Shift+U to upload the sketch using the programmer.

Troubleshooting
If something went wrong, press Ctrl+, and enable verbose
"compilation" and "upload" and repeat the step that went wrong. Look out for
these error messages:
avrdude: stk500_recv(): programmer is not responding
Followed by something similar to:
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xe0

Remove the capacitor before uploading a sketch to your programmer board.
avrdude: Yikes!  Invalid device signature.
Scroll up and copy the line that looks similar to the following:
...avrdude -C...avrdude.conf -v -V -p... -c... -P... -b... -Uflash:w:....hex:i

Paste it into a terminal and add  -F to the end. You can reuse this command
every time you upload the same sketch.
The upload seems to succeed but my sketch is still running the same code!
If the board that runs your sketch's CPU clock is slower than 1MHz (e.g. your
sketch modifies the CPU prescaler), you need to change (1000000/6) in the
ArduinoISP sketch to something slower and re-upload the sketch to your
programmer.

80641: <p><em>Note: This is a reference question (but feel free to write answers of your own!)</em></p>
<hr />
<p>My Arduino takes too long to start up, I need to use the space taken up by the bootloader and I don't want a brown-out to be able to move the program counter to bootloader code, which could lead to my code being corrupted.</p>
<p>I considered buying an Arduino programmer, but since I already have an Uno lying around doing nothing, I would rather use that as a programmer.</p>
<p>I found a few guides on the internet, but most of them leave important details out and aren't specific enough.</p>
<p>So, how can I upload a sketch without a bootloader, using another Arduino as a programmer?</p>
 80641: <p>There are a few guides on the internet that explain how to do this, but I've
found that most of them contain too much ambiguity or leave important details
out. This is my attempt at writing a short but complete guide that's easy to
follow.</p>
<h2>Prerequisites</h2>
<ul>
<li>The board that will run your sketch</li>
<li>A board that will act as a programmer (a.k.a. &quot;ISP&quot;)</li>
<li>7 wires</li>
<li>Any small capacitor</li>
</ul>
<h2>Steps</h2>
<h3>Programming the programmer</h3>
<p>First, you'll need to upload the ArduinoISP sketch to the programmer. Here's
how:</p>
<ol>
<li>In the Arduino IDE, press <kbd>Alt</kbd>+<kbd>F</kbd> and open Examples -&gt;
11.ArduinoISP -&gt; ArduinoISP.</li>
<li>Plug in the programmer board (USB).</li>
<li>Press <kbd>Alt</kbd>+<kbd>T</kbd> and set &quot;Board&quot; to your <em>programmer</em>
board's type and &quot;Port&quot; to your <em>programmer</em> board's serial port.</li>
<li>Press <kbd>Ctrl</kbd>+<kbd>U</kbd> to upload the sketch to your programmer.</li>
</ol>
<h3>Connecting the boards</h3>
<p>Then you need to connect the programmer to the board that will run your sketch.</p>
<ol>
<li>Unplug the programmer board. This is to prevent accidental short-circuits.</li>
<li>Connect pins <strong>GND, 10, MOSI, MISO, SCK and 5V</strong> of the programmer to pins
<strong>GND, RESET, MOSI, MISO, SCK and 5V</strong> of the board that will run your
sketch, respectively. Pins MOSI, MISO and SCK correspond to pins 11, 12 and
13, respectively, on the Uno and the Nano. Consult your board's datasheet if
you're uncertain.</li>
<li>Connect the capacitor between pins 5V and RESET of the programmer board. This
is to prevent it from auto-resetting while programming.</li>
<li>Plug in the programmer board. You will never need to plug in the board that
will run your sketch.</li>
</ol>
<h3>Uploading your sketch</h3>
<p>The order of these steps is important due to a bug in the Arduino IDE.</p>
<ol>
<li>Press <kbd>Alt</kbd>+<kbd>T</kbd> and set &quot;Board&quot; to <em>the board that will run
your sketch</em>'s type, &quot;Port&quot; to your <em>programmer</em> board's serial port and
&quot;Programmer&quot; to &quot;Arduino as ISP&quot;.</li>
<li>Open the sketch you would like to upload.</li>
<li>Press <kbd>Ctrl</kbd>+<strong><kbd>Shift</kbd></strong>+<kbd>U</kbd> to upload the sketch using the programmer.</li>
</ol>
<h2>Troubleshooting</h2>
<p>If something went wrong, press <kbd>Ctrl</kbd>+<kbd>,</kbd> and enable verbose
&quot;compilation&quot; and &quot;upload&quot; and repeat the step that went wrong. Look out for
these error messages:</p>
<h3><code>avrdude: stk500_recv(): programmer is not responding</code></h3>
<p>Followed by something similar to:</p>
<pre><code>avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xe0
</code></pre>
<p>Remove the capacitor before uploading a sketch to your <em>programmer</em> board.</p>
<h3><code>avrdude: Yikes!  Invalid device signature.</code></h3>
<p>Scroll up and copy the line that looks similar to the following:</p>
<pre><code>...avrdude -C...avrdude.conf -v -V -p... -c... -P... -b... -Uflash:w:....hex:i
</code></pre>
<p>Paste it into a terminal and add <code> -F</code> to the end. You can reuse this command
every time you upload the same sketch.</p>
<h3>The upload seems to succeed but my sketch is still running the same code!</h3>
<p>If the board that runs your sketch's CPU clock is slower than 1MHz (e.g. your
sketch modifies the CPU prescaler), you need to change <code>(1000000/6)</code> in the
ArduinoISP sketch to something slower and re-upload the sketch to your
programmer.</p>
