Before you begin
This protocol is written for researchers with a working understanding of immunohistochemical (IHC) labeling approaches and fluorescence microscopy. Before implementing this protocol, users should optimize labeling specificity and signal-to-noise ratios for the immunohistochemical assay. Furthermore, this protocol requires technical skills in histology and ultrasectioning. Additionally, users should familiarize themselves with principles of single-molecule localization microscopy (SMLM) and operation of available commercial instrumentation.
Prepare fluorescent dye conjugates for IHC (Timing: 2h)
The following steps describe the amine-reactive conjugation of fluorescent dyes to secondary antibodies and wheat germ agglutinin (WGA). The conjugates are used in this protocol to label primary antibodies in indirect IHC and endogenous glycoproteins in neuropil, respectively. Some dyes are reagents section (see also Dempsey et al., 2011; Li & Vaughan, 2018). Additional considerations when selecting dyes for multicolor imaging can be found in Figure 10.
1. Prepare fresh 1M NaHCO3 and keep solution ice cold. Mix 80 μl of secondary antibody (stock concentration 1 mg/mL) or WGA with 10 μl 1M NaHCO3.
2. Add 1.8 μl reporter dye and 1.2 μl activator dye to the solution.
Note: Dual labeled antibodies are used to increase reporter dye photoswitching (Dy 749/Alexa 647) through UV illumination of the activator dye (Alexa 405). Cy3B and Atto 488 reporter photoswitching is not increased in the presence of activator dyes therefore no Alexa 405 is added to those conjugation reactions.
3. Vortex the solution briefly.
4. Incubate the solution at room temperature for 20 min with constant agitation and protect from light. Meanwhile, allow a NAP-5 column to drain its storage buffer into a waste receptacle. Fill the empty NAP-5 column with 1x PBS and allow the waste to drain. Repeat washing two more times.
Critical: Rinse the NAP-5 column at least three times (Troubleshooting 1).
5. Pipette the conjugate solution onto the surface of the NAP-5 column and allow solution to sink into the column surface for ~30 seconds.
6. Add 600 μl 1x PBS to the column. Allow the clear PBS fraction to drain from the column into a waste receptacle.
Note: Free dyes will separate from conjugates creating two bands that may be visible depending on fluorophore wavelength (Cy3B is especially visible, 488 and 647 are somewhat visible and 749 is very difficult to see).
7. Add 300 μl 1x PBS and collect the flowthrough into the final storage tube. Discard the column.
8. Measure conjugate concentration and dye ratios per antibody/WGA molecule:
a. Blank the spectrophotometer using the same 1x PBS as above.
b. Measure the absorbance profile of the conjugate and record the peak absorbance values of the antibody (~280 nm) and the dye molecules (~405-750 nm depending on dyes used). Save absorbance profile for future reference.
c. Using the concentration values, determine the number of dye molecules per antibody molecule. A calculator used to determine the molecular ratios is provided in an Excel spreadsheet along with this manual.
Note: Ideally, each labeling protein molecule (IgG, IgY or WGA) will be conjugated to 3-4 reporter dye molecules and 1-2 activator dye molecules. If no activator is used, 3-4 reporter dye molecules should still be conjugated.
Critical: If ratios are not ideal, repeat the procedure and adjust dye volumes added to solution in step 2 to achieve molecular ratios within the appropriate bounds. If more than 4 μl of dye is needed in step 2 in order to achieve correct ratios, then dye stocks may need to be remade (Troubleshooting 1).
d. Recollect conjugate from cuvette and store in the dark at 4°C for up to 6 months.
e. To confirm conjugate quality after a period of storage, remeasure and compare absorbance values to originals.
Coat glass coverslips (Timing: 2h)
The following steps are used to coat glass coverslips with gelatin, which will cause ultrathin sections to adhere when they are collected after ultrasectioning (Micheva & Smith, 2007). While performing all steps, avoid allowing dust to collect onto the surface of the coverslips. Work in an area free from heavy airflow and filter all solutions.
1. Prepare 1M KOH and 95% EtOH. Separate coverslips in a rack, completely submerge into 1M KOH solution and sonicate with heat for 15 min.
2. Prepare gelatin solution. Heat to dissolve particulates, then filter the solution.
3. Rinse coverslips in filtered H2O, completely submerge them in 95% EtOH and sonicate with heat for 15 min.
4. Remove coverslip racks from 95% EtOH and allow them to air dry. Wick away excess ethanol.
Alternative: Place racks in a 50°C oven until dry.
Critical: Examine coverslips at this stage to check for clarity. If coverslips remain smudged or dusty, refilter 1M KOH and 95% EtOH, then start procedure again.
5. Completely submerge clean, dry coverslips in gelatin solution and swirl for 1 min.
6. Remove coverslip racks from gelatin solution and allow to air dry completely. Wick away excess solution from troughs of the coverslip rack.
Note: Moving coverslips to a clean, dry rack can help eliminate gelatin pooling at the lower edges of the coverslips.
7. Allow coverslips to dry completely before use or storage. Store dry coverslips in a closed container. Coverslips should be kept free from dust.
Collect and fix the tissue sample (Timing: 4-5h)
During the following steps, tissue will be dissected and prepared for IHC. Importantly, the region of interest is punched out creating a small disk of tissue which is easy to maneuver while minimizing mechanical damage. The small disk improves antibody penetration and allows the tissue to lay flat for embedding. Fixative solution and blocking buffer should be prepared before you begin.
1. Euthanize mouse, enucleate eyes, and dissect retinae in room temperature 1x PBS.
Note: These steps describe processing retinal tissue, but brain sections can also be used.
2. Fix tissue in room temperature 4% PFA for 10 min to 1 h. The fixation conditions should be adjusted to optimize IHC labeling quality.
3. Wash retinae in 1x PBS for 2x 20 min, then place it in a clean petri dish filled with room temperature 1x PBS.
4. Punch out a 500 μm diameter region of interest using a 25G blunt ended needle under stereoscope guidance.
5. Transfer punch to a 24-well plate and incubate in blocking buffer for 3-4 hours at room temperature with constant agitation. Continue on to IHC.
Immunohistochemistry (Timing: 4-5 days)
The following steps are performed to label antigen targets with primary and secondary antibodies. Target-specific staining is followed by a global neuropil stain using a WGA conjugate, which functions as an image alignment tool in later STORM data processing steps. Lastly, an aldehyde fixation establishes crosslinking to stabilize all molecular labels.
6. Prepare primary antibody solution by diluting 1 mg/mL antibody stocks to 1:100 in blocking buffer. Primary antibody dilution can be adjusted based on empirical testing. Transfer tissue punches to a new well containing primary antibody solution and incubate for 48-72 h at 4°C with constant agitation.
7. Transfer tissue to a new well containing wash buffer and incubate at room temperature for 6x 20 min with constant agitation.
8. Prepare secondary antibody solution by diluting secondary antibody conjugate stocks to 1:100 in blocking buffer. Secondary antibody dilution can be adjusted based on empirical testing. Secondary antibodies should be custom conjugated to photoswitchable dyes compatible with STORM imaging ahead of this step (see section: Prepare fluorescent dye conjugates for IHC). Transfer tissue punches to a new well containing secondary antibody solution and incubate for 24 h at 4°C with constant agitation. Protect samples from light.
9. Transfer tissue to a new well containing wash buffer and incubate at room temperature for 6x 20 min with constant agitation. Protect samples from light.
10. Prepare wheat germ agglutinin (WGA) solution by diluting WGA conjugate stock 1:10 in 1x PBS. WGA should be custom conjugated to photoswitchable dyes compatible with STORM imaging ahead of this step (see section: Prepare fluorescent dye conjugates for IHC). Transfer tissue to a new well containing WGA solution and incubate at room temperature for 12-16 h (overnight) with constant agitation. Protect samples from light.
11. Transfer tissue to a new well containing 1x PBS and incubate at room temperature for 2x 20 min with constant agitation. Protect samples from light.
Critical: Tissue punches may stick to the inside of the pipette tip here. To avoid this, coat the inside of the pipette tip with blocking solution first, then transfer the tissue punches.
12. Transfer tissue to a new well containing post-fixation solution (3% PFA, 0.1% GA) and incubate for 2 h with constant agitation. Protect samples from light.
13. Transfer tissue to a new well containing 1x PBS and incubate at room temperature for 2x 20 min with constant agitation. Protect samples from light. Continue on to dehydration.
Dehydrate and embed samples in resin (Timing: 1-2 days)
The following steps plasticize the tissue punches to make them suitable for ultrasectioning.
14. Perform a graded alcohol dehydration:
a. Transfer tissue into a clean Eppendorf tube and immerse in a 50% EtOH solution. Incubate at room temperature for 20 min with constant agitation and protect sample from light.
b. Repeat with 70%, 90%, 100% and 100% EtOH.
Critical: If tissue is not thoroughly dehydrated, the resin will not polymerize properly and crack or flake when taken out of the mold (Troubleshooting 2).
15. Perform a graded resin infusion:
a. Transfer tissue into a clean Eppendorf tube and immerse in a solution containing 2 parts 100% EtOH to 1 part resin. Incubate at room temperature for 2 h with constant agitation and protect sample from light.
b. Repeat with 1:1 EtOH:resin, 1:2 EtOH:resin, 100% resin and 100% resin.
Pause Point: If needed, tissue punches can be left in 1:2 EtOH:resin or 100% resin overnight.
16. Transfer individual tissue punches into lids of embedding (Beem) capsules and gently center them under stereoscope guidance. Fit capsule body onto the lid and fill with 100% resin. Incubate samples at 70°C for 16h.
Pause Point: Polymerized tissue punches have long-term stability. Store them in their molds in a dark, dry place and protect them from dust.
Ultrasectioning (Timing: 1 day)
The following steps describe the ultrasectioning and collection of serial ultrasections onto glass coverslips. For further technical troubleshooting and tips, see publications on array tomography and serial sectioning for electron microscopy (Micheva, et al., 2007; Harris, et al., 2006).
1. Trim and cut resin to produce 70 nm-thick serial section ribbons. Expand sections using chloroform vapor.
2. Secure gelatin coated coverslip in plastic forceps and guide it into the histo Jumbo diamond knife water bath (as pictured in Figure 6).
3. Using an eyelash tool, guide sections onto the middle of the coverslip and slowly retract the coverslip from the water bath by turning the knob on the micromanipulator.
Caution: Leave sufficient space in the margins of the coverslip to accommodate the imaging objective.
4. Warm coverslips with sections facing upward on a hot plate set to 60°C for 20 min.
Pause Point: Coverslips can be stored long-term prior to imaging.
Etch away resin and assemble flow chamber (Timing: 30 min)
The following steps prepare tissue sections for optimal photoswitching during STORM imaging. Here, the resin surrounding individual sections is removed allowing fluorophore exposure to the thiol-containing STORM imaging buffer. Fluorescent beads are spotted on the coverslips which will serve later as fiducial markers. The flow chamber is assembled, filled with STORM imaging buffer, and sealed with epoxy. Prepare 10 % sodium ethoxide before you begin; sodium ethoxide solution can be reused for multiple experiments but should be remade after 1 month.
1. Immerse the coverslip in 10% sodium ethoxide for 5 min.
Critical: Following step 1, samples will be difficult to see. Note sample orientation on the coverslip.
2. Meanwhile, clean a glass slide with EtOH and allow to dry completely, then apply two layers of double-sided tape to the long sides of the slide. Only cover ~5 mm of the slide edge and shave off the overhanging tape using a razor blade.
3. Remove the coverslip using forceps and immediately wash with 95% EtOH.
4. Wash coverslip in filtered H2O for ~30s
5. Dry coverslip using compressed/forced air.
6. Spot beads onto coverslip:
a. Make high density bead solution by mixing 1 μl bead stock to 9 μl 1x Dulbecco's PBS (DPBS). Vortex and spin down. Apply a small droplet (~1 μL) to coverslip.
Critical: Dulbecco's PBS must be used to prevent bead aggregation.
b. Make low density bead solution by adding 750 μl DPBS to dense bead working stock. Vortex. Apply a small droplet (~1 μL) to coverslip.
7. Quickly rinse off coverslip using filtered H2O for ~1 min.
Critical: Allow water to flow in the direction away from sample so that beads do not wash into the sample.
8. Dry coverslip using forced air.
9. Place the dry coverslip tissue-side-down onto the slide with double sided tape. Avoid crooked placement. Use a pipette tip to apply pressure on the tape sides to seal the coverslip to the adhesive.
10. Prepare STORM imaging buffer and mix by gentle pipetting. Avoid forcing air into the solution.
11. Draw up 160 μl of the STORM buffer into a pipette and slowly release it in the space between the coverslip and slide. Avoid creating bubbles by applying gentle pressure to the coverslip with a blunt object. Avoid cracking the coverslip when doing this.
12. Lay a piece of foil on the benchtop and push some epoxy out of the double-barrel syringe onto the foil. Mix with a pipette tip.
13. Apply a strip of epoxy to all sides of the coverslip (short sides first) to seal the flow chamber. Place in a dark drawer to dry for ~5 mins.
14. Test that the epoxy created a seal around the flow chamber by applying gentle pressure with a pipette tip to the surface of the coverslip. If no buffer leaks, then the seal is good. If some buffer leaks, then patch the hole using more, freshly mixed epoxy.
Critical: Be careful to not overapply epoxy and encroach on the sample area.
15. Apply a single strip of double-sided tape onto the short sides of the slide and trim off overhangs with razor blade. This is useful when securing slide to the STORM microscope. The preparation is ready for imaging.
Acquire STORM and conventional imaging data (Timing: 1-3 hours to set up, 1-3 minutes per STORM movie (automated acquisition))
The following steps describe our approach for collecting serial section conventional, wide-field (diffraction-limited) and STORM data, together with fiducial marker images for correcting chromatic aberration and uneven illumination of the sample. The key steps are to 1) collect conventional images of all color channels in rapid succession for the ROI(s) in each physical section of the sample. This limits sample drift between color channels for conventional images in each ROI. During subsequent image postprocessing/alignment, STORM images will be correlated to their conventional image counterparts to correct for sample drift. 2) Collect STORM movies for ROI(s) across all physical sections. For each ROI, the red emitters (Dy749P1/Alexa647) are imaged first (sequentially within each ROI across the entire sample) as these dyes are susceptible to STORM buffer acidification (Dempsey et al., 2011). Then, Cy3B and Atto488 emitters are imaged sequentially for each ROI in a second image pass across the sample. Sample drift that occurs during each STORM movie acquisition is corrected as part of the single-molecule fitting analysis process by back correlating binned movie frames to the start of the movie. 3) Collect fiducial marker images that will later be used to correct chromatic aberration in conventional and STORM images.
Alternative: Commercial instrumentation and software may be used in lieu of custom instrumentation and the specific codebases we reference here.
1. Power on the microscope and lasers.
2. Clean the oil immersion objective prior to imaging and position 4x or 10x objective for tile imaging.
3. Secure the sample slide in the stage holder.
Critical: Sample should be immobile once loaded in the stage. If necessary, use a top-side clamping stage insert or otherwise use double-sided tape applied to the glass slide to secure the specimen in the stage as described (previous section, step 15).
4. Launch ‘Hal.py’ acquisition software.
Alternative: Use commercial image acquisition software provided by microscope vendor or alternative open-source hardware control software for image acquisition.
5. Load settings .xml files into Hal.py by dragging/dropping settings files into main Hal.py module or selecting ‘File/load/settings’ and then selecting desired settings files.
6. Engage the low magnification array setting in Hal.
7. Use the ‘Illumination’ control panel to engage the 561nm laser, locate the bead fields on the coverslip and focus the objective.
8. Use the ‘Stage Control’ panel to zero the stage position.
9. Create a low-magnification mosaic of the bead fields and sample (serial sections):
Critical: Reduce laser power to low level to avoid image saturation and fluorophore bleaching.
a. Launch ‘Steve.py’ software and place cursor at or near the 0, 0 coordinates and press the spacebar to take an image.
b. Continue taking images of the field in manual or semi-automated modes:
i. manual imaging mode: click on an ROI and press the spacebar to take an image.
ii. semi-automated mode: click on an ROI and press keypad #3 or #9 for automated 3x3 or 9x9 image tiling, respectively. Press the spacebar to interrupt the sequence.
Note: User may navigate the sample view in Steve.py by right-clicking on an ROI and selecting “Go to Position.”
c. Finish mosaic and save. Adjust the stage position back to the sparse bead field.
10. Create a high-magnification mosaic of the bead fields and sample (serial sections):
a. Position high-magnification oil/water objective (either 60x or 100x) for imaging.
b. Place a droplet of immersion oil on the objective (if using oil).
c. Focus on the sparse beads:
i. Engage the high magnification array setting in Hal.py.
ii. Using the ‘Illumination’ control panel in Hal.py, turn on a visible imaging laser (488nm or 561nm) and bring the sample into focus.
iii. Use the ‘Focus lock’ control panel to lock the focal plane.
Alternative: Use commercial instrument with automated focus maintenance system and image tiling software to generate a low-mag and high-mag overview of the sample field and select ROIs for subsequent automated image acquisition. Alternative open-source software may also be used.
d. Set TIRF angle to maximize signal-to-noise at low illumination power.
e. Reimage selected regions (both sample and beads) of the low magnification mosaic at high magnification.
Note: Steve.py allows users to correct offsets between low and high magnification by adjusting the mosaic positions within the ‘Objective Settings’ panel.
11. Select sample ROIs for automated imaging (manual):
a. Use mouse cursor to hover over ROI in first physical section.
b. Right click and select ‘Record position’.
c. Repeat for each ROI across the sample ribbon(s).
d. When all positions are selected, click ‘File’ and ‘Save positions’ to save a ‘positions.txt’ file.
e. Delete all recorded positions in Steve.py.
Critical: Select ROIs in sequential order of physical sectioning to simplify downstream alignment processing. To prevent unwanted bleaching during acquisition of serial section images, select the order of ROIs to begin imaging the end of the sample ribbon at the furthest end of the coverslip in the direction of the TIRF beam.
12. Select bead ROIs for automated imaging (manual):
a. Use the mouse cursor to hover over ROIs in bead fields.
b. Starting in the sparse bead field, right click within a region away from the edge of the bead spot and select ‘Record position’.
c. Move cursor to new position within the bead spot (away from the edge and the first position), right click and select ‘Record position’.
d. Move cursor to center region of the dense bead field, right click and select ‘Record position’.
e. When positions are selected, click ‘File’ and ‘Save positions’ to save a ‘bead_positions.txt’ file.
13. Prepare illumination power settings for conventional image acquisition to ensure that images are not dim/saturated:
a. Engage the ‘Conv’ setting in Hal.py.
b. Focus on a representative ROI within the sample.
c. Adjust laser powers using the ‘Illumination’ control panel for each channel to be imaged.
Critical: Avoid saturating dense bead images. Ensure sufficient illumination intensity to use the full dynamic range of the camera.
14. Prepare illumination power settings for sparse bead field image acquisition to ensure that images are not dim/saturated:
a. Engage the ‘Regbeads’ setting in Hal.py.
b. Focus on a representative ROI within the sparse bead field.
c. Adjust 750nm laser power using the ‘Illumination’ control panel to visualize IR beads in 750 and 647 channels.
d. Adjust 488nm laser power using the ‘Illumination’ control panel to visualize visible beads in the 647, 561, and 488nm channels.
Critical: Avoid saturating sparse bead images.
15. Prepare illumination power settings for dense bead field image acquisition to ensure that images are not dim/saturated:
a. Engage the ‘FFCbeads’ setting in Hal.py.
b. Focus on a representative ROI within the dense bead field.
c. Adjust 750/647/561/488nm imaging laser powers using the ‘Illumination’ control panel to visualize dense beads in 750/647/561/488nm channels, respectively.
Critical: Avoid saturating dense bead images. Ensure sufficient illumination intensity to use the full dynamic range of the camera.
16. Prepare illumination power settings for STORM image acquisition to optimize photoswitching and minimize movie length:
a. Engage the ‘750STORM’ setting in Hal.py.
b. Focus on a representative ROI within the sample.
c. Adjust the 750nm laser power to maximum and the 405nm laser to minimum using the ‘Illumination’ control panel.
d. In Hal.py, change the directory filename to ‘750storm’ and set the working directory to ‘Acquisition\create_xml\powertest\’.
e. Set 'Mode’ to ‘Run_til_abort’.
f. Click ‘Record’ to begin manual STORM movie acquisition.
Note: Each wavelength-specific .xml file calls a preset shutter file that engages the appropriate imaging (750/647/561/488nm) and activation (405nm) lasers.
g. Manually ramp 405nm laser power using the ‘Illumination’ control panel to reactivate fluorophore switching to maintain optimal emitter density.
h. Pressing 'Stop’ ends the movie recording and saves the power progression file.
i. Repeat steps 16 (a-h) for 647nm, 561nm, and 488nm STORM movies. Change the directory filenames for each movie according to wavelength using the format specified above.
Note: Cy3B (561nm) and Atto488 (488nm) probes do not require 405nm illumination for reactivation.
Alternative: The above steps 16 (a-i) describe the setting of custom ‘power progression’ files to control illumination settings during STORM movie acquisition. Hal.py also allows users to engage linear or exponential power ramping using the ‘Progressions’ control panel.
17. Begin automated image acquisition of all conventional, bead, and STORM files:
a. In main Hal.py interface, set working directory to local storage drive.
Critical: Ensure local storage drive has sufficient capacity for image acquisition and/or set up automated transfer routine to clear drive of images following acquisition. Overfilling the drive will cause the acquisition control software to crash.
b. Adjust desired imaging parameters (e.g. number of frames, frame rate, focus lock position, illumination control, etc.) for multi-channel acquisition in a ‘master.xml’ file.
c. Launch ‘Master_xml_generator.py’.
d. Select the desired ‘master.xml’ file from Step B above (.xml format) containing imaging parameters.
e. Change file name and save out final ‘master_run.xml’ file.
f. Launch ‘Dave.py’ software.
g. Click ‘File/load’ and select the ‘master_run.xml’ file for automated imaging.
h. Click ‘Validate’ to confirm the proper function of the automated image acquisition.
i. Select 'Run’ to begin automated imaging.
Alternative: Use commercial instrument with automated image acquisition software to set imaging parameters for selected ROIs. Alternative open-source software may also be used.
Note: Adjust the total laser output power as needed to ensure optimal image quality during image acquisition. For conventional image acquisition this may require reducing laser output while for STORM movie acquisition power output should be increased to achieve sufficient density at the sample plane (1-3 kW/cm2).
Process images to generate 3D volumes (Timing: varies (largely automated)
The following steps convert raw conventional, bead, and STORM imaging data to final images. Steps include single-molecule fitting, drift/aberration corrections, and elastic registration of serial sections. Links to repositories hosting previously published and custom code (this paper) can be found in the ‘Software and algorithms’ section.
1. Download and install “Storm-Analysis” software.
2. Inspect raw .dax STORM movies in renderer software to determine frame range for single molecule fitting.
3. Adjust 3D-DAOSTORM SMLM fitting parameters (e.g. frame range, background, sigma, drift correction, etc.) in .xml files by manually inputting desired values.
Note: We recommend testing fitting parameters on ~10 frames to view results of parameter settings before fitting the final number of desired frames.
4. Run SMLM fitting analysis (fully automated):
a. Open ‘1_batch_fitting.py’ script.
b. Change working directory path to the location of the data to be analyzed (experiment folder).
c. Copy folder containing .xml and camera calibration files to the experiment folder.
d. Run script.
Alternative: A list of available renderers and single-molecule fitting algorithms is referenced in the ‘Software and algorithms’ section. Use commercial or preferred open-source software to interact with raw SMLM data, generate SMLM localization lists, and convert these to image files.
5. Run single-section drift/chromatic aberration correction and alignment (fully automated):
a. Open ‘2_XY_alignment.py’ script.
b. Change working directory paths to the experiment folder.
c. Run script.
Alternative: Use commercial or other open-source software to correct sample drift for each ROI by cross-correlating each individual STORM image to its conventional image counterpart. Use the fiducial sparse bead field imaging data to generate a non-linear warping transform that registers beads across the color channels to correct chromatic aberration. Apply the resultant transform to all conventional and STORM images for each ROI.
6. Run 3D serial-section alignment (largely automated):
a. Open ‘3_Z_alignment.py’ script.
b. Change working directory paths to the experiment folder.
c. Run script.
d. When the first FIJI subprocess launches, input rigid registration parameters to continue the alignment.
e. When the MATLAB subprocess opens, drag cursor within the displayed image to set a sample ROI for cropping the image stack. Right click and select ‘crop’ to continue the routine.
f. When the second FIJI subprocess launches, input elastic registration parameters to continue the alignment. Elastic alignment is implemented in TrakEM2 based on the original publication (Saalfeld et al., 2012).
Alternative: Use alternative commercial or open-source software to perform 3D serial-section alignment.
Note: We continue to develop and package these routines to improve functionality, ease of use, and open-source accessibility. Updates will be made available on GitHub.