Skip to content

YouTube redirects feature #1650

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 12, 2024
Merged

Conversation

fturmel
Copy link
Collaborator

@fturmel fturmel commented Jul 9, 2024

/yt/{youtubeId} will redirect to the associated challenge or track with the highest priority (challenge > canonical track > track).

The implementation uses an edge function and a lookup JSON file generated at build time.

see discussion in nature-of-code/noc-book-2#985

Some examples:
https://deploy-preview-1650--codingtrain.netlify.app/yt/4JzDttgdILQ
https://deploy-preview-1650--codingtrain.netlify.app/yt/wN5Is0DjW8w

Here's the full lookup for auditing:

redirects.json
{
  "0ZONMNUKTfU": "/challenges/c5-marching-squares",
  "4066MndcyCk": "/challenges/c4-worley-noise",
  "dSK-MW-zuAc": "/challenges/c3-hilbert-curve",
  "EYLWxwo1Ed8": "/challenges/c2-collatz-conjecture",
  "4uU9lZ-HSqA": "/challenges/c1-maurer-rose",
  "KtPpoMThKUs": "/challenges/99-neural-network-color-predictor",
  "OJxEcs0w_kE": "/challenges/98-quadtree",
  "QQx_NmCIuCY": "/challenges/98-quadtree#part-2",
  "z0YFFg_nBjw": "/challenges/98-quadtree#part-3",
  "tbvG9hrJxOU": "/challenges/97-book-of-pi",
  "4Ns9S-Z89-0": "/challenges/97-book-of-pi#part-2",
  "WEd_UIKG-uc": "/challenges/96-visualizing-digits-of-pi",
  "5cNnf_7e92Q": "/challenges/95-approximating-the-value-of-pi",
  "JSn-DJU8qf0": "/challenges/94-2048",
  "8f8P1i0W26E": "/challenges/94-2048#part-2",
  "3iYvT8TBIro": "/challenges/94-2048#part-3",
  "vtMKeEGpMI4": "/challenges/94-2048#part-4",
  "uWzPe_S-RVE": "/challenges/93-double-pendulum",
  "188B6k_F9jU": "/challenges/92-xor-problem",
  "JrRO3OnWs5s": "/challenges/91-snakes-and-ladders",
  "wN5Is0DjW8w": "/challenges/91-snakes-and-ladders#part-2",
  "1Ec_-wzJCPY": "/challenges/91-snakes-and-ladders#part-3",
  "0L2n8Tg2FwI": "/challenges/90-dithering",
  "FGAwi7wpU8c": "/challenges/9-solar-system-3d-textures",
  "G1EgjgMo48U": "/challenges/89-langtons-ant",
  "cl-mHFCGzYk": "/challenges/88-snowfall",
  "r6YMKr1X0VA": "/challenges/87-3d-knots",
  "H81Tdrmz2LA": "/challenges/86-cube-wave-by-bees-and-bombs",
  "FWSR_7kZuYg": "/challenges/85-the-game-of-life",
  "GWDx1GnxhOw": "/challenges/84-word-definition-chrome-extension",
  "IXXNIcQQLU8": "/challenges/83-p5-sketch-chrome-extension",
  "8zMMOdI5SOk": "/challenges/82-image-chrome-extension",
  "u2D4sxh3MTs": "/challenges/81-circle-morphing",
  "0veqAiA61AU": "/challenges/81-circle-morphing#part-2",
  "iFTgphKCP9U": "/challenges/80-voice-chatbot-with-p5speech",
  "dncudkelNxw": "/challenges/8-solar-system-3d",
  "zGe1m_bLOFk": "/challenges/79-number-guessing-chatbot",
  "UcdigVaIYAk": "/challenges/78-simple-particle-system",
  "jPsZwrV9ld0": "/challenges/77-recursion",
  "bEyTZ5ZZxZs": "/challenges/76-10Print",
  "RPz75gcHj18": "/challenges/75-wikipedia-api",
  "E4RyStef-gY": "/challenges/74-clock",
  "giXV6xErw0Y": "/challenges/72-frogger",
  "06-ZvYmSeus": "/challenges/72-frogger#part-2",
  "hk326ZHlENQ": "/challenges/72-frogger#part-3",
  "c6WdJltqEtM": "/challenges/72-frogger#part-4",
  "LFU5ZlrR21E": "/challenges/71-minesweeper",
  "N8Fabn1om2k": "/challenges/70-nearest-neighbors-recommendation-engine",
  "Lo89NLmSgl0": "/challenges/70-nearest-neighbors-recommendation-engine#part-2",
  "aMtckmWAzDg": "/challenges/70-nearest-neighbors-recommendation-engine#part-3",
  "l8SiJ-RmeHU": "/challenges/7-solar-system-2d",
  "flxOkx0yLrY": "/challenges/69-evolutionary-steering-behaviors",
  "XaOVH8ZSRNA": "/challenges/69-evolutionary-steering-behaviors#part-2",
  "vZUWTlK7D2Q": "/challenges/69-evolutionary-steering-behaviors#part-3",
  "ykOcaInciBI": "/challenges/69-evolutionary-steering-behaviors#part-4",
  "VnFF5V5DS8s": "/challenges/69-evolutionary-steering-behaviors#part-5",
  "piBq7VD0ZSo": "/challenges/68-breadth-first-search",
  "-he67EEM6z0": "/challenges/68-breadth-first-search#part-2",
  "IIrC5Qcb2G4": "/challenges/67-pong",
  "MLtAMg9_Svw": "/challenges/66-javascript-countdown-timer",
  "ZNH0MuQ51m4": "/challenges/65-binary-tree",
  "KFEvF_ymuzY": "/challenges/65-binary-tree#part-2",
  "xXjRlEr7AGk": "/challenges/64-kinematics",
  "hbgDqyy8bIw": "/challenges/64-kinematics#part-2",
  "RTc6i-7N3ms": "/challenges/64-kinematics#part-3",
  "10st01Z0jxc": "/challenges/64-kinematics#part-4",
  "JunJzIe0hEo": "/challenges/63-texturing-cloth-simulation",
  "FeXnJSCFj-Q": "/challenges/63-texturing-cloth-simulation#part-2",
  "KakpnfDv_f0": "/challenges/62-plinko-with-matterjs",
  "6s4MJcUyaUE": "/challenges/62-plinko-with-matterjs#part-2",
  "jN-sW-SxNzk": "/challenges/62-plinko-with-matterjs#part-3",
  "CdBXmsrkaPs": "/challenges/62-plinko-with-matterjs#part-4",
  "0dwJ-bkJwDI": "/challenges/61-fractal-spirograph",
  "O_0fRV4MTZo": "/challenges/60-butterfly-generator",
  "jxGS3fKPKJA": "/challenges/6-mitosis-simulation",
  "4hA7G3gup-4": "/challenges/59-steering-behaviors",
  "dbs4IYGfAXc": "/challenges/58-3d-earthquake-data-visualization",
  "ZiYdOwOrGyc": "/challenges/57-mapping-earthquake-data",
  "OAcXnzRNiCY": "/challenges/56-attraction-and-repulsion-forces",
  "f5QBExMNB1I": "/challenges/55-mathematical-rose-patterns",
  "sJ6pMLp_IaI": "/challenges/54-islamic-star-patterns",
  "lobJ9gzbLo8": "/challenges/54-islamic-star-patterns#part-2",
  "bqF9w9TTfeo": "/challenges/53-random-walker-with-vectors-and-levy-flight",
  "l__fEY1xanY": "/challenges/52-random-walker",
  "aKYlikFAV4k": "/challenges/51-a-pathfinding-algorithm",
  "EaZxUCWAjb0": "/challenges/51-a-pathfinding-algorithm#part-2",
  "jwRT4PCT6RU": "/challenges/51-a-pathfinding-algorithm#part-3",
  "QHEQuoIKgNE": "/challenges/50-animated-circle-packing",
  "ERQcYaaZ6F0": "/challenges/50-animated-circle-packing#part-2",
  "biN3v3ef-Y0": "/challenges/5-space-invaders",
  "nnlAH1zDBDE": "/challenges/49-photo-mosaic-with-white-house-social-media-images",
  "UrznYJltZrU": "/challenges/48-white-house-social-media-data-visualization",
  "JUDYkxU6J0o": "/challenges/47-pixel-sorting-in-processing",
  "hacZU523FyM": "/challenges/46-asteroids",
  "xTTuih7P0c0": "/challenges/46-asteroids#part-2",
  "RUSvMxxm_Jo": "/challenges/45-p5js-firebase-drawings",
  "uw3GbsY_Pbc": "/challenges/44-afinn-111-sentiment-analysis",
  "VV1JmMYceJw": "/challenges/44-afinn-111-sentiment-analysis#part-2",
  "8Z9FRiW2Jlc": "/challenges/43-context-free-grammar",
  "eGFJ8vugIWA": "/challenges/42-markov-chain-name-generator",
  "9r8CmofnbAQ": "/challenges/42-markov-chain-name-generator#part-2",
  "aKiyCeIuwn4": "/challenges/41-clappy-bird",
  "unm0BLor8aE": "/challenges/40-word-counter",
  "fxQ0B6BkfKo": "/challenges/40-word-counter#part-2",
  "RPMYV-eb6lI": "/challenges/40-word-counter#part-3",
  "KkyIDI6rQJI": "/challenges/4-purple-rain",
  "ziBO-U2_t3k": "/challenges/39-madlibs-generator",
  "AKuW48WeNMA": "/challenges/38-word-interactor",
  "u-HUtrpyi1c": "/challenges/37-diastic-machine",
  "rX5p-QRP6R4": "/challenges/36-blobby",
  "BAejnwN4Ccw": "/challenges/35-traveling-salesperson",
  "goUlyp4rwiU": "/challenges/35-traveling-salesperson#part-2",
  "9Xy-LMAfglE": "/challenges/35-traveling-salesperson#part-3",
  "M3KTWnTrU_c": "/challenges/35-traveling-salesperson#part-4",
  "hnxn6DtLYcY": "/challenges/35-traveling-salesperson#part-5",
  "Cl_Gjj80gPE": "/challenges/34-diffusion-limited-aggregation",
  "flQgnCUxHlw": "/challenges/33-poisson-disc-sampling",
  "JXuxYMGe4KI": "/challenges/32-agario",
  "ZjVyKXp9hec": "/challenges/32-agario#part-2",
  "cXgA1d_E-jY": "/challenges/31-flappy-bird",
  "KWoJgHFYWxY": "/challenges/30-phyllotaxis",
  "AaGK-fj-BAM": "/challenges/3-snake-game",
  "bGz7mv2vD6g": "/challenges/29-smart-rockets-in-p5js",
  "ccYLb7cLB1I": "/challenges/28-metaballs",
  "CKeyIbT3vXI": "/challenges/27-fireworks",
  "akM4wMZIBWg": "/challenges/26-3d-supershapes",
  "RkuBWEkBrZA": "/challenges/25-spherical-geometry",
  "BjoM9oKOAKY": "/challenges/24-perlin-noise-flow-field",
  "ksRoh-10lak": "/challenges/23-2d-supershapes",
  "fAsaSkmbF5s": "/challenges/22-julia-set",
  "6z7GQewK-Ks": "/challenges/21-mandelbrot-set-with-p5js",
  "jrk_lOg_pVA": "/challenges/20-3d-cloth-simulation",
  "LG8ZK-rRkXo": "/challenges/2-menger-sponge",
  "z86cx2A4_3E": "/challenges/19-superellipse",
  "p7IGZTjC008": "/challenges/183-mathematical-marbling",
  "6UlGLB_jiCs": "/challenges/182-apollonian-gasket",
  "Bxdt6T_1qgc": "/challenges/181-image-stippling",
  "L4u7Zy_b868": "/challenges/180-falling-sand",
  "JcopTKXt8L8": "/challenges/18-3d-fractal-trees",
  "Ggxt06qSAe4": "/challenges/179-wolfram-ca",
  "rVBTxnRyOuE": "/challenges/178-climate-spiral",
  "IxdGyqhppis": "/challenges/177-soft-body-character",
  "h5ZNcAPXxew": "/challenges/176-buffon-needle",
  "PHfKCxjsmos": "/challenges/175-3D-cube-applesoft-basic",
  "UNkHditYGls": "/challenges/174-graphics-applesoft-basic",
  "7r83N3c2kPw": "/challenges/173-snake-applesoft-basic",
  "FfCBNL6lWK0": "/challenges/172-directional-boring",
  "rI_y2GAlQFM": "/challenges/171-wave-function-collapse",
  "0zac-cDzJwA": "/challenges/170-monty-hall-problem",
  "kKT0v3qhIQY": "/challenges/17-fractal-trees-space-colonization",
  "_H9JIwWP7HQ": "/challenges/169-pi-in-the-sky",
  "NJCiUVGiNyA": "/challenges/168-the-mandelbulb",
  "a35KWEjRvc0": "/challenges/167-prime-spiral",
  "55iwMYv8tGI": "/challenges/166-image-to-ascii",
  "uQZLzhrzEs4": "/challenges/165-slide-puzzle",
  "hckvHFDGiJk": "/challenges/164-slitscan",
  "enNfb6p3j_g": "/challenges/163-bezier-curves",
  "m6-cm6GZ1iw": "/challenges/162-self-avoiding-walk",
  "EvS_a921dBo": "/challenges/161-estimating-pi-from-random-numbers",
  "Rr-5HiXquhw": "/challenges/160-spring-forces",
  "E1B4UoSQMFw": "/challenges/16-l-system-fractal-trees",
  "NBWMtlbbOag": "/challenges/159-simple-pendulum",
  "3MqJzMvHE3E": "/challenges/158-shape-classifier",
  "9z9mbiOZqSs": "/challenges/157-zoom-annotations",
  "MEdpRYyjz_0": "/challenges/156-peeking-inside-pi",
  "R3C2giDfmO8": "/challenges/155-kaleidoscope-snowflake",
  "trKjYdBASyQ": "/challenges/154-tic-tac-toe-minimax",
  "ZCXkvwLxBrA": "/challenges/153-interactive-drawing-with-sketchrnn",
  "nSYw9GrakjY": "/challenges/152-rdp-algorithm",
  "F1OkDTUkKFo": "/challenges/151-ukulele-tuner-with-machine-learning",
  "vEetoBuHj8g": "/challenges/150-ai-rainbows-with-runway-and-p5js",
  "fcdNSZ9IzJM": "/challenges/15-object-oriented-fractal-trees",
  "GTWrWM1UsnA": "/challenges/149-tic-tac-toe",
  "YNyULRrydVI": "/challenges/148-gift-wrapping",
  "l0HoJHc-63Q": "/challenges/147-chrome-dinosaur-game",
  "vYgIKn7iDH8": "/challenges/146-rendering-ray-casting",
  "TOEi6T2mtHo": "/challenges/145-ray-casting-2d",
  "Iaz9TqYWUmA": "/challenges/144-2d-black-hole-visualization",
  "eqo2LxRADhU": "/challenges/143-quicksort",
  "9PGfL4t-uqE": "/challenges/142-rubiks-cube",
  "EGmVulED_4M": "/challenges/142-rubiks-cube#part-2",
  "8U2gsbNe1Uo": "/challenges/142-rubiks-cube#part-3",
  "pn2vlselv_g": "/challenges/141-mandelbrot-pi",
  "uH4trBNn540": "/challenges/140-pi-leibniz",
  "0jjeOYMjmDU": "/challenges/14-fractal-trees-recursive",
  "PoW8g67XNxA": "/challenges/139-calculating-digits-of-pi-with-collisions",
  "TDQzoe9nslY": "/challenges/138-angry-birds-with-matterjs",
  "3_0Ax95jIrk": "/challenges/137-4d-opensimplex-noise-loop",
  "ZI1dmHv3MeM": "/challenges/136-polar-noise-loops",
  "c6K-wJQ77yQ": "/challenges/136-polar-noise-loops#part-2",
  "nBKwCCtWlUg": "/challenges/135-making-a-gif-loop-in-processing",
  "oUBAi9xQ2X4": "/challenges/134-heart-curve",
  "l5I3Q1JFISE": "/challenges/134-heart-curve#part-2",
  "bl3nc_a1nvs": "/challenges/133-time-tables-cardioid-visualization",
  "alhpH6ECFvQ": "/challenges/132-fluid-simulation",
  "0j86zuqqTlQ": "/challenges/131-bouncing-dvd-logo",
  "MY4luNgGfms": "/challenges/130-drawing-with-fourier-transform-and-epicycles",
  "n9nfTxp_APM": "/challenges/130-drawing-with-fourier-transform-and-epicycles#part-2",
  "7_vKzcgpfvU": "/challenges/130-drawing-with-fourier-transform-and-epicycles#part-3",
  "BV9ny785UNc": "/challenges/13-reaction-diffusion",
  "X8bXDKqMsXE": "/challenges/129-koch-fractal-snowflake",
  "pdaNttb7Mr8": "/challenges/128-sketch-rnn-snowflakes",
  "XUA8UREROYE": "/challenges/127-brownian-tree-snowflake",
  "-OL_sw2MiYw": "/challenges/126-toothpicks",
  "Mm2eYfj0SgA": "/challenges/125-fourier-series",
  "mhjuuHl6qHM": "/challenges/124-flocking-simulation",
  "7gNzMtYo9n4": "/challenges/123-chaos-game",
  "A0NHGTggoOQ": "/challenges/123-chaos-game#part-2",
  "yLuk0twx8Hc": "/challenges/122-quick-draw",
  "EcRK6oFddPQ": "/challenges/122-quick-draw#part-2",
  "i-k04yzfMpw": "/challenges/121-logo-interpreter",
  "aOqEm101fms": "/challenges/121-logo-interpreter#part-2",
  "oCBlwsY8sR4": "/challenges/120-bit-shifting",
  "f0lkz2gSsIk": "/challenges/12-lorenz-attractor",
  "meGcdIoTYgw": "/challenges/119-binary-to-decimal-conversion",
  "MlRlgbrAVOs": "/challenges/117-seven-segment-display",
  "--6eyLO78CY": "/challenges/116-lissajous-curve-table",
  "OMoVcohRgZA": "/challenges/115-snake-game-redux",
  "67k3I2GxTH8": "/challenges/114-bubble-sort-visualization",
  "XE3YDVdQSPo": "/challenges/113-4d-hypercube-aka-tesseract",
  "p4Iz0XJY-Qk": "/challenges/112-3d-rendering-with-rotation-and-projection",
  "3noMeuufLZY": "/challenges/111-animated-sprites",
  "DhFZfzOvNTU": "/challenges/110-recamans-sequence",
  "pYnaBQgnARQ": "/challenges/110-recamans-sequence#part-2",
  "IKB1hWWedMk": "/challenges/11-3d-terrain-generation-with-perlin-noise",
  "Ae73YY_GAU8": "/challenges/109-visualizing-500000-subscribers",
  "JFugGF1URNo": "/challenges/108-barnsley-fern",
  "diGjw5tghYU": "/challenges/107-sandpiles",
  "N3ZnNa01BPM": "/challenges/106-xor-problem-with-tensorflowjs",
  "tIXDik5SGsI": "/challenges/105-polynomial-regression-with-tensorflowjs",
  "dLp10CFIvxI": "/challenges/104-linear-regression-with-tensorflowjs",
  "X0kjv0MozuY": "/challenges/103-fire-effect",
  "BZUdGqeOD0w": "/challenges/102-2d-water-ripple",
  "fUkF-YLLXeg": "/challenges/101-may-the-4th-scrolling-text",
  "c6y21FkaUqw": "/challenges/100-neuroevolution-flappy-bird",
  "YtRA6tqgJBc": "/challenges/100-neuroevolution-flappy-bird#part-2",
  "3lvj9jvERvs": "/challenges/100-neuroevolution-flappy-bird#part-3",
  "HrvNpbnjEG8": "/challenges/100-neuroevolution-flappy-bird#part-4",
  "U9wiMM3BqLU": "/challenges/100-neuroevolution-flappy-bird#part-5",
  "HyK_Q5rrcr4": "/challenges/10-dfs-maze-generator",
  "D8UgRyRnvXU": "/challenges/10-dfs-maze-generator#part-2",
  "8Ju_uxJ9v44": "/challenges/10-dfs-maze-generator#part-3",
  "_p5IH0L63wo": "/challenges/10-dfs-maze-generator#part-4",
  "17WoOqgXsRM": "/challenges/1-starfield",
  "nqiKWXUX-o8": "/tracks/webgl/webgl/1-introduction",
  "6TPVoB4uQCU": "/tracks/webgl/webgl/2-3d-geometries",
  "k2FguXvqp60": "/tracks/webgl/webgl/3-light-and-material",
  "O1mYw-3Wl_Q": "/tracks/webgl/webgl/4-texture",
  "BW3D9WwalQE": "/tracks/webgl/webgl/5-camera-and-perspective",
  "3tTZlTq4Cxs": "/tracks/webgl/webgl/6-createGraphics",
  "FUI7HEEz9B0": "/tracks/webgl/webgl/7-loading-an-obj-file",
  "DZlw-IS5OkI": "/tracks/webgl/webgl/8-3d-custom-shapes",
  "bjULmG8fqc8": "/tracks/web-sockets-and-p5js/websockets-node-p5/1-introduction-to-node",
  "2hhEOGXcCvg": "/tracks/web-sockets-and-p5js/websockets-node-p5/2-using-express-with-node",
  "HZWmrt3Jy10": "/tracks/web-sockets-and-p5js/websockets-node-p5/3-connecting-client-to-server",
  "i6eP1Lw4gZk": "/tracks/web-sockets-and-p5js/websockets-node-p5/4-shared-drawing-canvas",
  "o9sgjuh-CBM": "/tracks/transformations-in-p5/transformations/translate-rotate-push-pop",
  "pkHZTWOoTLM": "/tracks/transformations-in-p5/transformations/scale",
  "IVMvq9rd8dA": "/tracks/transformations-in-p5/transformations/more-transformations",
  "q8SHaDQdul0": "/tracks/topics-in-native-javascript/js/let-vs-var",
  "2iLVFyYwyRA": "/tracks/topics-in-native-javascript/js/const",
  "mrYMzpbFz18": "/tracks/topics-in-native-javascript/js/arrow-functions",
  "Y8sMnRQYr3c": "/tracks/topics-in-native-javascript/js/for-of-loop",
  "H4awPsyugS0": "/tracks/topics-in-native-javascript/js/higher-order-functions",
  "EnYlhbpzhU4": "/tracks/topics-in-native-javascript/js/array-map-and-fill",
  "-LFjnY1PEDA": "/tracks/topics-in-native-javascript/js/array-reduce",
  "qmnH5MT_luk": "/tracks/topics-in-native-javascript/js/array-filter",
  "MWD-iKzR2c8": "/tracks/topics-in-native-javascript/js/array-sort",
  "m9bRVQ_-DXY": "/tracks/topics-in-native-javascript/js/particle-system-with-array-functions",
  "QO4NXhWo_NM": "/tracks/topics-in-native-javascript/js/promises-part-1",
  "AwyoVjVXnLk": "/tracks/topics-in-native-javascript/js/promises-part-2",
  "XO77Fib9tSI": "/tracks/topics-in-native-javascript/js/async-await-part-1",
  "chavThlNz3s": "/tracks/topics-in-native-javascript/js/async-await-part-2",
  "01RTj1MWec0": "/tracks/topics-in-native-javascript/js/promise-all",
  "BztW_u6HDbs": "/tracks/topics-in-native-javascript/js/try-catch",
  "T-HGdc8L-7w": "/tracks/code-programming-with-p5-js/code/6-objects/2-classes",
  "rHiSsgFRgx4": "/tracks/code-programming-with-p5-js/code/6-objects/3-constructor",
  "MfxBfRD0FVU": "/tracks/topics-in-native-javascript/js/inheritance",
  "8a5BkwuZRK0": "/tracks/topics-in-native-javascript/js/polymorphism",
  "kwcillcWOg0": "/tracks/teachable-machine/teachable-machine/1-image-classification",
  "UPgxnGC8oBU": "/tracks/teachable-machine/teachable-machine/2-snake-game",
  "TOrVsLklltM": "/tracks/teachable-machine/teachable-machine/3-sound-classification",
  "O5wjXoFrau4": "/tracks/the-nature-of-code-2/noc/3-angles/4-polar-coordinates",
  "Pn1g1wjxl_0": "/tracks/sound/sound/1-loading-and-playing",
  "YcezEwOXun4": "/tracks/sound/sound/2-pause-and-play-button",
  "SfA5CghXw18": "/tracks/sound/sound/3-timing-jumps-cues",
  "NCCHQwNAN6Y": "/tracks/sound/sound/4-amplitude_analysis",
  "40Me1-yAtTc": "/tracks/sound/sound/5-adding-sound-effects",
  "Bk8rLzzSink": "/tracks/sound/sound/6-sound-synthesis",
  "wUSva_BnedA": "/tracks/sound/sound/7-adsr-envelope",
  "q2IDNkUws-A": "/tracks/sound/sound/8-microphone-input",
  "jEwAMgcCgOA": "/tracks/sound/sound/9-sound-visualization",
  "h_aTgOl9J5I": "/tracks/sound/sound/10-sound-visualization-radial-graph",
  "2O3nm0Nvbi4": "/tracks/sound/sound/11-sound-visualization-frequency-analysis",
  "bkGf4fEHKak": "/tracks/pixels/pixels/createCapture",
  "oLiaUEKsRws": "/tracks/pixels/pixels/video-photobooth",
  "nMUMZ5YRxHI": "/tracks/pixels/more-p5/pixel-array",
  "rNqaw8LT2ZU": "/tracks/pixels/pixels/brightness-mirror",
  "m1G6WBvrOBE": "/tracks/pixels/pixels/checkbox-mirror",
  "0V3uYA1hafk": "/tracks/pixels/pixels/painting-with-pixels",
  "YqVbuMPIRwY": "/tracks/pixels/pixels/slit-scan",
  "urR596FsU68": "/tracks/the-nature-of-code-2/noc/6-physics-libraries/1-matterjs-introduction",
  "uITcoKpbQq4": "/tracks/the-nature-of-code-2/noc/6-physics-libraries/2-matterjs-introduction-continued",
  "4HsVCLakjtQ": "/tracks/the-nature-of-code-2/noc/6-physics-libraries/3-matterjs-deleting-bodies",
  "szztTszPp-8": "/tracks/the-nature-of-code-2/noc/6-physics-libraries/4-matterjs-constraints",
  "W-ou_sVlTWk": "/tracks/the-nature-of-code-2/noc/6-physics-libraries/5-matterjs-mouse-constraints",
  "E67e0RX-7Ew": "/tracks/physics-libraries/physics-libraries/toxiclibs/1-introduction",
  "3v7SsOdxxww": "/tracks/physics-libraries/physics-libraries/toxiclibs/2-particles-and-springs",
  "YskU_gJpc0c": "/tracks/physics-libraries/physics-libraries/toxiclibs/3-connected-systems",
  "hSU19ICZVk4": "/tracks/physics-libraries/physics-libraries/toxiclibs/4-attraction-behavior",
  "MsRROjQJxuo": "/tracks/physics-libraries/physics-libraries/box2d/1-introduction",
  "e3VSVZn4BHg": "/tracks/physics-libraries/physics-libraries/box2d/2-central-elements",
  "iNHfAFx8ktQ": "/tracks/physics-libraries/physics-libraries/box2d/3-coordinate-and-vectors",
  "lmYLmcFuj2s": "/tracks/physics-libraries/physics-libraries/box2d/4-adding-to-processing-sketch",
  "1YYMiWheJuc": "/tracks/physics-libraries/physics-libraries/box2d/5-adding-to-processing-sketch-2",
  "oBcv_P_YDrw": "/tracks/physics-libraries/physics-libraries/box2d/6-static-bodies-and-chain-shapes",
  "V95dzuDw0Jg": "/tracks/physics-libraries/physics-libraries/box2d/7-complex-shapes",
  "4LYvltd07hk": "/tracks/physics-libraries/physics-libraries/box2d/8-distance-joints",
  "SUVH8Bh4ruw": "/tracks/physics-libraries/physics-libraries/box2d/9-revolute-joints",
  "Ubfqc983jN8": "/tracks/physics-libraries/physics-libraries/box2d/10-user-controlled-objects",
  "bJJbQIoJeFc": "/tracks/physics-libraries/physics-libraries/box2d/11-apply-forces",
  "pJ_M_fACtB8": "/tracks/physics-libraries/physics-libraries/box2d/12-collision-events",
  "_SRS8b4LcZ8": "/tracks/p5-tips-and-tricks/more-p5/local-storage",
  "ZneWjyn18e8": "/tracks/p5-tips-and-tricks/more-p5/github-pages-hosting",
  "76fiD5DvzeQ": "/tracks/p5-tips-and-tricks/more-p5/custom-shapes",
  "OTNpiLUSiB4": "/tracks/p5-tips-and-tricks/more-p5/2d-arrays",
  "Qf4dIN99e2w": "/tracks/the-nature-of-code-2/noc/perlin/intro-to-perlin-noise",
  "YcdldZ1E9gU": "/tracks/the-nature-of-code-2/noc/perlin/noise-vs-random",
  "y7sgcFhk6ZM": "/tracks/the-nature-of-code-2/noc/perlin/graphing-1d-perlin-noise",
  "ikwNrFvnL3g": "/tracks/noise/noc/perlin/perlin-noise-2d",
  "D1BBj2VaBl4": "/tracks/noise/noc/perlin/perlin-noise-detail",
  "Lv9gyZZJPE0": "/tracks/noise/noise/open-simplex-noise",
  "XJ7HLz9VYz0": "/tracks/neural-networks/neural-networks/1-introduction",
  "ntKn5TPHHAk": "/tracks/neural-networks/neural-networks/2-perceptron-part-1",
  "DGxIcDjPzac": "/tracks/neural-networks/neural-networks/3-perceptron-part-2",
  "u5GAVdLQyIg": "/tracks/neural-networks/neural-networks/4-multilayer-perceptron-part-1",
  "IlmNhFxre0w": "/tracks/neural-networks/neural-networks/5-multilayer-perceptron-part-2",
  "uSzGdfdOoG8": "/tracks/neural-networks/neural-networks/6-matrix-math-basics",
  "n6q9D2wd1bE": "/tracks/neural-networks/neural-networks/7-element-wise-operations",
  "puWqNBFDMMk": "/tracks/neural-networks/neural-networks/8-updating-code-to-es6",
  "NgZAIkDcPkI": "/tracks/neural-networks/neural-networks/9-matrix-product",
  "nAz9AA_pQUQ": "/tracks/neural-networks/neural-networks/10-transpose",
  "HuZbYEn8AvY": "/tracks/neural-networks/neural-networks/11-matrix-class-improvements",
  "qWK7yW8oS0I": "/tracks/neural-networks/neural-networks/12-feedforward-algorithm-part-1",
  "MPmLWsHzPlU": "/tracks/neural-networks/neural-networks/13-feedforward-algorithm-part-2",
  "QJoa0JYaX1I": "/tracks/neural-networks/neural-networks/14-backpropagation-part-1",
  "r2-P1Fi1g60": "/tracks/neural-networks/neural-networks/15-backpropagation-part-2",
  "8H2ODPNxEgA": "/tracks/neural-networks/neural-networks/16-backpropagation-part-3",
  "qB2nwJxNVxM": "/tracks/neural-networks/neural-networks/17-backpropagation-part-4",
  "tlqinMNM4xs": "/tracks/neural-networks/neural-networks/18-backpropagation-part-5",
  "sKSxBd56H70": "/tracks/mastodon/mastodon/what-is-mastodon",
  "pY4b18JGCKE": "/tracks/mastodon/mastodon/setting-up-a-mastodon-bot",
  "B8ireAeWRQk": "/tracks/mastodon/mastodon/environmental-variables-in-node",
  "dHI3cUhNWRg": "/tracks/mastodon/mastodon/posting-with-setInterval",
  "4hJykkzjXYY": "/tracks/mastodon/mastodon/streaming-api",
  "yFVc-LnBrEc": "/tracks/mastodon/mastodon/managing-user-events",
  "myPWWrkq5t0": "/tracks/mastodon/mastodon/replying-to-a-mention",
  "RF5_MPSNAtU": "/tracks/mastodon/mastodon/what-is-node-js",
  "s70-Vsud9Vk": "/tracks/mastodon/mastodon/what-is-npm",
  "FjWbUK2HdCo": "/tracks/2018-workflow/workflow/5-node",
  "-_ivRdVjjzA": "/tracks/livestreams/livestreams/creative_coding_ai_agent",
  "ORe-c1crRcE": "/tracks/livestreams/livestreams/shiffbot",
  "0OLMf81BeNU": "/tracks/livestreams/livestreams/decade-of-code",
  "1mwguqeEz8c": "/tracks/livestreams/livestreams/sentence-embeddings/clustering-sentence-embeddings",
  "QyGG15J9bAc": "/tracks/livestreams/livestreams/genuary",
  "46WOuOrMwTQ": "/tracks/discord-bots/discord/2023-workflow",
  "wM3TEvQn2hw": "/tracks/discord-bots/discord/setup-node-project",
  "AvQcTjB3gPg": "/tracks/discord-bots/discord/coding-a-bot",
  "gJa6wri8YNQ": "/tracks/2018-workflow/workflow/1-intro",
  "yJw0SyKO9IU": "/tracks/2018-workflow/workflow/2-visual-studio-code",
  "FnkkzgYuXUM": "/tracks/2018-workflow/workflow/3-shell",
  "_sLgRBrZh6o": "/tracks/2018-workflow/workflow/4-git",
  "nnhjvHYRsmM": "/tracks/2018-workflow/workflow/6-python-and-virtualenv",
  "70MQ-FugwbI": "/tracks/the-nature-of-code-2/noc/welcome/welcome-to-the-nature-of-code-in-2020-p5js",
  "3slqsMHKLng": "/tracks/the-nature-of-code-2/noc/welcome/nature-of-code-2-introduction",
  "bKEaK7WNLzM": "/tracks/the-nature-of-code-2/noc/1-vectors/1-what-is-a-vector",
  "Rob0pbE7kks": "/tracks/the-nature-of-code-2/noc/1-vectors/2-vector-math",
  "jupjuq9Jl-M": "/tracks/the-nature-of-code-2/noc/1-vectors/3-random-vectors",
  "YN8Q-QEmQ8Y": "/tracks/the-nature-of-code-2/noc/1-vectors/4-static-functions",
  "ttz05d8DSOs": "/tracks/the-nature-of-code-2/noc/1-vectors/5-unit-vector",
  "T84AWnntxZA": "/tracks/the-nature-of-code-2/noc/1-vectors/6-acceleration-vector",
  "Uibl0UE4VH8": "/tracks/the-nature-of-code-2/noc/2-forces/1-gravity-and-wind",
  "L7CECWLdTmo": "/tracks/the-nature-of-code-2/noc/2-forces/2-mass-and-acceleration",
  "WBdhAuWS6X8": "/tracks/the-nature-of-code-2/noc/2-forces/3-friction-force",
  "DxFDgOYEoy8": "/tracks/the-nature-of-code-2/noc/2-forces/4-drag-force",
  "EpgB3cNhKPM": "/tracks/the-nature-of-code-2/noc/2-forces/5-gravitational-attraction",
  "GjbKsOkN1Oc": "/tracks/the-nature-of-code-2/noc/2-forces/6-mutual-attraction",
  "DMg-WRfNB60": "/tracks/the-nature-of-code-2/noc/3-angles/1-angles-and-rotation",
  "i2ROE_mAhU0": "/tracks/the-nature-of-code-2/noc/3-angles/2-angular-motion",
  "oXwCVDXS2Lg": "/tracks/the-nature-of-code-2/noc/3-angles/3-angles-and-vectors",
  "m463X1cqV6s": "/tracks/the-nature-of-code-2/noc/3-angles/5-harmonic-motion",
  "JLAc9hMtcxk": "/tracks/the-nature-of-code-2/noc/3-angles/6-graphing-sine-wave",
  "okfZRl4Xw-c": "/tracks/the-nature-of-code-2/noc/3-angles/7-additive-waves",
  "syR0klfncCk": "/tracks/the-nature-of-code-2/noc/4-particles/1-particle-system",
  "wDYD3JVtOys": "/tracks/the-nature-of-code-2/noc/4-particles/2-particle-emitters",
  "44RSr49m6LU": "/tracks/the-nature-of-code-2/noc/4-particles/3-particle-inheritance",
  "pUhv2CA0omA": "/tracks/the-nature-of-code-2/noc/4-particles/4-particle-textures",
  "P_xJMH8VvAE": "/tracks/the-nature-of-code-2/noc/5-autonomous-agents/1-steering-agents",
  "p1Ws1ZhG36g": "/tracks/the-nature-of-code-2/noc/5-autonomous-agents/2-seeking-a-target",
  "Q4MU7pkDYmQ": "/tracks/the-nature-of-code-2/noc/5-autonomous-agents/3-pursue-and-evade",
  "OxHJ-o_bbzs": "/tracks/the-nature-of-code-2/noc/5-autonomous-agents/4-arrive-steering",
  "ujsR2vcJlLk": "/tracks/the-nature-of-code-2/noc/5-autonomous-agents/5-wander",
  "DHPfoqiE4yQ": "/tracks/the-nature-of-code-2/noc/5-autonomous-agents/6-scalar-projection",
  "rlZYT-uvmGQ": "/tracks/the-nature-of-code-2/noc/5-autonomous-agents/7-path-following",
  "9zfeTw-uFCw": "/tracks/the-nature-of-code-2/noc/9-genetic-algorithms/1-introduction",
  "RxTfc4JLYKs": "/tracks/the-nature-of-code-2/noc/9-genetic-algorithms/2-how-it-works",
  "nrKjSeoc7fc": "/tracks/the-nature-of-code-2/noc/9-genetic-algorithms/3-shakespeare-monkey-example",
  "-jv3CgDN9sc": "/tracks/the-nature-of-code-2/noc/9-genetic-algorithms/4-looking-at-code",
  "_of6UVV4HGo": "/tracks/the-nature-of-code-2/noc/9-genetic-algorithms/5-genotype-vs-phenotype",
  "HzaLIO9dLbA": "/tracks/the-nature-of-code-2/noc/9-genetic-algorithms/6-improved-fitness-function",
  "816ayuhDo0E": "/tracks/the-nature-of-code-2/noc/9-genetic-algorithms/7-pool-selection",
  "ETphJASzYes": "/tracks/the-nature-of-code-2/noc/9-genetic-algorithms/8-improved-pool-selection",
  "Zy_obitkyOE": "/tracks/the-nature-of-code-2/noc/9-genetic-algorithms/9-interactive-selection",
  "Sx_l2GxBC5w": "/tracks/the-nature-of-code-2/noc/9-genetic-algorithms/10-continuous-evolutionary-systems",
  "jmznx0Q1fP0": "/tracks/ml5js-beginners-guide/ml5/0-introduction/1-introduction",
  "yNkAuWz5lnY": "/tracks/ml5js-beginners-guide/ml5/1-classification/1-image-classification",
  "D9BoBSkLvFo": "/tracks/ml5js-beginners-guide/ml5/1-classification/2-webcam-classification",
  "QEzRxnuaZCk": "/tracks/ml5js-beginners-guide/ml5/1-classification/3-object-detection",
  "ABN_DWnM5GQ": "/tracks/ml5js-beginners-guide/ml5/9-doodleNet/1-doodleNet",
  "kRpZ5OqUY6Y": "/tracks/ml5js-beginners-guide/ml5/2-transfer-learning/1-transfer-learning",
  "eeO-rWYFuG0": "/tracks/ml5js-beginners-guide/ml5/3-feature-extractor/1-classification",
  "aKgq0m1YjvQ": "/tracks/ml5js-beginners-guide/ml5/3-feature-extractor/2-regression",
  "eU7gIy3xV30": "/tracks/ml5js-beginners-guide/ml5/4-save-and-load-model/1-save-load-model",
  "KTNqXwkLuM4": "/tracks/ml5js-beginners-guide/ml5/5-knn-classification/1-build-the-image-classifier",
  "Mwo5_bUVhlA": "/tracks/ml5js-beginners-guide/ml5/5-knn-classification/2-train-the-model",
  "JWsKay58Z2g": "/tracks/ml5js-beginners-guide/ml5/5-knn-classification/3-save-and-load-model",
  "8HEgeAbYphA": "/tracks/ml5js-beginners-guide/ml5/6-train-your-own-neural-network/1-train-the-model",
  "q6cwxORPDo8": "/tracks/ml5js-beginners-guide/ml5/6-train-your-own-neural-network/2-save-data",
  "wUrg9Hjkhg0": "/tracks/ml5js-beginners-guide/ml5/6-train-your-own-neural-network/3-save-model",
  "fFzvwdkzr_c": "/tracks/ml5js-beginners-guide/ml5/6-train-your-own-neural-network/4-regression",
  "OIo-DIOkNVg": "/tracks/ml5js-beginners-guide/ml5/7-posenet/1-finding-keypoints",
  "FYgYyq-xqAw": "/tracks/ml5js-beginners-guide/ml5/7-posenet/2-pose-classifier",
  "lob74HqHYJ0": "/tracks/ml5js-beginners-guide/ml5/7-posenet/3-pose-regression",
  "UaKab6h9Z0I": "/tracks/ml5js-beginners-guide/ml5/8-convolutional-neural-network/1-pixels-as-input",
  "qPKsVAI_W6M": "/tracks/ml5js-beginners-guide/ml5/8-convolutional-neural-network/2-architecture-of-cnn",
  "pRWq_mtuppU": "/tracks/ml5js-beginners-guide/ml5/8-convolutional-neural-network/3-max-pooling",
  "hWurN0XhzLY": "/tracks/ml5js-beginners-guide/ml5/8-convolutional-neural-network/4-image-classification",
  "cO4UP2dX944": "/tracks/ml5js-beginners-guide/ml5/10-sound-classification/1-sound-classification",
  "4JzDttgdILQ": "/tracks/learning-processing/processing",
  "BCQHnlnPusY": "/tracks/git-and-github-for-poets/git/1-fundamentals/1-intro",
  "oPpnCh7InLY": "/tracks/git-and-github-for-poets/git/1-fundamentals/2-branches",
  "_NrSWLQsDL4": "/tracks/git-and-github-for-poets/git/1-fundamentals/3-forks-pr",
  "WMykv2ZMyEQ": "/tracks/git-and-github-for-poets/git/1-fundamentals/4-issues",
  "oK8EvVeVltE": "/tracks/git-and-github-for-poets/git/1-fundamentals/5-command-line",
  "yXT1ElMEkW8": "/tracks/git-and-github-for-poets/git/1-fundamentals/6-cloning-repo",
  "9p2d-CuVlgc": "/tracks/git-and-github-for-poets/git/1-fundamentals/7-git-init",
  "bFVtrlyH-kc": "/tracks/git-and-github-for-poets/git/1-fundamentals/8-pages",
  "JtIX3HJKwfo": "/tracks/git-and-github-for-poets/git/1-fundamentals/9-resolve-conflicts",
  "lR_hYwCAaH4": "/tracks/git-and-github-for-poets/git/1-fundamentals/10-git-remotes",
  "DbcLg8nRWEg": "/tracks/data-and-apis-in-javascript/data/welcome/trailer",
  "hPbDyqzxQfU": "/tracks/data-and-apis-in-javascript/data/welcome/setup",
  "tc8DU14qX6I": "/tracks/data-and-apis-in-javascript/data/1-client-side/1-fetch",
  "RfMkdvN-23o": "/tracks/data-and-apis-in-javascript/data/1-client-side/2-tabular-data",
  "5-ptp9tRApM": "/tracks/data-and-apis-in-javascript/data/1-client-side/3-graphing",
  "uxf0--uiX0I": "/tracks/data-and-apis-in-javascript/data/1-client-side/4-json",
  "nZaZ2dB6pow": "/tracks/data-and-apis-in-javascript/data/1-client-side/5-mapping-geolocation",
  "jKQUHGpOHqg": "/tracks/data-and-apis-in-javascript/data/1-client-side/6-refreshing-data-with-setinterval",
  "wxbQP1LMZsw": "/tracks/data-and-apis-in-javascript/data/2-data-selfie-app/1-server-side-with-node-js",
  "3ls013DBcww": "/tracks/data-and-apis-in-javascript/data/2-data-selfie-app/2-geolocation-web-api",
  "Kw5tC5nQMRY": "/tracks/data-and-apis-in-javascript/data/2-data-selfie-app/3-http-post-request",
  "xVYa20DCUv0": "/tracks/data-and-apis-in-javascript/data/2-data-selfie-app/4-saving-to-a-database",
  "q-lUgFxwjEM": "/tracks/data-and-apis-in-javascript/data/2-data-selfie-app/5-database-query",
  "9Rhsb3GU2Iw": "/tracks/data-and-apis-in-javascript/data/2-data-selfie-app/6-encoding-images",
  "1mnpn6q25FI": "/tracks/data-and-apis-in-javascript/data/2-data-selfie-app/7-accessibility-and-design",
  "ZtLVbJk7KcM": "/tracks/data-and-apis-in-javascript/data/3-the-weather-here/1-api-calls-from-node-js",
  "Tiot877orkU": "/tracks/data-and-apis-in-javascript/data/3-the-weather-here/2-open-air-quality-api",
  "r94kI6my0QQ": "/tracks/data-and-apis-in-javascript/data/3-the-weather-here/3-mapping-database-entries",
  "17UVejOw3zA": "/tracks/data-and-apis-in-javascript/data/3-the-weather-here/4-environment-variables",
  "Rz886HkV1j4": "/tracks/data-and-apis-in-javascript/data/3-the-weather-here/5-web-application-deployment",
  "HerCR8bw_GE": "/tracks/code-programming-with-p5-js/code/0-trailer/trailer",
  "yPWkPOfnGsw": "/tracks/code-programming-with-p5-js/code/1-intro/1-intro",
  "MXs1cOlidWs": "/tracks/code-programming-with-p5-js/code/1-intro/2-web-editor",
  "c3TeLi6Ns1E": "/tracks/code-programming-with-p5-js/code/1-intro/3-shapes-drawing",
  "riiJTF5-N7c": "/tracks/code-programming-with-p5-js/code/1-intro/4-color",
  "LuGsp5KeJMM": "/tracks/code-programming-with-p5-js/code/1-intro/5-errors",
  "xJcrPJuem5Q": "/tracks/code-programming-with-p5-js/code/1-intro/6-comments",
  "7A5tKW9HGoM": "/tracks/code-programming-with-p5-js/code/2-variables/1-mouseX-mouseY",
  "dRhXIIFp-ys": "/tracks/code-programming-with-p5-js/code/2-variables/2-define-variables",
  "T26OJGjI8qI": "/tracks/code-programming-with-p5-js/code/2-variables/3-incrementation",
  "POn4cZ0jL-o": "/tracks/code-programming-with-p5-js/code/2-variables/4-random",
  "nicMAoW6u1g": "/tracks/code-programming-with-p5-js/code/2-variables/5-map",
  "TaluaAD9MKA": "/tracks/code-programming-with-p5-js/code/2-variables/6-createGraphics",
  "1Osb_iGDdjk": "/tracks/code-programming-with-p5-js/code/3-conditionals/1-conditionals",
  "LO3Awjn_gyU": "/tracks/code-programming-with-p5-js/code/3-conditionals/2-bouncing",
  "r2S7j54I68c": "/tracks/code-programming-with-p5-js/code/3-conditionals/3-else-if-and-or",
  "Rk-_syQluvc": "/tracks/code-programming-with-p5-js/code/3-conditionals/4-boolean",
  "cnRD9o6odjk": "/tracks/code-programming-with-p5-js/code/4-loops/1-while-for",
  "1c1_TMdf8b8": "/tracks/code-programming-with-p5-js/code/4-loops/2-nested",
  "wRHAitGzBrg": "/tracks/code-programming-with-p5-js/code/5-functions/1-basics",
  "zkc417YapfE": "/tracks/code-programming-with-p5-js/code/5-functions/2-arguments",
  "qRnUBiTJ66Y": "/tracks/code-programming-with-p5-js/code/5-functions/3-return",
  "xG2Vbnv0wvg": "/tracks/code-programming-with-p5-js/code/6-objects/1-intro",
  "5nf41qLeagU": "/tracks/code-programming-with-p5-js/code/6-objects/4-editor-js-files",
  "VIQoUghHSxU": "/tracks/code-programming-with-p5-js/code/7-arrays/1-arrays",
  "RXWO3mFuW-I": "/tracks/code-programming-with-p5-js/code/7-arrays/2-arrays-loops",
  "fBqaA7zRO58": "/tracks/code-programming-with-p5-js/code/7-arrays/3-arrays-objects",
  "TaN5At5RWH8": "/tracks/code-programming-with-p5-js/code/7-arrays/4-mouse-interaction",
  "tA_ZgruFF9k": "/tracks/code-programming-with-p5-js/code/7-arrays/5-removing-elements",
  "W1-ej3Wu5zg": "/tracks/code-programming-with-p5-js/code/7-arrays/6-object-communication-1",
  "5Q9cA0REztY": "/tracks/code-programming-with-p5-js/code/7-arrays/7-object-communication-2",
  "rO6M5hj0V-o": "/tracks/code-programming-with-p5-js/code/7-arrays/upload-editor",
  "i2C1hrJMwz0": "/tracks/code-programming-with-p5-js/code/7-arrays/8-objects-images"
}

Copy link

netlify bot commented Jul 9, 2024

Deploy Preview for codingtrain ready!

Name Link
🔨 Latest commit 6ff260f
🔍 Latest deploy log https://app.netlify.com/sites/codingtrain/deploys/668d5b3f723bea0008ec9186
😎 Deploy Preview https://deploy-preview-1650--codingtrain.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify site configuration.

@shiffman
Copy link
Member

This is fantastic, thank you @fturmel!

@shiffman shiffman merged commit e6650f7 into CodingTrain:main Jul 12, 2024
5 checks passed
@fturmel fturmel deleted the PR/youtube-redirects branch July 12, 2024 22:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants