diff --git a/boards/capes/cape-interface-spec.rst b/boards/capes/cape-interface-spec.rst
index beb41b18707d31cdedc1bca21ea9a0e2f33b36a7..0db956cd59de6c1543a590007e8ed4b2876ef5d4 100644
--- a/boards/capes/cape-interface-spec.rst
+++ b/boards/capes/cape-interface-spec.rst
@@ -490,7 +490,7 @@ Cape interface specification provides |I2C| controller device links for userspac
 |I2C| overlay example
 =====================
 
-.. code-block:: devicetree
+.. code-block:: dts
    :linenos:
    :caption: Example device tree overlay to enable I2C driver
    :name: bone_cape_spec_i2c_example
@@ -584,7 +584,7 @@ SPI bone bus nodes allow creating compatible overlays for Black, AI and AI-64.
 
    Some boards may implement CS using a GPIO.
 
-.. code-block::
+.. code-block:: dts
    :linenos:
    :caption: Example device tree overlay to enable SPI driver
    :name: bone_cape_spec_spi_example
diff --git a/books/beaglebone-cookbook/02sensors/sensors.rst b/books/beaglebone-cookbook/02sensors/sensors.rst
index 521f9bd147ed4e8c34eafda14df666993d9a05f9..87515f78c7312c5fec7f4deb82d18a6f3e24b20b 100644
--- a/books/beaglebone-cookbook/02sensors/sensors.rst
+++ b/books/beaglebone-cookbook/02sensors/sensors.rst
@@ -474,6 +474,7 @@ HC-SR04 to the Bone's 5 V power supply.
 .. _sensors_hc-sr04_code:
 
 .. literalinclude:: ../code/02sensors/hc-sr04-ultraSonic.js
+   :language: js
    :caption: Driving a HC-SR04 ultrasound sensor (hc-sr04-ultraSonic.js)
    :linenos:
 
@@ -656,6 +657,7 @@ will print the current location every time the GPS outputs it.
 .. _digital_GPS_code:
 
 .. literalinclude:: ../code/02sensors/GPS.js
+   :language: js
    :caption: Talking to a GPS with UART 4 (GPS.js)
    :linenos:
 
@@ -883,6 +885,7 @@ using the kernel driver. First you need to install the i2c module.
 .. _js_i2ctmp101_code:
 
 .. literalinclude:: ../code/02sensors/i2ctmp101.py
+   :language: py
    :caption: Reading an |I2C|  device (i2cTemp.py)
    :linenos:
 
diff --git a/books/beaglebone-cookbook/03displays/displays.rst b/books/beaglebone-cookbook/03displays/displays.rst
index 5fe497ff4e40ec7170276a36ae8848b4a3fc792c..ce99608314e05c03c82cb68c39e426c69342f103 100644
--- a/books/beaglebone-cookbook/03displays/displays.rst
+++ b/books/beaglebone-cookbook/03displays/displays.rst
@@ -382,6 +382,7 @@ LED matrix display (matrixLEDi2c.py)
 =====================================
 
 .. literalinclude:: ../code/03displays/matrixLEDi2c.py
+   :language: py
    :caption: LED matrix display (matrixLEDi2c.py)
    :linenos:
 
diff --git a/books/beaglebone-cookbook/04motors/motors.rst b/books/beaglebone-cookbook/04motors/motors.rst
index d28b0465c69566ceac13ec0e62edcacefb51ca27..94bd69f1aec2a8b7c70d999b8180f5f19ce10420 100644
--- a/books/beaglebone-cookbook/04motors/motors.rst
+++ b/books/beaglebone-cookbook/04motors/motors.rst
@@ -143,7 +143,7 @@ Combine the code from :ref:`digital_rotaryEncoder_js` and :ref:`motors_servo`.
 .. _py_servoEncoder_code:
 
 .. literalinclude:: ../code/04motors/servoEncoder.py
-   :language: python
+   :language: py
    :caption: Code for driving a servo motor with a rotary encorder(servoEncoder.py)
    :linenos:
 
@@ -264,6 +264,7 @@ motor with a transistor (:ref:`motors_dcMotor_code`). The additional code specif
 .. _motors_h-bridge_code:
 
 .. literalinclude:: ../code/04motors/h-bridgeMotor.js
+   :language: js
    :caption: Code for driving a DC motor with an H-bridge (h-bridgeMotor.js)
    :linenos:
 
@@ -304,6 +305,7 @@ Use the code in :ref:`motors_stepperMotor_code_py` to drive the motor.
 .. _motors_stepperMotor_code_py:
 
 .. literalinclude:: ../code/04motors/bipolarStepperMotor.py
+   :language: py
    :caption: Driving a bipolar stepper motor (bipolarStepperMotor.py)
    :linenos:
 
diff --git a/books/beaglebone-cookbook/06iot/iot.rst b/books/beaglebone-cookbook/06iot/iot.rst
index 3044fd247492093c8ae3876b454cec2bad58c810..fdf32cfa9f5da13fd68427541c5ef482a06d35b9 100644
--- a/books/beaglebone-cookbook/06iot/iot.rst
+++ b/books/beaglebone-cookbook/06iot/iot.rst
@@ -207,6 +207,7 @@ function. Now, let’s create a new Python script. We will name it app1.py:
 .. _flask_app1:
 
 .. literalinclude:: ../code/06iot/flask/app1.py
+   :language: py
    :caption: app1.py
    :linenos:
 
@@ -271,6 +272,7 @@ Let’s use a new Python script named *app2.py*.
 .. _flask_app2:
 
 .. literalinclude:: ../code/06iot/flask/app2.py
+   :language: py
    :caption: A simple Flask-based web server to read a GPIO (app2.py)
    :linenos:
 
@@ -333,6 +335,7 @@ Create a new Python script and name it *app3.py*.
 .. _flask_app3:
 
 .. literalinclude:: ../code/06iot/flask/app3.py
+   :language: py
    :caption: A simple Flask-based web server to read a GPIO (app3.py)
    :linenos:
 
@@ -477,6 +480,7 @@ plots the buffer is **analogInContinuous.py**.
 .. _analog_code:
 
 .. literalinclude:: ../code/06iot/analogInContinuous.py
+   :language: py
    :caption: Code to read and plot a continuous analog input(analogInContinuous.py)
    :linenos:
 
@@ -629,6 +633,7 @@ Then add the code in :ref:`networking_nodemailer_code` to a file named ``emailTe
 .. _networking_nodemailer_code:
 
 .. literalinclude:: ../code/06iot/emailTest.py
+   :language: py
    :caption: Sending email using nodemailer (emailtTest.py)
    :linenos:
 
@@ -743,6 +748,7 @@ Because your Bone is on the network, it's not hard to access the current weather
 .. _networking_weather_code:
 
 .. literalinclude:: ../code/06iot/weather.py
+   :language: py
    :caption: Code for getting current weather conditions (``weather.py``)
    :linenos:
 
@@ -865,6 +871,7 @@ The code in :ref:`networking_pushbutton_code` sends a tweet whenever a button is
 .. _networking_pushbutton_code:
 
 .. literalinclude:: ../code/06iot/twitterPushbutton.js
+   :language: js
    :caption: Tweet when a button is pushed (twitterPushbutton.js)
    :linenos:
 
diff --git a/books/beaglebone-cookbook/07kernel/kernel.rst b/books/beaglebone-cookbook/07kernel/kernel.rst
index 25f4a90d9142713863ac5c8d5d0fcf2498d39825..4c2e3618b112978abaca3f06e9cb40dc56355f0d 100644
--- a/books/beaglebone-cookbook/07kernel/kernel.rst
+++ b/books/beaglebone-cookbook/07kernel/kernel.rst
@@ -523,6 +523,7 @@ Solution
 .. _kernel_hello_patch:
 
 .. literalinclude:: ../code/07kernel/hello.patch
+   :language: patch
    :caption: Simple kernel patch file (hello.patch)
    :linenos:
 
diff --git a/books/beaglebone-cookbook/11misc/misc.rst b/books/beaglebone-cookbook/11misc/misc.rst
index a0681fecbfa14ea96b3341f6a561b4b81c9dcd2a..67a6b1f0c7c626abd4f6b6ca4b44be07cec9a48d 100644
--- a/books/beaglebone-cookbook/11misc/misc.rst
+++ b/books/beaglebone-cookbook/11misc/misc.rst
@@ -219,51 +219,65 @@ You can always sudo from debian, but sometimes it's nice to login as root.
 Here's how to setup root so you can login from your host without a password.
 
 .. code-block:: bash
-    
-    host$ ssh bone
 
+    host$ ssh bone
     bone$ sudo -i
-    
     root@bone# nano /etc/ssh/sshd_config
 
 Search for the line
 
+.. code-block:: bash
+
     #PermitRootLogin prohibit-password
 
 and change it to
 
+.. code-block:: bash
+
     PermitRootLogin yes
 
 (The # symbol indicates a comment and must be removed in order for the setting to take effect.)
 
 Save the file and quit the editor. Restart ssh so it will reread the file.
 
+.. code-block:: bash
+
     root@bone# systemctl restart sshd
 
 And assign a password to root.
 
+.. code-block:: bash
+
     root@bone# passwd
 
 Now open another window on your host computer and enter:
 
+.. code-block:: bash
+
     host$ ssh-copy-id root@bone
 
 and enter the root password. Test it with:
 
+.. code-block:: bash
+
     host$ ssh root@bone
 
 You should be connected without a password. 
 Now go back to the Bone and turn off the root password access.
 
+.. code-block:: bash
+
     root@bone# nano /etc/ssh/sshd_config
 
 Restore the line:
 
+.. code-block:: bash
+
     #PermitRootLogin prohibit-password
 
 and restart sshd.
 
-.. code-block:: 
+.. code-block:: bash
 
     root@bone# systemctl restart sshd
     root@bone# exit
@@ -295,7 +309,7 @@ it display on the host.
 
 #.  First ssh to the Beagle using the `-X` flag.
 
-.. code-block:: 
+.. code-block:: bash
 
     host$ ssh -X debian@10.0.5.10
 
@@ -334,7 +348,7 @@ https://serverfault.com/questions/362529/how-can-i-sniff-the-traffic-of-remote-m
 First login to the Beagle and install tcpdump. Use your Beagle's 
 IP address.  
 
-.. code-block:: 
+.. code-block:: bash
 
     host$ ssh 192.168.7.2
     bone$ sudo apt update
@@ -343,7 +357,7 @@ IP address.
 
 Next, create a named pipe and have wireshark read from it.
 
-.. code-block:: 
+.. code-block:: bash
 
     host$ mkfifo /tmp/remote
     host$ wireshark -k -i /tmp/remote
@@ -351,7 +365,7 @@ Next, create a named pipe and have wireshark read from it.
 Then, run tcpdump over ssh on your remote machine and redirect the 
 packets to the named pipe:
 
-.. code-block:: 
+.. code-block:: bash
 
     host$ ssh root@192.168.7.2 "tcpdump -s 0 -U -n -w - -i any not port 22" > /tmp/remote
 
@@ -755,22 +769,15 @@ Run the following to download and setup Sphinx locally.
     bone$ sudo apt upgrade
     bone$ sudo apt install -y \
         make git wget \
-        doxygen graphviz librsvg2-bin\
+        doxygen librsvg2-bin\
         texlive-latex-base texlive-latex-extra latexmk texlive-fonts-recommended \
         python3 python3-pip \
-        python3-sphinx python3-sphinx-rtd-theme python3-sphinxcontrib.svg2pdfconverter \
-        python3-pil \
         imagemagick-6.q16 librsvg2-bin webp \
         texlive-full texlive-latex-extra texlive-fonts-extra \
         fonts-freefont-otf fonts-dejavu fonts-dejavu-extra fonts-freefont-ttf
-    bone$ python3 -m pip install --upgrade pip
-    bone$ pip install -U sphinx_design 
-    bone$ pip install -U sphinxcontrib-images
-    bone$ pip install -U sphinx-serve
-       
-These instructions came from `lorforlinux 
-<https://beagleboard.slack.com/archives/C8S7EKZC2/p1684940872699269>`_
-on the Beagleboard Slack channel.
+    bone$ ./venv-build-env.sh
+
+In case of any problems, checkout `Beagleboard Forum <https://forum.beagleboard.org/>`_.
 
 Now go to the cloned *docs.beagleboard.io* repository folder and do the following.
 To clean build directory:
diff --git a/books/pru-cookbook/03details/details.rst b/books/pru-cookbook/03details/details.rst
index 2a1fca7f40263c962a4e05c7e2159989366c8da0..03f6be3c86dcc20b552bce973e275916dbf6962e 100644
--- a/books/pru-cookbook/03details/details.rst
+++ b/books/pru-cookbook/03details/details.rst
@@ -214,6 +214,7 @@ and then configure the pins accordingly.
 
 
 .. literalinclude:: ../code/06io/setup.sh
+   :language: bash
    :caption: setup.sh
    :linenos:
 
@@ -467,6 +468,7 @@ If you are on the Black or Pocket you'll need to run the following script.
 
 
 .. literalinclude:: ../code/03details/servos_setup.sh
+   :language: bash
    :caption: servos_setup.sh
    :linenos:
 
@@ -497,6 +499,7 @@ everything is already configured for you.
 If you are on the Black or Pocket you'll need to run the following script.
 
 .. literalinclude:: ../code/03details/encoder_setup.sh
+   :language: bash
    :caption: encoder_setup.sh
    :linenos:
 
diff --git a/books/pru-cookbook/05blocks/blocks.rst b/books/pru-cookbook/05blocks/blocks.rst
index 8ffe9acc21eb48c9ce71236e68f89d9318121992..dcddf03b9444348eb2d3a5399f892f58044a65e5 100644
--- a/books/pru-cookbook/05blocks/blocks.rst
+++ b/books/pru-cookbook/05blocks/blocks.rst
@@ -313,6 +313,7 @@ the code work.  Fortunately the Makefile always runs it.
 .. _blocks_write_init_pins:
 
 .. literalinclude:: ../code/05blocks/write_init_pins.sh
+   :language bash
    :caption: write_init_pins.sh
    :linenos:
 
@@ -855,6 +856,7 @@ will make the period half as long.
 Here's the code (``pwm7.pru0.c``)
 
 .. literalinclude:: ../code/05blocks/pwm7.pru0.c
+   :language: c
    :caption: pwm7.pru0.c Using Both PRUs
    :linenos:
 
@@ -863,6 +865,7 @@ Here's the code (``pwm7.pru0.c``)
 Be sure to run ``pwm7_setup.sh`` to get the correct pins configured.
 
 .. literalinclude:: ../code/05blocks/pwm7_setup.sh
+   :language: bash
    :caption: pwm7_setup.sh
    :linenos:
 
@@ -1047,6 +1050,7 @@ These values came from :ref:`blocks_mapping_bits`.
 Configure the pins with ``input_setup.sh``.
 
 .. literalinclude:: ../code/05blocks/input_setup.sh
+   :language: bash
    :caption: input_setup.sh
    :linenos:
 
@@ -1055,6 +1059,7 @@ Configure the pins with ``input_setup.sh``.
 The following code reads the input pin and writes its value to the output pin.
 
 .. literalinclude:: ../code/05blocks/input.pru0.c
+   :language: c
    :caption: input.pru0.c
    :linenos:
 
@@ -1720,6 +1725,7 @@ high-level view of how to drive the display.
 .. _blocks_rgb_python:
 
 .. literalinclude:: ../code/05blocks/rgb_python.py
+   :language bash
    :caption: rgb_python.py - Python code for driving RGB LED matrix
    :linenos:
 
@@ -1730,6 +1736,7 @@ Be sure to run the :ref:`blocks_rgb_setup` script before running the python code
 .. _blocks_rgb_setup:
 
 .. literalinclude:: ../code/05blocks/rgb_python_setup.sh
+   :language bash
    :caption: rgb_python_setup.sh
    :linenos:
 
diff --git a/books/pru-cookbook/06io/io.rst b/books/pru-cookbook/06io/io.rst
index e4a93302df9c6086f5c7c0e5972037bfe3a5408d..95a69ed4eb06e615478f5df5f706134fed1a8e73 100644
--- a/books/pru-cookbook/06io/io.rst
+++ b/books/pru-cookbook/06io/io.rst
@@ -98,6 +98,7 @@ GPIO pins, but it's a slower access.
 This code will toggle ``P9_11`` on and off. Here's the setup file.
 
 .. literalinclude:: ../code/06io/setup.sh
+   :language bash
    :caption: setup.sh
    :linenos:
 
diff --git a/conf.py b/conf.py
index 5acdb58f5c162175af2ed3380c2baec1f7b37adc..6c70e08c874116be18a1bb7b700ba7faeb75c078 100644
--- a/conf.py
+++ b/conf.py
@@ -40,6 +40,8 @@ extensions = [
     "sphinx.ext.imgconverter",
     "sphinx.ext.graphviz",
     "sphinx.ext.todo",
+    "sphinx.ext.autodoc",
+    "sphinx.ext.autosummary",
     "sphinx_tabs.tabs",
     "breathe",
     "sphinx_copybutton",
diff --git a/intro/beagle101/blinkLED.rst b/intro/beagle101/blinkLED.rst
index 8cd4077b3cf62dfc0c1499b9d54ef9046f30229c..47e2ec70422c21ece5fa3a20836490456693c6c4 100644
--- a/intro/beagle101/blinkLED.rst
+++ b/intro/beagle101/blinkLED.rst
@@ -441,6 +441,7 @@ The following script uses evtest to wait for the USR button to be pressed and
 then turns on the LED.
 
 .. literalinclude:: buttonEvent.sh
+    :language: bash
     :caption: buttonEvent.sh
     :linenos:
 
@@ -451,6 +452,7 @@ Try running it and pressing the USR button.
 The next script polls the USR button and toggles the LED.
 
 .. literalinclude:: buttonLED.sh
+    :language: bash
     :caption: buttonLED.sh
     :linenos:
 
diff --git a/intro/beagle101/qwiic-stemma-grove-addons.rst b/intro/beagle101/qwiic-stemma-grove-addons.rst
index 0b6e2d2faf34c51ce19b2bca26c21a70114a0ffe..f730868a340abff60f87983f991faeeb37ee0192 100644
--- a/intro/beagle101/qwiic-stemma-grove-addons.rst
+++ b/intro/beagle101/qwiic-stemma-grove-addons.rst
@@ -67,7 +67,7 @@ driver loaded. Finally, `in_illuminance0_input` comes from the
 for this type of device, a light sensor. The
 `Linux kernel ABI documentation for sysfs-bus-iio <https://www.kernel.org/doc/html/v5.19/admin-guide/abi-testing.html#abi-sys-iio-devicex-in-illuminance-input>`__ provides the definition of available data often provided by light sensor drivers.
 
-.. code-block::
+.. code-block:: bash
 
   What:		/sys/.../iio:deviceX/in_illuminance_input
   What:		/sys/.../iio:deviceX/in_illuminance_raw
diff --git a/intro/contribution/git-usage.rst b/intro/contribution/git-usage.rst
index 10062fb01f89d6b47fbf78524c42feff7e0d7bf1..253802adc47173152e2ce4b385e66ec07ef1ac48 100644
--- a/intro/contribution/git-usage.rst
+++ b/intro/contribution/git-usage.rst
@@ -439,20 +439,20 @@ in your local repository, type:
 If Jason is adding more commits to his remote branch and you want to update
 your local copy, just do:
 
-.. code-block::
+.. code-block:: bash
 
     git checkout awesomebranch  # if you are not already in branch awesomebranch pull
 
 If you later want to remove the reference to this particular branch:
 
-.. code-block::
+.. code-block:: bash
 
     git branch -r -d jkridner/awesomebranch
     Deleted remote branch jkridner/awesomebranch (#######)
 
 Or, to delete the references to all of Jason's branches:
 
-.. code-block::
+.. code-block:: bash
 
     git remote rm jkridner
     
diff --git a/projects/beagleconnect/index.rst b/projects/beagleconnect/index.rst
index c9edd084a08f3fb7a0905d259f0a81e2bfb0015e..31f72fbaa94a0f9718ae04eadc0e68ee30a4cb02 100644
--- a/projects/beagleconnect/index.rst
+++ b/projects/beagleconnect/index.rst
@@ -216,7 +216,7 @@ that is required is a reliable transport.
 
 Every 1-2 minutes, you should see something like:
 
-.. code-block::
+.. code-block:: bash
 
     ('fe80::3111:7a22:4b:1200%lowpan0', 52213, 0, 13)  '2l:7.79;'
     ('fe80::3111:7a22:4b:1200%lowpan0', 52213, 0, 13)  '4h:43.75;4t:23.11;'
@@ -912,7 +912,7 @@ Ping Linux
 
 Similarly, we can ping the Linux host from the Zephyr shell.
 
-.. code-block::
+.. code-block:: bash
 
     uart:~$ net ping --help
     ping - Ping a network host.
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..767efb557c21b578eddbd908547bc6c7696fe097
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,33 @@
+alabaster==0.7.13
+Babel==2.13.1
+breathe==4.35.0
+certifi==2023.11.17
+charset-normalizer==3.3.2
+docutils==0.18.1
+graphviz==0.20.1
+idna==3.6
+imagesize==1.4.1
+Jinja2==3.1.2
+MarkupSafe==2.1.3
+packaging==23.2
+Pillow==10.1.0
+Pygments==2.17.2
+requests==2.31.0
+setuptools==69.0.2
+snowballstemmer==2.2.0
+Sphinx==7.2.6
+sphinx-copybutton==0.5.2
+sphinx-rtd-theme==2.0.0
+sphinx-serve==1.0.1
+sphinx-tabs==3.4.4
+sphinx_design==0.5.0
+sphinxcontrib-applehelp==1.0.7
+sphinxcontrib-devhelp==1.0.5
+sphinxcontrib-htmlhelp==2.0.4
+sphinxcontrib-images==0.9.4
+sphinxcontrib-jquery==4.1
+sphinxcontrib-jsmath==1.0.1
+sphinxcontrib-qthelp==1.0.6
+sphinxcontrib-serializinghtml==1.1.9
+sphinxcontrib-svg2pdfconverter==1.2.2
+urllib3==2.1.0
diff --git a/venv-build-env.sh b/venv-build-env.sh
index bcf495a0efcbcca3356069b1caf2b259e6aa189d..5993ce8fe0f73655fd882f6bd5a612b3c5867767 100755
--- a/venv-build-env.sh
+++ b/venv-build-env.sh
@@ -1,11 +1,8 @@
 #!/bin/sh
 # Source this script like `. ./venv-build-env.sh`
-if [ ! -e ./sphinx-env ]; then
-   python3 -m venv sphinx-env
+if [ ! -e ./.venv ]; then
+   python3 -m venv .venv
 fi
-source ./sphinx-env/bin/activate
-python3 -m pip install --upgrade pip
-python3 -m pip install sphinx==5.3.0 sphinx-rtd-theme sphinx_design sphinx-tabs sphinxcontrib.svg2pdfconverter sphinx-reredirects
-python3 -m pip install sphinxcontrib-images sphinx-copybutton
-python3 -m pip install breathe exhale
-python3 -m pip install graphviz
+source ./.venv/bin/activate
+pip install --upgrade pip
+pip install -r requirements.txt