From a6d5e833756b8921479a7a7a149fa7f2b97c955a Mon Sep 17 00:00:00 2001 From: Mike Hartington Date: Tue, 3 Mar 2026 22:31:16 -0500 Subject: [PATCH 1/4] chore(blog): set blog to use multi-zone setup --- .../index.mdx | 19 +- .../index.mdx | 7 +- .../blog/accelerate-ipv6-first/index.mdx | 6 +- .../index.mdx | 7 +- .../accelerate-static-ip-support/index.mdx | 19 +- .../index.mdx | 7 +- .../index.mdx | 4 +- .../ambassador-program-nxkwgcgnuvfx/index.mdx | 6 +- .../index.mdx | 10 +- .../index.mdx | 7 +- .../announcing-discord-1liaops7lxv9/index.mdx | 8 +- .../index.mdx | 9 +- .../index.mdx | 8 +- .../index.mdx | 12 +- .../blog/announcing-prisma-6-18-0/index.mdx | 9 +- .../blog/announcing-prisma-6-19-0/index.mdx | 10 +- .../index.mdx | 4 +- .../announcing-prisma-orm-7-0-0/index.mdx | 6 +- .../announcing-prisma-orm-7-2-0/index.mdx | 6 +- .../index.mdx | 12 +- .../index.mdx | 26 +- .../index.mdx | 8 +- .../index.mdx | 4 +- .../index.mdx | 6 +- .../index.mdx | 8 +- .../index.mdx | 6 +- .../content/blog/aws-marketplace/index.mdx | 6 +- .../index.mdx | 7 +- .../index.mdx | 7 +- .../index.mdx | 25 +- .../index.mdx | 5 +- .../index.mdx | 26 +- apps/blog/content/blog/bfg/index.mdx | 6 +- .../index.mdx | 6 +- .../index.mdx | 18 +- .../index.mdx | 14 +- .../index.mdx | 10 +- .../index.mdx | 8 +- .../index.mdx | 7 +- .../cloud-connectivity-report-2024/index.mdx | 22 +- .../index.mdx | 6 +- .../index.mdx | 14 +- .../blog/cockroach-ga-5jrd9xvwqdyl/index.mdx | 16 +- .../blog/compliance-reqs-complete/index.mdx | 6 +- .../index.mdx | 8 +- .../index.mdx | 6 +- apps/blog/content/blog/convergence/index.mdx | 4 +- .../coo-announcement-aer1fgviirjb/index.mdx | 6 +- .../blog/data-platform-static-ips/index.mdx | 11 +- .../index.mdx | 14 +- .../index.mdx | 14 +- .../datadx-event-recap-z5pcp6hzbz5m/index.mdx | 6 +- .../datadx-manifesto-ikgyqj170k8h/index.mdx | 6 +- .../index.mdx | 4 +- .../blog/datamodel-v11-lrzqy1f56c90/index.mdx | 6 +- .../documenting-apis-mjjpz7e7nkvp/index.mdx | 12 +- .../index.mdx | 19 +- .../index.mdx | 23 +- .../index.mdx | 25 +- .../index.mdx | 51 ++-- .../index.mdx | 10 +- .../index.mdx | 12 +- .../blog/esop-exercise-windows/index.mdx | 4 +- .../index.mdx | 9 +- .../index.mdx | 11 +- .../index.mdx | 26 +- .../index.mdx | 29 +-- .../index.mdx | 39 +-- .../index.mdx | 45 ++-- .../index.mdx | 25 +- .../index.mdx | 13 +- .../index.mdx | 37 ++- .../index.mdx | 23 +- .../index.mdx | 43 ++-- .../index.mdx | 51 ++-- .../index.mdx | 35 +-- .../index.mdx | 20 +- .../index.mdx | 4 +- .../blog/graphql-eu-18-eiw8bishe2di/index.mdx | 18 +- .../graphql-middleware-zie3iphithxy/index.mdx | 8 +- .../index.mdx | 4 +- .../index.mdx | 4 +- .../index.mdx | 6 +- .../index.mdx | 12 +- .../index.mdx | 6 +- .../index.mdx | 4 +- .../index.mdx | 10 +- .../index.mdx | 8 +- .../blog/how-bucket-uses-prisma-orm/index.mdx | 7 +- .../index.mdx | 4 +- .../index.mdx | 7 +- .../index.mdx | 14 +- .../index.mdx | 6 +- .../index.mdx | 4 +- .../index.mdx | 8 +- .../index.mdx | 20 +- .../index.mdx | 16 +- .../index.mdx | 4 +- .../index.mdx | 16 +- .../index.mdx | 4 +- .../index.mdx | 13 +- .../index.mdx | 6 +- .../index.mdx | 12 +- .../index.mdx | 12 +- .../index.mdx | 8 +- .../index.mdx | 13 +- .../index.mdx | 19 +- .../index.mdx | 17 +- .../index.mdx | 13 +- .../index.mdx | 4 +- .../index.mdx | 9 +- .../index.mdx | 4 +- .../index.mdx | 19 +- .../blog/introducing-prisma-nuxt/index.mdx | 12 +- .../index.mdx | 12 +- .../index.mdx | 12 +- .../blog/labelbox-simnycbotiok/index.mdx | 4 +- .../index.mdx | 8 +- .../index.mdx | 18 +- .../index.mdx | 25 +- .../index.mdx | 17 +- .../index.mdx | 8 +- .../index.mdx | 15 +- .../index.mdx | 19 +- .../index.mdx | 19 +- .../index.mdx | 21 +- .../index.mdx | 21 +- .../index.mdx | 8 +- .../blog/operations-based-billing/index.mdx | 4 +- .../index.mdx | 15 +- .../index.mdx | 12 +- .../index.mdx | 9 +- .../index.mdx | 16 +- .../index.mdx | 7 +- .../index.mdx | 12 +- .../index.mdx | 12 +- .../index.mdx | 14 +- .../index.mdx | 11 +- .../index.mdx | 7 +- .../index.mdx | 6 +- .../index.mdx | 8 +- .../index.mdx | 16 +- .../index.mdx | 6 +- .../index.mdx | 8 +- .../blog/prisma-2-beta-b7bcl0gd8d8e/index.mdx | 6 +- .../blog/prisma-5-f66prwkjx72s/index.mdx | 24 +- .../blog/prisma-6-8-0-release/index.mdx | 11 +- .../blog/prisma-6-9-0-release/index.mdx | 11 +- .../index.mdx | 6 +- .../prisma-7-performance-benchmarks/index.mdx | 8 +- .../prisma-adopts-semver-strictly/index.mdx | 6 +- .../prisma-and-graphql-mfl5y2r7t49c/index.mdx | 16 +- .../index.mdx | 34 +-- .../index.mdx | 6 +- .../index.mdx | 17 +- .../prisma-data-proxy-xb16ba0p21/index.mdx | 11 +- .../index.mdx | 12 +- .../index.mdx | 6 +- .../blog/prisma-insider-program/index.mdx | 6 +- .../index.mdx | 6 +- .../prisma-migrate-dx-primitives/index.mdx | 11 +- .../prisma-migrate-ga-b5eno5g08d0b/index.mdx | 17 +- .../index.mdx | 8 +- .../prisma-mongodb-preview-release/index.mdx | 6 +- .../index.mdx | 15 +- .../prisma-optimize-early-access/index.mdx | 6 +- .../index.mdx | 7 +- .../blog/prisma-orm-manifesto/index.mdx | 7 +- .../index.mdx | 23 +- .../index.mdx | 15 +- .../index.mdx | 8 +- .../index.mdx | 9 +- .../index.mdx | 4 +- .../index.mdx | 10 +- .../index.mdx | 14 +- .../index.mdx | 7 +- .../index.mdx | 8 +- .../index.mdx | 14 +- .../index.mdx | 8 +- .../index.mdx | 4 +- .../blog/prisma-startup-program/index.mdx | 4 +- .../blog/prisma-studio-3rtf78dg99fe/index.mdx | 16 +- .../index.mdx | 18 +- .../index.mdx | 22 +- .../index.mdx | 8 +- .../index.mdx | 4 +- .../index.mdx | 4 +- .../index.mdx | 6 +- .../index.mdx | 10 +- .../index.mdx | 9 +- .../satisfies-operator-ur8ys8ccq7zb/index.mdx | 6 +- .../index.mdx | 18 +- .../index.mdx | 10 +- .../index.mdx | 16 +- .../index.mdx | 8 +- .../index.mdx | 8 +- .../index.mdx | 11 +- .../sveltekit-prisma-kvcoeoeqlc/index.mdx | 8 +- .../testing-series-1-8erb5p0y8o/index.mdx | 15 +- .../testing-series-2-xphjjmiesm/index.mdx | 17 +- .../testing-series-3-abuyf8nxan/index.mdx | 17 +- .../testing-series-4-ovxtdis201/index.mdx | 29 +-- .../testing-series-5-xwogenroxm/index.mdx | 27 +- .../index.mdx | 4 +- .../index.mdx | 9 +- .../top-5-myths-about-prisma-orm/index.mdx | 23 +- .../index.mdx | 6 +- .../index.mdx | 14 +- .../index.mdx | 19 +- .../index.mdx | 10 +- .../index.mdx | 10 +- .../index.mdx | 14 +- .../index.mdx | 20 +- .../index.mdx | 6 +- .../blog/tweets-for-trees-arboreal/index.mdx | 8 +- .../index.mdx | 8 +- .../index.mdx | 13 +- .../index.mdx | 6 +- .../index.mdx | 10 +- .../index.mdx | 20 +- .../index.mdx | 8 +- .../index.mdx | 16 +- .../index.mdx | 6 +- .../index.mdx | 11 +- .../content/blog/why-prisma-2024/index.mdx | 15 +- .../index.mdx | 8 +- .../index.mdx | 7 +- .../index.mdx | 4 +- .../index.mdx | 6 +- .../content/blog/wnip-q1-dsk0golh8v/index.mdx | 6 +- .../blog/wnip-q2-2022-pmn7rulcj8x/index.mdx | 8 +- .../content/blog/wnip-q3-hpk7pyth8v/index.mdx | 6 +- .../blog/wnip-q4-2022-f66prwkjx72s/index.mdx | 14 +- .../content/blog/wnip-q4-dsk0golh8v/index.mdx | 6 +- .../index.mdx | 14 +- apps/blog/next.config.mjs | 231 +++++++++++++++++- ...fcabcb6037fcb5fbe1d33856fc99-1816x1400.png | Bin ...76150075536f39a1d00a014da6b1-1950x1240.png | Bin ...4e787cf74adbcbd9940f6cdb4ae2-2888x2644.png | Bin ...b4a0969ed268408ef95d6f301d53-2888x1372.png | Bin ...32bad731a1ca4c514d7c66ea9616-2888x1372.png | Bin ...68f0458172fb2f8bfa532b82f7ed-2068x1600.png | Bin ...1028b64219b2144f7b5c03723c4d99-844x474.svg | 0 ...563ecc68ddf667e18dbef71f9f4fd-1266x711.png | Bin ...d144f63f476efc98b9ba9d5ccb29a8-400x400.jpg | Bin ...7e1bb0e8ca928e5d1a0b58ccfe8220-800x800.jpg | Bin .../imgs/formbricks.svg | 0 ...f2a86abd05659c94c3069e7577a0f5-844x474.svg | 0 .../imgs/logo-cal.svg | 0 ...6c00b0ca55e1e440dde26f43dcb3f-1266x711.png | Bin ...eee73ee2c7f94a7d194de949af1524-844x475.svg | 0 ...e17d003b0a06190a5fa5c0e3fcc15-1266x713.png | Bin ...on-pool-located-in-the-database-region.png | Bin .../imgs/global-cache.png | Bin ...68af2258cd4e5f0453710b0b94259c-844x474.svg | 0 ...837980765d5b7589367216653d6b7-1266x711.png | Bin ...bb42137006d8f8b0ad16b23ac648b-2960x988.png | Bin ...c5b575e06024aec82d5bf08eb57e-2960x1406.png | Bin ...7e94ffb2739a1face51226c6ce5f-2572x1570.png | Bin ...c4418e360b6a4114e3a0d3c16d7fab-791x344.png | Bin ...8d9962b6cc0b72b7e5a8c1af341b-2978x1976.png | Bin ...431083fafc0eb1f25ba8c3c7203b6-1480x703.png | Bin ...97f2571d34972ec912ad3c32f37ba6-844x474.svg | 0 ...2c051a689abed3d4b7099a8145301-1200x674.png | Bin ...99fbf2a745f528d83a194350d0ee74-844x475.svg | 0 ...cfb1bcc2e53bc83e377e1af47cd5d-1200x675.png | Bin ...cfb33c4e35eac48e11a80532a8d30-1440x960.jpg | Bin ...5ded8d448f28db203012147fdcd39e-846x426.png | Bin ...5c52078065ee2ae0b44d6cdf0da1e-1692x852.png | Bin ...-83d5bddb-e3e7-46fa-9d47-f247ce42c68b.jpeg | Bin .../imgs/amplication-prisma-diagram2.png | Bin .../imgs/amplication-ui.png | Bin ...fca054011688621bfe51ea1836af10-844x474.svg | 0 ...a8e13e23367137d5a17515119aaf-2881x1620.png | Bin ...73719cebc60136dd4e976d79306dcb-845x475.svg | 0 ...423e24c7aff2bb3fe49a433996d03-1200x631.png | Bin .../imgs/discord-screenshot.png | Bin ...6a1f6a68f815b4cffee5ee1b1ce934-844x474.svg | 0 ...0f7eeaf42604a4645c93dd051af6a-1267x712.png | Bin ...f666cc403923788d01a5eb0c959970-870x804.gif | Bin ...cf0620564331dda7e0c65bcd069ef2-844x474.svg | 0 ...5985278c069ade326008e14baef9a-1266x711.png | Bin .../imgs/5YEs4IC.png | Bin .../imgs/YWeTRfU.mp4 | Bin .../imgs/cQRivY4.png | Bin ...ccbc812212d1d6d7c8794d9514f2f-1692x852.jpg | Bin .../imgs/kPGJU6j.png | Bin .../imgs/AG34kGB.png | Bin .../imgs/bFUA7LC.png | Bin .../imgs/gqbGz7b.png | Bin ...e3cad0d84a376d12b58b82ee10da0-1200x630.png | Bin .../imgs/l1Jg54Y.png | Bin ...f4ed3d4df4be8ab04809a83dcdfc-2880x1664.png | Bin ...4982ce17726b525221e1e1de6eb1a1-844x474.svg | 0 ...180336b63d1da7fe47a2520db99f5-1266x711.png | Bin ...69e18d23dd3c38c25fb2af113b9e-3840x1632.png | Bin ...b247bc0f088a71d844d66b64d5da38-844x474.svg | 0 ...cfeb58a8405888c303ce5b6b279fb-1266x711.png | Bin ...4c57665d4a32cc5fdae5b5bfcad50-1200x630.png | Bin ...65ed958af330fc9dc93f635920b43-1200x630.png | Bin ...f9fca80962be7d17ee7582d53cb322-400x400.jpg | Bin ...cb6bc7116f609982eef70a7efdca21-400x400.png | Bin ...ed7c0c255b338cf93b4e498ef540a8-400x400.jpg | Bin ...f4bd03130bed3589b7d240c29ce325-844x474.svg | 0 ...38ef00eb7b90286801660d84a9a0e-1266x711.png | Bin ...1361fc56212a05c7efd36b78e62ff3-844x474.svg | 0 ...5b58e706489c501174d1d00eb99ec-1266x711.png | Bin ...9d21fc0d32410b0b3ac83242fcd020-844x474.svg | 0 ...cf5fccadfadd70b449d857ee62116-1688x948.png | Bin .../imgs/playground-1.png | Bin .../imgs/playground-2.png | Bin .../imgs/playground-3.png | Bin ...3aba7d53ea1f10ab731171741b2a0e-200x200.png | Bin .../imgs/13131.png | Bin ...3803db87032122e7ade619554c4e-2888x1236.png | Bin ...636a6c13963cf3211c538beb8301a-1734x678.png | Bin ...8c93e52193c963fc0c9889ea9df5a-1282x504.png | Bin ...dc079b0db4b848483b59f2e99d50b-1740x232.png | Bin ...482b7372b74a8ace42afe009d86d2-1610x886.png | Bin ...0904e726ef326c34e816553e605b8-1080x838.png | Bin ...f39105629e6aadc77554eeaea256d-1204x274.png | Bin ...6fad242fac28520fbe6199a9deae-2888x1858.png | Bin ...437dc71d217e3bee9d3b4755788c-2510x1290.png | Bin ...1841af6c46fee0683b93179052358-1114x592.png | Bin ...b811ead970edee0ae69150f6e25c-2888x1858.png | Bin ...ef9b28f0d5c7f3716e643015c62099-690x362.png | Bin ...a5447955824c28ae43788e7c407adf-633x356.png | Bin ...eae9429254e7ed11b483985ba4e50-1266x711.png | Bin ...1f1db39c0fa35305107c611a6c9a4-1444x434.png | Bin ...51a45e91418d443573f0c38accc78d-844x474.svg | 0 ...8f019820d370b8a5f74ab14170fdc-1266x711.png | Bin ...c6971db0da1e546a13a985ec47f6f3-844x474.svg | 0 ...31edce5fd389f4b2ee52b0f71a162-1266x711.png | Bin ...0567a4b2ac96a0cac738b916d7416-1692x852.png | Bin ...e4c94930404a027807ca6ec0c2e3-2398x1208.png | Bin .../imgs/nexus-jsdoc.png | Bin ...9ab75107576ad53720a7731c75797a-844x474.png | Bin ...56ad41636c0f7938159b1fd740651-1688x948.png | Bin ...78636ddc08d50f408c042800bac92-1270x714.png | Bin ...60a5322d236b809eaf9555aa725651-844x474.svg | 0 ...fbce2d4e09174ee22a13f77e758d3-1266x711.png | Bin ...a42b2bb796a971053669fbc90e36ee-846x426.svg | 0 ...db1fce65c68320479268f4cdcffd3-1692x852.png | Bin .../imgs/modern-backend-3-auth-flow.png | Bin .../imgs/grading-app-schema.png | Bin ...bde800c1ba033b94e182ab3565110-1692x852.png | Bin ...81fe4d675e11574d1bbcf8ea9de46-1692x852.png | Bin .../imgs/modern-backend-4-actions-enable.png | Bin .../imgs/modern-backend-4-actions-tab.png | Bin .../modern-backend-4-github-new-secret.png | Bin ...dern-backend-4-github-no-secrets-arrow.png | Bin .../imgs/modern-backend-4-github-secrets.png | Bin .../imgs/modern-backend-4-heroku-api-key.png | Bin ...dern-backend-4-workflow-run-deploy-job.png | Bin .../modern-backend-4-workflow-run-details.png | Bin ...modern-backend-4-workflow-run-test-job.png | Bin .../imgs/modern-backend-4-workflow-run.png | Bin ...4e62111c88b37b71091676e29f616-1692x852.png | Bin .../imgs/1-a-first-request.png | Bin .../imgs/1-b-subsequent.png | Bin .../imgs/2-a-with-cache.png | Bin .../imgs/2-a-without-cache.png | Bin .../imgs/3-a-with-cache.png | Bin .../imgs/3-a-without-cache.png | Bin .../imgs/4-a-cache-syncronization.png | Bin .../imgs/5-a-granularity.png | Bin .../imgs/6-cache-utilization.png | Bin .../imgs/7-cache-avalanche.png | Bin ...7c3b5735077783e1db72216b8a56dd-844x474.svg | 0 ...cdf86b51087621b4b0e79ac12fde7-1266x712.png | Bin ...d354d43e61580e8fc6f1855839e4e5-844x474.svg | 0 ...582c9e4ce13d14f2001a485d281d3-1266x711.png | Bin ...f7bef3d318fac96652548cad0ef0b5-844x474.svg | 0 ...d5f308f3faa684d09f647974d77b6-1200x630.png | Bin ...60a393f68694b8bab707306822df3-1692x852.png | Bin ...907c22c0ef2dd88e69992f950026-2400x1256.png | Bin .../imgs/svelte-typescript-1.png | Bin .../imgs/svelte-typescript-2.png | Bin .../imgs/svelte-typescript-3.png | Bin .../imgs/svelte-typescript-4.png | Bin .../imgs/svelte-typescript-5.png | Bin .../imgs/svelte-typescript-6.png | Bin .../imgs/svelte-typescript-7.png | Bin .../imgs/svelte-typescript-8.png | Bin ...9d997e95b6aaa24a13ef5d40cbb8-1950x1392.png | Bin .../imgs/1200px-Cloudflare_Logo.png | Bin ...4bc01a9eac9d3a103d8ef2ab9dfd-1960x1386.png | Bin ...c399e5466b8dc5d73e8e9509cab0-1480x1696.png | Bin ...f15d65fd3dd6d792c9a575db648895-844x474.png | Bin ...74d63b5a3b8bc951c13aeb9187101-1266x711.png | Bin ...f6190228e118596eed223a1ea99e-2888x1110.png | Bin ...20323649d054718900fb542b6042-2888x1110.png | Bin ...2a08e1ebad1e81b0cc0d43c30b06-2888x1110.png | Bin ...2307eb14396450817be41bb1e7c305-844x474.svg | 0 ...1771e65e078aa6ebee2b402c28578-1266x711.png | Bin ...de2f9288368dacbce578b790bfd66d-844x474.svg | 0 ...67ad67ce89e682aca57f5e19fd65a-1266x712.png | Bin ...d0759af1c6e3f3bcba5d4ebb1d970b-844x474.svg | 0 ...2f835cfce511739e46b5f6df982cd-1266x712.png | Bin ...a38430c333ecc3e64874e450f36db-1484x304.png | Bin ...d9defbaac092404b907ed69507e3e-1484x406.png | Bin ...4b5b0182ffa107c8facdf644c45c2-1484x508.png | Bin ...a7d40565cba4e2b38ab42dbd74c28-1200x630.png | Bin ...58e8d406c45cdc75172dfc013cdc7-1480x778.png | Bin ...40468af6c2c2d7335bf9691c8bedb-1200x630.png | Bin ...739302c7bc6209ef01b2f157146f3-1480x302.png | Bin ...f475c30cc2b06dff9e6c0f484b7f1-1480x302.png | Bin ...b49f2e6e4c5369db024db349c0fd6-1484x304.png | Bin ...776d8457722f79222e915cd08aa6a3-844x474.svg | 0 ...18cc130df73ce6102d5154c7ad39c-1200x630.png | Bin ...c5c097cc8cfa5dc08581458138758f-844x474.svg | 0 ...bc7d99b379b6e68668c6135aca53c-1266x711.png | Bin ...596e6765f72475d6811a57c61947-4064x2334.png | Bin ...e3b8940b3be286ce9080129e5d05-2960x1822.png | Bin ...dc079b0db4b848483b59f2e99d50b-1740x232.png | Bin ...ab3c4bbef178b0944da6f97a9c2c2f-660x852.png | Bin ...51a50fe047743347f2d0165d62f214-714x859.png | Bin ...dce256ee6090919392141e9da30678-844x474.svg | 0 ...3eb0c00322a230a463628f4799fb4-1266x711.png | Bin .../imgs/cockroach-diagram.png | Bin ...dab44f271d4f0dd1ad658507f55b66-844x474.svg | 0 ...789939fb2b2af2bf3f82378cebc0-1920x1080.png | Bin .../imgs/migration.png | Bin .../imgs/release-notes.png | Bin .../imgs/statements.png | Bin ...d54f9016987dc7885b6b032c1bc140-844x474.svg | 0 ...548e3c000c94e5dab3874b4272046-1266x711.png | Bin ...5ec1c09e6285933fc7ec16ad1902-3248x2112.png | Bin ...921f9c72bd78bcd5b04717f20cf9e4-844x474.svg | 0 ...294ebba377f758ce1139e3c46bcef-1266x711.png | Bin .../imgs/0*sPafc6eXHJvRSJhZ.png | Bin ...177e03b9e08b9f1f1522dc1debbc6d-559x361.png | Bin ...244cb877764a6a4a850b2c9223871-1200x775.png | Bin ...9a13ee528e8b2a085d47fc962a3ca7-840x472.png | Bin ...15c9ae5cb17379fcff0da144c7b35-1266x711.png | Bin ...cd64f5be9677d4fab38140809b0f9-1267x711.png | Bin ...b8ce0fa61dead528141fa1e8b911be-844x474.svg | 0 ...118302aa8e56bbaf31e46436bfc91-1269x640.png | Bin .../imgs/pdp-static-egress-demo.gif | Bin .../imgs/pdp-static-egress-project.gif | Bin ...fe34f5d79d884f6f599c22a4107fa1-846x426.png | Bin ...c32135332ef9c28b41e076e2c8998-1251x630.png | Bin .../imgs/network-waterfall.png | Bin .../imgs/server-components-demo.png | Bin .../imgs/spotify-artist-details.png | Bin ...ional-and-server-components-comparison.png | Bin ...4a48970178b9357c95b7c69773e1-1242x1694.png | Bin ...de64f8caaa359a2870df758d3c91-3200x1256.png | Bin ...a4fec41786e1acfd8ea81be54ba073-404x571.png | Bin ...34771ff6856d9fcd6e77aef7bf04-1228x1708.png | Bin ...0bbf21e0b169f955a09f79332fb75b-844x474.svg | 0 ...2f57459fa70702fabf854946e6e13-1266x711.png | Bin ...72cd3791887b9664ecd25e4dc65cff-843x474.svg | 0 ...8d3e4eedd05759f69d6876b72d313-1265x711.png | Bin ...690da1dd594236284a8efa71a8f82f-844x474.svg | 0 ...3ae651da6ecc88c021bb9d84eba1b-1266x711.png | Bin ...810d8c9af92e0bfc3e4a4b21dd9bf0-844x474.svg | 0 ...29b59c11ad00ea86bdc7cfbbd0ed5-1266x711.png | Bin ...e62110fd2839ba4f0185795ee5db4-1200x630.png | Bin .../imgs/wJCyxVy.png | Bin ...0-06d2f780-9f63-11eb-9f82-f7bd75d58558.png | Bin ...9-bfa72f80-9f7f-11eb-9fde-f995c6f51262.png | Bin ...6-ef583680-9f83-11eb-9155-753600312788.png | Bin .../imgs/1_btqXg9fLTExVjRDyrY1vsA.jpeg | Bin ...70f0c52daa613dae904b463342823-1692x852.png | Bin .../imgs/finished-ui.png | Bin ...1e7f9a0250db211bdf5284da11d2d8-844x474.svg | 0 .../imgs/localhost.png | Bin .../imgs/messages-displayed.png | Bin ...8391e4b3d0374523d45639d1318a6-1269x715.png | Bin .../imgs/tailwind-complete.png | Bin .../imgs/user-displayed.png | Bin .../imgs/vite-starter.png | Bin ...17165045cc051d8845880e5a313baf-844x474.svg | 0 ...be93c511d0ef6cbc29e2cff49e387-1269x715.png | Bin .../imgs/railway-connect.png | Bin .../imgs/railway-data.png | Bin .../imgs/railway-home.png | Bin .../imgs/railway-new-db.png | Bin .../imgs/railway-postgres-option.png | Bin .../imgs/railway-tables.png | Bin .../imgs/run-dev.png | Bin .../imgs/data.png | Bin .../imgs/explorer.png | Bin .../imgs/generate.png | Bin ...bf7e691114b2768df5ddfe12e00934-844x474.svg | 0 ...277e7cf2cfde5311381d601463251-1269x715.png | Bin .../imgs/model-auto.png | Bin .../imgs/playground.png | Bin .../imgs/prisma-client-required.png | Bin .../imgs/prisma-type-required.png | Bin .../imgs/yoga-start.png | Bin .../imgs/1.png | Bin .../imgs/2.png | Bin .../imgs/3.png | Bin .../imgs/api-url.png | Bin .../imgs/app-complete.png | Bin .../imgs/codegen.png | Bin .../imgs/finished.png | Bin .../imgs/generated-types.png | Bin .../imgs/github-api-url.png | Bin .../imgs/github-api.png | Bin .../imgs/github-create.png | Bin .../imgs/github-new.png | Bin ...2267b2f5a9b5d2bd7f06e053febf0f-844x474.svg | 0 ...52b8e3e634d75bc70b9d624431cf7-1269x715.png | Bin .../imgs/render-api-connection.png | Bin .../imgs/render-api-url.png | Bin .../imgs/render-connect.png | Bin .../imgs/render-deploy-service.png | Bin .../imgs/render-free.png | Bin .../imgs/render-new.png | Bin .../imgs/render-web-service.png | Bin .../imgs/url-github.png | Bin .../imgs/elsevier-architecture-diagram.png | Bin ...703742d0016b7a60b69e0cc262dc8-1692x852.png | Bin .../imgs/peer-review-diagram-V3.png | Bin .../imgs/1*LnVsDQuQtSl-Wt-m6DfO5g.png | Bin .../imgs/1*ZbsVGATAeIp5iU2504VP2A.png | Bin .../imgs/1*m6QGz5tXtLt7uVapNCpBEw.png | Bin ...11e06bf0170f1e0416f589d50262dd-720x481.jpg | Bin ...ac7a4c48892a3e196329e955984278-844x474.svg | 0 ...afc4cf8f1620698c60d0c2a6cd768-1200x630.png | Bin ...17cf3caaeacd5e46d17a6189105a1c-512x512.png | Bin ...7f115e3b5740d6b5aba945e6b007-2000x1337.png | Bin ...c3e1bfd7d7d262e086c9ced48412fa-804x474.svg | 0 ...fabc28fd03092a220f9ad09fccc84-1800x945.png | Bin ...897d07fa9422a4c9a2415befb0a80-1480x695.png | Bin ...06e4515a5b40eead655dcf35c0551-1280x600.png | Bin ...89520601e5a727a48e01b07475569-1280x889.png | Bin ...395fe407ce7fb6b603bb7c5ff3e460-844x474.svg | 0 ...412b0d678ab94a9804127188fde00-1266x711.png | Bin .../imgs/vXvfrfqqDbU | 0 ...24fc37acc24f269c8b6a0628ad5a18-870x438.jpg | Bin ...fb62ed50e0da3deed2b2908d0156-2398x1208.png | Bin .../imgs/nx-prisma-1.png | Bin .../imgs/nx-prisma-10.png | Bin .../imgs/nx-prisma-2.png | Bin .../imgs/nx-prisma-3.png | Bin .../imgs/nx-prisma-4.png | Bin .../imgs/nx-prisma-5.png | Bin .../imgs/nx-prisma-6.png | Bin .../imgs/nx-prisma-7.png | Bin .../imgs/nx-prisma-8.png | Bin .../imgs/nx-prisma-9.png | Bin .../imgs/awesome-links-starter-project.png | Bin .../imgs/cursor-pagination.png | Bin .../imgs/graphiql-documentation-explorer.png | Bin .../imgs/graphiql-example-query.png | Bin .../imgs/graphiql-playground.png | Bin .../imgs/graphiql-pothos-ok-query.png | Bin .../imgs/graphiql-query-db-data.png | Bin ...b86c6d7a625f95cd6b42f76c8c5e7-1269x714.png | Bin .../imgs/infinite-scrolling.gif | Bin .../imgs/offset-skip-take.png | Bin .../imgs/pagination-on-the-client-diagram.png | Bin .../imgs/pagination-on-the-server-diagram.png | Bin .../imgs/app-login-signup.png | Bin .../imgs/auth0-action-add-hook-secret.png | Bin .../imgs/auth0-action-add-module.png | Bin .../auth0-action-customize-login-flow.png | Bin .../imgs/auth0-actions-create-new.png | Bin .../imgs/auth0-actions-define-action.png | Bin .../imgs/auth0-actions-login.png | Bin .../imgs/auth0-actions-ui.png | Bin .../imgs/auth0-app-settings-url.png | Bin .../imgs/auth0-app-settings.png | Bin .../imgs/auth0-create-application.png | Bin .../imgs/auth0-home.png | Bin ...b378a17154ba9cb238ed0953434c64-844x474.svg | 0 ...cdbd825ecc504f44bf57d5916e0af-1269x714.png | Bin .../imgs/ngrok.png | Bin .../imgs/prisma-studio-created-user.png | Bin .../imgs/prisma-studio-role-update.png | Bin .../imgs/aws-iam-all-users.png | Bin .../imgs/aws-iam-create-user-screen.png | Bin .../imgs/aws-iam-optional-tags.png | Bin .../imgs/aws-iam-permissions.png | Bin .../imgs/aws-iam-pick-username.png | Bin .../imgs/aws-iam-user-credentials.png | Bin .../imgs/aws-iam-users.png | Bin .../imgs/aws-management-console.png | Bin .../imgs/aws-s3-access-settings.png | Bin .../imgs/aws-s3-bucket-permissions.png | Bin .../imgs/aws-s3-bucket-policy.png | Bin .../imgs/aws-s3-cors.png | Bin .../imgs/aws-s3-create-bucket.png | Bin .../imgs/aws-s3.png | Bin .../imgs/aws-select-s3.png | Bin ...25722e1d058122cf3ef071ca3235e4-844x474.svg | 0 ...65aad2ab5d59cff56d2bec9470bd9-1269x714.png | Bin .../imgs/9OuYJ08.png | Bin .../create-a-data-proxy-connection-string.png | Bin .../imgs/create-project.png | Bin .../data-proxy-connection-string-modal.png | Bin .../imgs/data-proxy-connection-string.png | Bin ...0048a8225eec985d2ea001c5e1486b-844x474.svg | 0 ...b4d0d06e95090aab1d8b0ede0696b-1269x714.png | Bin .../imgs/schema-sync.png | Bin .../imgs/vercel-environment-variables.png | Bin .../imgs/vercel-import-project.png | Bin .../imgs/vercel-new-project.png | Bin .../imgs/awesome-links-prisma-studio.png | Bin .../imgs/awesome-links-starter-project.png | Bin .../imgs/database-url-breakdown.png | Bin ...2ee755fc47d4c085a10f2b453c74a6-844x475.svg | 0 ...143375360a59242258c3c93609907-1269x714.png | Bin .../imgs/build-a-database.png | Bin ...1fa115971071b951ef70832386640b-844x474.svg | 0 .../imgs/kudos-home-complete.png | Bin ...ee69692b9010216f2d207af37321-1920x1080.png | Bin .../imgs/mongodb-connection-button.png | Bin .../imgs/mongodb-connection-modal.png | Bin .../imgs/mongodb-connection-string.png | Bin .../imgs/mongodb-default-settings.png | Bin .../imgs/mongodb-free-tier.png | Bin .../imgs/mongodb-ip-setup.png | Bin .../imgs/mongodb-user-setup.png | Bin .../imgs/new-project.png | Bin .../imgs/remix-starter.png | Bin .../imgs/tailwind-css-checkpoint.png | Bin .../imgs/user-collection.png | Bin .../imgs/auth-flow.png | Bin .../imgs/embedded-doc-helpers.png | Bin .../imgs/error-message.png | Bin .../imgs/form-toggle-incomplete.gif | Bin .../imgs/form-toggle.gif | Bin ...59403f81349c8247116f8f084a0ae2-844x474.svg | 0 .../imgs/initial-login.png | Bin .../imgs/login-form.png | Bin ...9eaddac2a48baa614189c5fa74c2-1920x1080.png | Bin .../imgs/signin-success.gif | Bin .../imgs/dynamic-filename.png | Bin ...de348ea063b18dba5fb66f7dbb7594-844x474.svg | 0 .../imgs/home-initial.png | Bin .../imgs/kudo-feed.png | Bin .../imgs/kudo-preview.gif | Bin ...9320447e9fa9610b276088e86dd8-1920x1080.png | Bin .../imgs/nested-route-names.gif | Bin .../imgs/nested-route.png | Bin .../imgs/portal-diagram.png | Bin .../imgs/portal.gif | Bin .../imgs/recent-kudos.png | Bin .../imgs/search-bar-sort.png | Bin .../imgs/search-bar.png | Bin .../imgs/select-boxes.png | Bin .../imgs/sorting-functional.gif | Bin .../imgs/sub-routes.png | Bin .../imgs/user-list.png | Bin .../imgs/user-panel.png | Bin .../imgs/users-logged.png | Bin .../imgs/working-modal.gif | Bin .../imgs/aws-add-user.png | Bin .../imgs/aws-bucket-access.png | Bin .../imgs/aws-bucket-permissions.png | Bin .../imgs/aws-bucket-policy.png | Bin .../imgs/aws-details.png | Bin .../imgs/aws-overview.png | Bin .../imgs/aws-permissions.png | Bin .../imgs/aws-s3.png | Bin .../imgs/aws-tags.png | Bin .../imgs/aws-user.png | Bin .../imgs/delete-user.gif | Bin .../imgs/empty-profile-form.png | Bin .../imgs/form-error.png | Bin ...f60d0db82366f887ef868ba1ffe6ff-844x474.svg | 0 .../imgs/image-upload.gif | Bin ...768cec73ac357b0dacc1a4985cb6-1920x1080.png | Bin .../imgs/profile-form-fields.png | Bin .../imgs/referrential-delete.gif | Bin .../imgs/security-credentials.png | Bin .../imgs/upload-result-database.png | Bin .../imgs/upload-result-page.png | Bin .../imgs/upload-result-s3.png | Bin .../imgs/user-images.png | Bin .../imgs/usercircle-header.png | Bin .../imgs/congrats.gif | Bin .../imgs/create-repo.png | Bin ...238e170ebeea1caa4d9a67fec1db3d-844x474.svg | 0 .../imgs/ip-modal.png | Bin .../imgs/kudos-error.png | Bin ...6096b266ce2463146d441aef52f4-1920x1080.png | Bin .../imgs/mongodb-network.png | Bin .../imgs/new-repo.png | Bin .../imgs/repo-pushed.png | Bin .../imgs/repo-url.png | Bin .../imgs/success.gif | Bin .../imgs/vercel-deployed-dash.png | Bin .../imgs/vercel-deploying.png | Bin .../imgs/vercel-env.png | Bin .../imgs/vercel-new.png | Bin .../imgs/vercel-repos.png | Bin .../imgs/0*A92lc0WjBQD120DC.png | Bin .../imgs/0*KQLRnImerQRjALS5.png | Bin .../imgs/0*QelKIjXtM12d3kAe.png | Bin .../imgs/0*h_JXfmCfcMYpbO__.png | Bin .../imgs/0*iPceJCV7B-ri4upn.png | Bin .../imgs/0*lWBTpLYdMBLe7BvS.png | Bin .../imgs/0*p_mSrJU2L90IXDSi.jpg | Bin .../imgs/0*t5Y1tsH07bEQHbrB.png | Bin ...5ad7c79ca9de6acc53c27a8e49204f-900x482.png | Bin ...e602480f1fee9860018b83891660ee-900x482.png | Bin .../imgs/1*-iELVZWzvAgEaKZlkNU6ZA.png | Bin .../imgs/1*AN2VR8MNLpLeNzUOEGbCJA.png | Bin .../imgs/1*_QMKg1HIi96OtzMMOtoajQ@2x.png | Bin .../imgs/1*f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg | Bin .../imgs/1*kKq-QXjiDhsDi82ZK8OX8w.png | Bin .../imgs/Dc2NATAXcAE-sxs.webp | Bin .../imgs/Dd5F0cmU8AI0DKJ.webp | Bin ...24348635532e5f06f7be6230c9077-1200x630.png | Bin ...9cc8a354555367848ee135f88561c-1200x630.png | Bin .../imgs/mbm2Syg.png | Bin .../imgs/ygKiXlA.png | Bin ...6e943970fb26c0395027a491baa9a0-720x480.jpg | Bin ...e521b189e585083a6fa90709310007-900x482.png | Bin .../imgs/1*2UStyS7v3NIZKl2cLsBtYA.png | Bin ...2e63310e547d4bc3575d78fad23c84-720x479.png | Bin .../imgs/1*0ZgAAtT0Zm-Kc63SNeT5Ew.png | Bin .../imgs/1*6ERw4Znf6UYou_epNUutRA.png | Bin .../imgs/1*dMyX0jnoKvhYAa0cgSqenQ.png | Bin .../imgs/1*yIYI_iNabiNS_7uuzFVJDQ.png | Bin ...6c3eb9d27aacabfb68d51510ea275e-900x429.png | Bin .../imgs/1*_fQh0zWBlDG1OJ-FbMnWcw.png | Bin ...23c9afd77908b058e6904ada648cc2-900x519.png | Bin ...d9610f835954d2fe2601bda2b0bff3-720x385.png | Bin .../imgs/KZX2GIV.png | Bin .../imgs/eSb3LiB.png | Bin ...1c68af69d2c13eafb3369f343e0856-844x474.svg | 0 ...205088c9beee9cc8b5b4553e3988a-1692x852.png | Bin ...4f161e410fc12ccf0e00e562b5ecb-1692x852.jpg | Bin .../imgs/rapha_architecture_diagram.png | Bin .../imgs/ZTq9xEN.jpeg | Bin ...0540555baed7e42696fe030fb8d435-855x480.png | Bin ...d0768088b7b6c6209b19bfba0d92f-1266x711.png | Bin ...84282cfbf2048c499a4d5ff0c3446b-200x200.jpg | Bin ...c28bfbb3573c7bd396226f11b08089-844x474.svg | 0 ...a0a2b3a10304fc133043fa4d50948-1266x711.png | Bin ...2da328ccb88b64d312672e25c2b263-844x474.svg | 0 ...737edda70601ea1d7094878822700-1200x630.png | Bin .../imgs/1*KQ620d8vVrnl4vCYyqkWOA.png | Bin .../imgs/1*SwVWiWOCRnyCCP80lKoXjw.png | Bin .../imgs/1*bz9k7dsElF5x_eqIfc_XWw.png | Bin .../imgs/1*nmcFbnUg7ooxjlZ8z-GLQA.png | Bin .../imgs/1*o57PeaoF5PVrON-FhR8QTA.png | Bin .../imgs/graphql-playground | 0 ...fd5b55d0301343f2b5698eedc64f9e-900x545.jpg | Bin .../imgs/1315101.png | Bin ...dc681e51014a12b087c6a93b1aa5-3792x2436.png | Bin ...d06f5017b9d07ffb9d2dee6dac1197-844x474.svg | 0 ...e5d106e51a671d0f1d07d8667e306-1266x711.png | Bin ...dcd853665664a9c2039b7c413a587e-844x474.svg | 0 ...e4838d591e4cac9d2889ea7317998-1266x711.png | Bin ...-019df6d2-acdf-4383-a064-4521b67c5bda.jpeg | Bin ...-9739c8a3-7522-457b-aae9-50d48239eb2c.jpeg | Bin .../imgs/2021-06-05-invisible-diagram.png | Bin ...9b2a389f2419759abe8b2089f4b2d4-870x438.png | Bin ...cef3afec8529ac1a1f9d2feb2e9ec-1692x852.png | Bin .../imgs/connection-pool.svg | 0 .../imgs/containers.png | Bin .../imgs/edge-w-db.png | Bin .../imgs/edge.png | Bin ...34872f6ce4c951529f02ea55725adc-844x474.svg | 0 ...8cf22a31f583608f1717f4dfffb34-1266x712.png | Bin .../imgs/on-prem.png | Bin .../imgs/serverless.png | Bin .../imgs/virtual-machine.png | Bin ...d394c5019b14618766b4047c2bd8e-1480x731.png | Bin ...cf8bb986fcf4a17f16d6965f2a27-2220x1365.png | Bin ...d7ebe6f82437ac6e7a6034478698-1480x1696.png | Bin ...5be1c2cca043f80b05b991c7d161-2618x1100.png | Bin ...c4703e5b01448980142d32e4087fe-1998x750.png | Bin ...35ccb0e825102b49c0477ce6a88d3c-844x474.svg | 0 ...c70edad559c02e68c2f0098514e92-1266x711.png | Bin ...273136103e964bfde80be554c43a7-1692x852.png | Bin ...d0701c2860ec6491495ea20858f4-2888x1110.png | Bin ...64f5eb6394e7b8c5193d8450a23e-2618x1237.png | Bin ...19afc3ce8475550c08c8bbc6c8551-1850x678.png | Bin ...e30a33103ea5b451f09928de7ce1-2888x1110.png | Bin ...a0914d4b1f13c09de462e9d077a1-2688x2050.png | Bin ...7a2c835073bf096890b78dd3ee3490-844x474.svg | 0 ...cf4ba2965d4581c6b2e4ccbeba496-1688x948.png | Bin ...785bbb4ff4f8c3e303c7f1ced92ea9-720x385.png | Bin .../imgs/after-json.png | Bin .../imgs/after-same-region.png | Bin .../imgs/db-near-server.png | Bin ...a41b7b452a43664dea361d78f10e82-844x474.svg | 0 ...ffe2930cc868334e99844d136473b-1266x711.png | Bin .../imgs/0*MZcp4O86JEoMbtpi.png | Bin ...0c665d3296db3d2983002133e7a548-900x619.png | Bin .../imgs/1*0mbKo-p6qfrBKgAaJb0gOQ.png | Bin .../imgs/1*UF5m7oNBcs1LKPboj7GQ8A.png | Bin .../imgs/1*m5LM8FgXa0VEMz-KwMyd3Q.png | Bin .../imgs/1*sGvSvA1yKloKDpXNb3jfBw.png | Bin ...919645523931bf645440e96386e06f-720x385.png | Bin .../imgs/0*-h6XwUanLrNSYjJk.png | Bin .../imgs/0*5vAu8GPtx3kpYcX9.png | Bin .../imgs/0*eqlu9eJJgj8vIqck.png | Bin .../imgs/0*mv6z4N7_OSza7_2h.png | Bin ...0c8249ff5843c46423850eac4455d-1080x231.png | Bin .../imgs/TvlsOeC.png | Bin .../imgs/hL3C79O.png | Bin ...854c11615741cb43bbae8569cdd4e-1200x630.png | Bin ...f41f22d8a54c882cd24da906c51479-844x474.svg | 0 .../imgs/index.png | Bin ...9b1df6f8104fced300d5e49233bd0-1269x714.png | Bin .../imgs/query-parallelization.png | Bin .../imgs/table-partitioning.png | Bin ...2-b8ec58e9-3540-4a60-9408-84e51a4f9f19.png | Bin ...8-92dea6ed-6486-46b8-b99e-62a0af29c01a.png | Bin ...5-1a680505-14fc-47ef-8862-126ef0d15708.png | Bin ...0-9fc9fa57-88b1-45d7-9b75-b49b8e4e8d70.png | Bin ...4-4429c674-6c8e-4827-a1b1-49231aa8e3b6.mp4 | Bin ...7-7ff4c4c8-c91c-4ff0-b32c-c4ab5a45db97.png | Bin ...13badff0117580a169a45609788d7e-844x474.svg | 0 .../imgs/index.png | Bin ...e89e7dd52fb5ba19e0850dd24a8fa-1692x952.png | Bin ...5-1a680505-14fc-47ef-8862-126ef0d15708.png | Bin ...4-a7c4adfd-b649-4597-af10-1676b0159272.png | Bin ...4-bdf3aeca-85f8-4b06-801a-63bac39621be.png | Bin ...7-6dab2f11-a528-45f6-99f9-13db3a84cb0d.png | Bin ...5-c4bd1059-595b-40b0-b2d9-b05339dac8cc.png | Bin ...3d3376bf02a64092431ac5397e82ba-844x474.svg | 0 ...6290c3dee9a6d0cb09decc68fae6a-1269x714.png | Bin ...6acfad56fa8a3f77bb148989afd3-1984x1132.png | Bin ...7348c9f7647ad34e773239eb34c12-3094x978.png | Bin ...0321d89f75d825fa405c6422a6e17-1820x846.png | Bin ...5e6b2554f2256149a7ea9e62df3258-844x474.svg | 0 ...4f5f4dadcdf9d7c80a79bffdbd80a-1266x711.png | Bin ...f6aa9c1e4010c7769d1ed078fce438-844x474.svg | 0 ...bc8d99d4e2c312dcd142ad5a550d9-1200x630.png | Bin .../imgs/AbkFWNO.png | Bin .../imgs/KMUm6rd.png | Bin ...1b9a4fc240fa2c5869f6b6fe2abe0-1200x630.png | Bin ...a902a17211a9d7a9493153361dbc43-844x474.svg | 0 ...a013b8ba4f778b7727c0807fc1aca-1266x711.png | Bin ...c1aea98ab63bc49ca1d233e3186b7-1800x907.png | Bin ...1bcbe418c3d592f64756a2e9a2cb-1344x1029.png | Bin ...8eb1a80eca022984869fe9a6d0a3-1920x1080.png | Bin ...496e3e36f00bb6800dccf89f5d651-2155x907.png | Bin ...04b50d3dd60d10d1e3a6cb80d6ac6-2380x907.png | Bin ...6c2fc40919aa77c4c648bcba905d4-1200x305.png | Bin ...742d1f7b3468e632869ef802833652-870x480.svg | 0 ...9ff75d2718b0a9f9906de8b417457-1800x945.png | Bin ...dac15e42224b3e7a1fbccfadd8d2-3456x2160.png | Bin ...73328bca87b9d927878808be769f-3456x2160.png | Bin ...4146a3ca79463c0cf8a6764c9b18-3456x2160.png | Bin ...3bf0f1894047b3e87fad73d8c4c80c-870x480.png | Bin ...aa55c59c4977b9b552b45e68c19e5-1200x631.png | Bin ...02b6a9c6be975ada9fd1d26f31173-1692x852.png | Bin .../imgs/iopool-diagram-after.png | Bin .../imgs/iopool-diagram-before.png | Bin .../imgs/mWvroX_lkZI | 0 .../imgs/2KmUO33.png | Bin .../imgs/7cfLBlC.gif | Bin .../imgs/OHfXWDh.png | Bin .../imgs/QnI7OrB.png | Bin ...b088978a9224cbe939e35fa9e58056-870x438.png | Bin ...c739fc1f24dc165998b1bdd3ae30a-1692x852.png | Bin ...03d113bad6cb6e96549dd817b8869-1200x630.png | Bin ...c104c189e556f5a0a65cc59adde9b3-870x438.png | Bin ...030645338459b4feaf9733da97717-1692x852.png | Bin ...typescript-pocketguide-prisma-studio-1.png | Bin ...typescript-pocketguide-prisma-studio-2.png | Bin ...9959a693d009e00c975f3f864b1934-800x450.gif | Bin ...92ca81971deffce3194c10a9d7c7-1412x1082.png | Bin ...22162d4c2dd1d7b9b2c769727f2b-3206x1120.png | Bin ...f6cca7f95b9c9bf888968bf25f60-2888x2188.png | Bin ...96dd4e869fb4f5f8d7dc1600d94d-1294x1676.png | Bin ...58e713414612998ad51026aeea0cb-1042x948.png | Bin ...ed5d4927ad0e3215e309eaa4f944ae-844x474.svg | 0 ...c90c583f9e85df56105a3b6cb52e0-1266x711.png | Bin .../meetups/meetup-connect-dev-africa.png | Bin .../{blog => }/meetups/meetup-graphql.png | Bin .../{blog => }/meetups/meetup-prisma.png | Bin .../public/{blog => }/meetups/meetup-rust.png | Bin .../{blog => }/meetups/meetup-typescript.png | Bin .../imgs/dashboard-grafana.gif | Bin .../imgs/grafana-datasource-setup.gif | Bin .../imgs/grafana-landing.png | Bin ...b0aa20963e60b3940d638c938adbf7-835x470.png | Bin .../imgs/import-dashboard-grafana.gif | Bin ...a6301edbf164092172e4a4ea43981-1269x714.png | Bin .../imgs/metrics-architecture.png | Bin .../imgs/metrics-prometheus-format.png | Bin .../imgs/prom-ui-execute-query-table.png | Bin .../imgs/prom-ui-graph.png | Bin .../imgs/prometheus-ui.png | Bin .../imgs/autocomplete.gif | Bin .../imgs/autocomplete.png | Bin .../imgs/compiler-error.png | Bin ...afb5e6e91b3a8048677f4d4021f3ac-844x474.svg | 0 .../imgs/issue.png | Bin .../imgs/launchweek.png | Bin ...5c54c6cee0c4cce0f47682d09cdc3-1692x882.png | Bin .../imgs/devops-infinity.svg | 0 ...1f61ae2412fbeb17417bff9504b9ff-794x380.png | Bin ...e6abb72bd7d0a6ae53725792e0a47-1692x852.png | Bin .../imgs/401-GET-users.png | Bin .../imgs/auth-login-endpoint.png | Bin .../imgs/auth-workflow-swagger.gif | Bin ...5bc6f5047c3e3ba1972005f90ea2bb-843x474.svg | 0 .../imgs/locked-endpoints.png | Bin ...7fa36e7051613296031be0344159-1920x1080.png | Bin .../imgs/article-not-exist-404.png | Bin ...9ead629ccc386f69880911bbb014c8-844x474.svg | 0 ...7c0dc9c0a72557fe3a277a11700a4-1272x716.png | Bin ...75e64a7ae28b6915e68d77e197f2-1920x1080.png | Bin .../imgs/password-omitted-get-articles.png | Bin .../imgs/password-omitted.png | Bin .../imgs/password-revealed-get-articles.png | Bin .../imgs/password-revealed.png | Bin .../imgs/users-crud-1.png | Bin .../imgs/users-crud-2.png | Bin .../imgs/articles-crud-1.png | Bin .../imgs/articles-endpoints-grouped.png | Bin .../imgs/create-article-dto.png | Bin .../imgs/final-app.png | Bin ...e028072f5e7d90b2eff2435ad6dabb-844x474.svg | 0 .../imgs/response-types.png | Bin .../imgs/swagger-findall.png | Bin .../imgs/swagger-findone.png | Bin .../imgs/swagger-ui.png | Bin ...b3f3e751cd795ba7e184ce98a3ed81-844x474.svg | 0 .../imgs/id-string.png | Bin .../imgs/inject-dates.png | Bin .../imgs/invalid-args-specific.png | Bin .../imgs/invalid-args.png | Bin ...a4eacbd9270a105ff912a0e91eec5-1272x716.png | Bin .../imgs/valid-args.png | Bin .../imgs/validation-error.png | Bin .../imgs/0*c56E4V22_pl88Si4.gif | Bin .../imgs/0*zy8sNGj9yqANZhrw.png | Bin ...647f6e566843a176ed58109da8e65c-900x509.png | Bin ...7986be043f844425adc9214c468725-844x474.svg | 0 ...3caa95164b69d5b9418abd3b99059-1266x711.png | Bin ...3267eb607869ff0be34162b175b23-1816x586.gif | Bin ...2a8994edaf4b75c47030b50f3ee4e-1497x644.png | Bin ...17ef163ffb6927acc80362c00e1055-754x706.gif | Bin ...cf3eddde3815636ed7a1ed012c7d5-1497x490.png | Bin ...b547bcc995ef12e208107bffafc97f-844x474.svg | 0 ...095451e0779fe28db8d2bcf7b0da9-1266x711.png | Bin ...1ffc6b0284fc578538ab7fbc541e-1269x1660.png | Bin ...da5bd87e58fd82ef867d28fd8a82-1269x1660.png | Bin ...cfff090449148d3185d331d5a113-1269x1660.png | Bin ...da7dccae76ab2597e841ac444cbe7a-844x474.svg | 0 ...dc44a8e90072330ce14346817df5b-1266x711.png | Bin ...01963d4c7a3fdd3bb921b8c4619f-2908x2064.png | Bin ...b37555a5d3caf40521722d9613b705-844x474.svg | 0 ...082d921722ad482ef83992eb66f5f-1266x711.png | Bin ...ee033198e4754d302c19eea1f42062-708x480.gif | Bin ...e9d079196ecbeca717908e0faba73-1212x720.gif | Bin ...b944aa41f4f8ac93463f16b710cb6-2048x854.png | Bin ...1f1eebbc63ef25c20e7d89a6ff20e8-712x480.gif | Bin ...8dbe61ef0dc42bad3d44c0a002efcf-844x474.svg | 0 ...16315426528e9b4bc429a2708acbb-1266x711.png | Bin ...c685e428b6b08df4a8c3fbadcae8-2560x1664.png | Bin ...b95fb426e8f670cd3ee12ec2b6ef0e-844x474.svg | 0 ...db7a6e8f8fa30b3a2493752251653-1266x711.png | Bin ...b86d8ac9db19dc2ad2ac4edf2c4c-3070x1866.png | Bin ...6e36773fe0c4b003a81298d7f175f4-800x450.gif | Bin ...1bcf64b7c3f55bd81d799443f426-2040x1618.png | Bin ...00a0ec6345ee27d0f6eba08a3a79a5-844x474.svg | 0 ...0c31abeee44c4c8da5452619d93c4-1266x711.png | Bin ...a2019424eba3ab11054927abc353-1668x1080.gif | Bin ...b70479608f1693544eb1159acf22-1404x1080.gif | Bin ...f2033d74021e5007c20467a7d1069c-844x474.svg | 0 ...28436ce4a9b015a641f91c80610a3-1266x711.png | Bin ...9c18e343816c7906ac2ce1dab223-1088x1080.gif | Bin ...d6f86ff9a353d5bb64ad79510920f-2836x981.png | Bin ...b282c40babce1bbdd9090f848862d9-844x474.svg | 0 ...2981d836ac001e9ad7d7bf3983817-1266x711.png | Bin ...3055fe604b9767ae70064dd6b041-2470x1030.png | Bin ...9b64fbedee79607fc34819eced5a-2560x1664.png | Bin ...c2f3b242e88d1e7e9c068a4b4b50dc-844x474.svg | 0 ...e1e36633f24ff1630949e82d6552e-1266x711.png | Bin .../imgs/connection_pooling.png | Bin .../imgs/distributed_db.png | Bin ...26ec5a3d262e4e598ea35dd95aa7b0-844x474.svg | 0 ...a83db1dd2d474906b3c9b36a0be05-1267x711.png | Bin .../imgs/with_cdn.png | Bin .../imgs/without_cdn.png | Bin ...a968fa3166f7d9faff39ee6df0fc04-846x426.svg | 0 ...8e0fc1c0ce19cd2f7d370baf9ba67-1692x852.png | Bin ...fdb1bc38c55016a41fd23b3ea650a0-870x439.svg | 0 ...e418b222844b771f5b3ffcff456f4-1692x852.png | Bin .../imgs/pearly_diagram.png | Bin ...4732a1336441c6ac188b7c96b083-1860x1328.png | Bin ...bcff18fa1f28aa299cbe103cd751-2531x1279.png | Bin ...5376e0536cbbfc973907a645a969d-1610x330.png | Bin ...785fdf6a3806c3d70065d99291e85-1438x176.png | Bin ...b27033af1542b275a88d943e44f6-2614x1884.png | Bin ...90b4183d9b4d7d70e6e4bd30f2933d-844x474.png | Bin ...67f1567e51f2a62e6c4129b120822-1688x948.png | Bin .../imgs/fLCuthZ.png | Bin ...9d0709b8e4af281e447028c0ec23e-1200x630.png | Bin ...e203a79d806c2f7ab3ff3d177b7ee-1692x852.png | Bin .../imgs/poppy-diagram.png | Bin .../imgs/vJyrhA4.png | Bin .../connect-replica.png | Bin 0 -> 529542 bytes .../create-replica.png | Bin 0 -> 367438 bytes .../posts/read-replicas-extension/neon.png | Bin 0 -> 6353 bytes .../posts/read-replicas-extension/reads.png | Bin 0 -> 25916 bytes .../posts/read-replicas-extension/writes.png | Bin 0 -> 90647 bytes .../imgs/83djlkl.png | Bin ...68b6f46097c6f654a0e77dfbf643ca-870x457.png | Bin ...b460b14a81e0364434fc5c0caa204-1688x886.png | Bin .../imgs/after-schema-builder.png | Bin .../prisma-5-f66prwkjx72s/imgs/before.png | Bin ...4c13e75aae400cb385bbd1da5f23e2-844x474.svg | 0 .../imgs/json-protocol.png | Bin ...cdc8b7bb1b5cde2903a0d0e78fe4a-1266x712.png | Bin .../imgs/prisma-5-upgrade.png | Bin .../imgs/prisma-5-zoom-in.png | Bin ...76993c99bb97a938d501887f8cc957-800x450.gif | Bin ...dadac60fbfc8dfd95fddd83fd28411-800x785.gif | Bin ...76b2606757271bab4e04cffe8bb03d-844x474.svg | 0 ...73f6d3379697f1082600814e40c89-1266x711.png | Bin ...48e6d1e838f04d9c3908c14f8373-2470x1030.png | Bin ...43ebe2bc1134b8a6fe4ce1bc20b6-3304x1216.png | Bin ...2d96c98eafef1b6bf0f2d0cac943-3740x1964.png | Bin ...3d1100e7f62c052743300a08093d24-844x474.svg | 0 ...4d5ad92e1611a0ad373aa368018b0-1266x711.png | Bin ...4dd978cd3e2270618719a6da7207-1920x1080.png | Bin ...b6239ae9f0e74962909b219dfafbc8-844x474.svg | 0 ...bd55cb08133c81dc5cf297137b893-1200x630.png | Bin ...44c1c91bb28ae9e0cd07240414bb-1920x1080.png | Bin ...9b30a1245becadea327ddf82784916-844x474.svg | 0 ...53ce030818a157ac592f29650e651-1266x711.png | Bin ...3d53d0decd3aa5c631c0214c2d578-1692x852.png | Bin .../imgs/Cyyt5un.png | Bin .../imgs/Felin65.png | Bin .../imgs/I9D33PU.png | Bin .../imgs/NS0YFih.png | Bin ...c2b415bc159d86a7a0eacf7b92acef-870x457.png | Bin ...37829166cc290e4913124ad4a99a0-1200x630.png | Bin .../imgs/wDONhZ6.png | Bin .../imgs/ykahwzh.png | Bin .../imgs/after-json.png | Bin .../imgs/after-same-region.png | Bin .../imgs/after-schema-builder.png | Bin .../imgs/before.png | Bin .../imgs/db-near-server.png | Bin ...074189eda737c807804fda0b018a05-844x474.svg | 0 ...54b102c538279eae67bb1bb601991-1266x711.png | Bin .../imgs/proof.png | Bin .../imgs/serhii.png | Bin .../imgs/tls-comparison.png | Bin .../imgs/OyIQQxF.png | Bin ...11647bda65187ba3679acd63a63da-1200x630.png | Bin .../imgs/add-filter-prisma-data.png | Bin .../imgs/data-proxy-performance.png | Bin .../imgs/explore-prisma-data-model.png | Bin ...231a1a3c1958c52182a480a8e5f8f7-844x474.svg | 0 ...711f25503a0a7af6f077b4ad57d2d-1266x711.png | Bin .../imgs/online-query-console.png | Bin .../imgs/prisma-github-synch.png | Bin .../imgs/6GJ9C84.png | Bin .../imgs/9OuYJ08.png | Bin ...7c84e302d829b963462d00950d326e-870x455.png | Bin ...e60bd38e28c64d061ce7fb171f81-2400x1254.png | Bin ...77e3b700cef6601a86c94a9e1de572-844x474.svg | 0 .../imgs/joinusforprismaday.png | Bin ...592b7833e91a41e62b29fbfc9adf-2538x1272.png | Bin .../imgs/sommergarten.jpg | Bin ...fcf829b794355791d859059f7beb0b-844x474.svg | 0 ...1d5632f2170265bd9c63167d3f978-1268x721.png | Bin ...495eb13c451c52414fd1119f0be213-844x474.svg | 0 ...59a4bdeb64d945c8abd1d2aa965e0-1266x711.png | Bin ...a02963a6943bf9903eadb7f467452b-846x426.png | Bin ...6d6ab31ad6dea86c04ba77a03f0ed-1252x630.png | Bin .../imgs/diff-execute-db.png | Bin .../imgs/diff-history-db.png | Bin ...510a2942651367168029c0be4b650c-844x474.svg | 0 ...4a03d10765a87a3fbc6d0e036564c-1270x639.png | Bin .../2020-12-migrate-development-workflow.png | Bin .../2020-12-migrate-production-workflow.png | Bin .../imgs/2021-03-migrate-source-of-truth.png | Bin ...c25944dcbcfbe7064746f94cef116-1692x852.png | Bin ...2e625fda9fe791c5ad5952bda69d-2400x1256.png | Bin .../2020-12-migrate-development-workflow.png | Bin .../2020-12-migrate-production-workflow.png | Bin ...8cca04b7efca43a15f111cb1789b7-1692x852.png | Bin ...0e1fe925d32bdf2a73f80d4c4bc9f-1200x628.png | Bin ...e4de5651fe3afa7a2a181b0cacdb24-865x436.svg | 0 ...1951a4fc6425644d652161e5aa9a1-1269x640.png | Bin .../imgs/HlKu4FD.png | Bin .../imgs/Pb0Y4bu.png | Bin .../imgs/REM9mBY.png | Bin ...7f3015ae0203b3b01a4830f6ca327-1692x852.png | Bin .../imgs/yZen8Js.png | Bin ...5186d98e489b0aa2d0b884ceff3ef0-844x474.svg | 0 ...36c7d8e6671d0b4e910c1a0c2cb62-1200x630.png | Bin ...a1449adfeb3b608ae710d2bd2d6449-844x474.svg | 0 ...34fff70c4eadb8b2cbef237acd3ba-1266x711.png | Bin ...535b97c35ecbc14b17c382ccb1644c-844x474.svg | 0 ...65f432dc3f83253879dc12818ab99-1266x711.png | Bin ...5fddbf52e1e3e95cfabaaa9bafd778-874x798.png | Bin ...20bbf771e47bb7b542b3c21c31e19c-800x653.svg | 0 ...06526cd3e6178ef56e71682d5855-1600x1140.svg | 0 ...6dc77e75c9f2df3db0f2aae902cd-3200x1256.png | Bin ...c2414f9ca2be1cedcb0229fa58188-1154x652.png | Bin ...9bac1bc0543020819db31da69ba26a-946x324.png | Bin ...3577880d8f6d308c7446c9d5f27c-3200x2280.png | Bin ...489f6d97c0151adda8f98fd910bb-3200x2390.png | Bin ...df127ac984a9913e7742e59a169fc1-844x474.svg | 0 ...84741b32994979eb8ff448d60d4fe-1266x711.png | Bin ...06f5a2a15e67a4757260d14b1273-2532x1210.png | Bin ...28a2f29ced7d34f75ac7bbd08f94-2532x1210.png | Bin ...f4026cd5c6b36b34a7693d0f2ce1-2532x1210.png | Bin ...4dd978cd3e2270618719a6da7207-1920x1080.png | Bin ...95314aeceda56c7bd867e5859e468f-844x474.svg | 0 ...c5ea1d23ce3f243d06a14f138693-2000x1123.png | Bin ...95ed6f219e870b19056a529c5e03c7-844x474.svg | 0 ...055d3aba22acf59aaa6c37933050a-1266x711.png | Bin ...749c0b17c850334f376711d8a44d22-844x474.svg | 0 ...ca85afbc7a1cf78f660374577d3f3-1266x711.png | Bin ...f1217e813a4a9a08c62d7917484283-844x474.svg | 0 ...7e2368e87d826024499f7211d4ded-1200x630.png | Bin ...402c5dcff3bd650bd91e287083ce-2144x1566.png | Bin ...59a8e70182600426eac14ab80aee-2556x2180.png | Bin ...87f4b995d9fad1134e4f51e697175d-844x474.svg | 0 ...7870b3696b4175ace7b5f387987e0-1266x711.png | Bin ...f478194356709a65fee196225381-2314x1220.png | Bin ...19afc3ce8475550c08c8bbc6c8551-1850x678.png | Bin ...482b7372b74a8ace42afe009d86d2-1610x886.png | Bin ...1841af6c46fee0683b93179052358-1114x592.png | Bin ...0ac2704f65689abf686ff4adfd6e67-844x474.svg | 0 ...9b801af6538901c44b870e7d83404-1266x711.png | Bin ...dab44f271d4f0dd1ad658507f55b66-844x474.svg | 0 ...789939fb2b2af2bf3f82378cebc0-1920x1080.png | Bin .../imgs/1*MmTqUD1_jQtNRxsMhyQyDg@2x.png | Bin .../imgs/3VzVxCe.png | Bin ...2cceb9f6cc435356d4a7ab822ed5b-1200x630.png | Bin .../imgs/4YPWyaW.png | Bin .../imgs/Fc7BweP.png | Bin .../imgs/Hb9VOWN.png | Bin .../imgs/PQSljF7.png | Bin .../imgs/WwMdROo.png | Bin .../imgs/kuwS06d.png | Bin ...092e77a0b0a840c32a3c9a44f3754-1252x630.png | Bin ...39f52510e6f5175cb3437ef8385f-1170x1176.png | Bin ...e432b7090fdebf7c4c096b4e4802b-1034x592.png | Bin ...22815cdf5c0bb4d17f05ad6b649f70-844x474.svg | 0 ...7b8676c043fdaf86754f6c724f31e-1266x711.png | Bin ...95712a04317e2c17e35cef35fac770-846x426.png | Bin ...c9b81a2482973c2046e817f6a0b101-844x474.svg | 0 ...bca37aca44f2cb8e46109fb7f00ce-1266x711.png | Bin ...0248dde0b35f13b0f30afdf859edeb-870x439.svg | 0 ...005d0cdfebd5dd8e353b56091beb9-1692x852.png | Bin .../imgs/studio-filters.png | Bin .../imgs/studio-models.png | Bin .../imgs/studio-pagination.png | Bin .../imgs/studio-relations.png | Bin .../imgs/studio-shortcuts.png | Bin .../imgs/studio-tabs.png | Bin .../imgs/2020-11-studio.png | Bin .../imgs/CTGhQZ9.png | Bin .../imgs/Hb9VOWN.png | Bin .../imgs/O1lwo0v.png | Bin ...2457585505b61a7d6a73c0d6a9c37e-870x438.png | Bin ...a4b74c9be5ee10cee19de1033a62e-1692x852.png | Bin .../imgs/mggzrl7.png | Bin .../imgs/nF2JOQt.png | Bin .../imgs/rEVZs9a.png | Bin .../imgs/embedded-replica-create-copy.png | Bin .../imgs/embedded-replica-read.png | Bin .../imgs/embedded-replica-remote-read.png | Bin .../imgs/embedded-replica-timing.png | Bin .../embedded-replica-write-propagation.png | Bin ...955da7f55308c6531d0e28e6ed262d-844x475.svg | 0 ...f8abb7b2e576e7da9e728058bf1bd-1200x675.png | Bin .../imgs/mind-blown.gif | Bin .../imgs/remote-sqlite-timing.png | Bin ...bcb939c62e28aa934c650dfb597df6-844x474.svg | 0 ...3cf0cffd480480c7d6f19950f8eca-1266x711.png | Bin ...1e37826824d5a4feb83f16ea5b35b7-720x385.png | Bin .../imgs/145.png | Bin ...63be54e12c792608ca39e7793a9216-900x482.png | Bin ...88494b1c1877524e073b4f7c27f4b7-844x474.svg | 0 ...62133572d5da0ff85cfc0f6980c42-1266x712.png | Bin ...75661ac170da6197c024be53b5ca-2386x1982.png | Bin ...b51200aac9693f9c331101d6b397d1-844x474.svg | 0 ...fc9c54ed069779bcc76e5eb0af5d4-1266x711.png | Bin ...5cc9f326082e0f7d55a1ea61f6b80-1480x695.png | Bin ...89520601e5a727a48e01b07475569-1280x889.png | Bin ...cf37bd9138323288a3d8b5be57ca63-844x474.svg | 0 ...ae703ce0eccf28d5df589a2c5bc05-1266x711.png | Bin ...2230164bcd686cf3416266fd0ece1f-843x474.svg | 0 ...d8c800d3bdeb71a4734c95d56d6c4-1270x715.png | Bin ...8cc99d8cacd362bc36ecea48ce4c5-1850x678.png | Bin ...95c87535631c0e8da79c5b2d05e5-2888x2464.png | Bin ...c8735bfef186518bb6d5a9eddd6a-2888x2188.png | Bin ...133b0643df2fd58b5f9678f52b43-2888x1016.png | Bin ...c39d1d0beb63e7360f628483a4bb-2888x2366.png | Bin ...41d0dc41e8659a31d432fa7b7772-1742x1096.png | Bin ...764d69963a9b4ef3891d95fe6bbaa2-844x474.svg | 0 ...f6ca9bb7babc20be49a42b22c3dd0-1200x630.png | Bin ...f06a4a3335ea856e1a89422e3e007-3286x985.png | Bin ...d44acc8f0aa9d5a7548cb62bf1932-3286x985.png | Bin ...7c89a8c1ef8564e21b5efca86a55a3-844x474.svg | 0 ...851db648d76377cab73647fcd1fdb-1266x711.png | Bin .../imgs/dal.png | Bin ...8c544f00d8eff50fa587e2e10932cb-844x474.svg | 0 ...9c776e2ca156ac0a8a297c9340574-1267x711.png | Bin .../imgs/pdp-diagram.png | Bin .../imgs/pdp-illustration.png | Bin .../imgs/timesquare.jpeg | Bin .../imgs/wad.png | Bin .../imgs/connection-pooling.png | Bin ...349573b2f17ef889d25a23a427b0e2-844x474.svg | 0 ...d6fde0769ab278a33890eecc24240-1266x711.png | Bin .../imgs/neon-logo.png | Bin .../imgs/planetscale-logo.png | Bin .../imgs/with-driver-adapter.png | Bin .../imgs/without-driver-adapter.png | Bin .../imgs/FmaRakd.png | Bin .../imgs/cHaIWlh.png | Bin ...d3a43686ee7fc9e492dc1d54d197c-1200x630.png | Bin .../imgs/vVHmtEQ.png | Bin ...1f513204bbc42d5af3a46984834ba-1080x266.png | Bin ...8ae7a983960b62edde68bdd82569-1965x1327.gif | Bin ...60d3dd63221a55e6322efd9f81e833-844x474.svg | 0 ...5942c10ba0e35763322f77a8173cd-1266x711.png | Bin ...fac30be65afcc3da2556f9cb07cbdd-844x478.svg | 0 ...fb2927aec03119e98cf6e5c04271b-1266x712.png | Bin .../imgs/sveltekit-fullstack-app.png | Bin ...f42d2c52751fac51563dbc8f01b52c-844x474.svg | 0 ...f90f758778c5a9f5e6db96af0efd2-1266x712.png | Bin .../imgs/mock-functions.png | Bin .../imgs/spy-functions.png | Bin .../imgs/testing_meme.png | Bin .../imgs/undefined.png | Bin .../imgs/file-nesting-config.png | Bin .../imgs/file-nesting-option.png | Bin ...8bdd2e62b432a8fad0f7e6f4859ede-844x474.svg | 0 ...ebeccdc7962534c6e45d87869900d-1266x712.png | Bin .../imgs/nested-files.png | Bin .../imgs/success.png | Bin .../imgs/test-graphic.svg | 0 .../imgs/all-tests-success.png | Bin .../imgs/docker-compose-running.png | Bin .../imgs/example.png | Bin ...1c33bbb498244fe0303813fad6a657-844x474.svg | 0 .../imgs/signup-suite-success.png | Bin .../imgs/test-success.png | Bin .../imgs/tests-run.png | Bin .../imgs/empty-suite.png | Bin .../imgs/five-success.png | Bin .../imgs/four-success.png | Bin ...c41a4e2b56b77d5a68ccc8e67742db-844x474.svg | 0 .../imgs/intellisense.png | Bin .../imgs/invalid-login.png | Bin .../imgs/login.png | Bin ...22c22e27db8dae8010454522fba88-1266x712.png | Bin .../imgs/playwright-options.png | Bin .../imgs/single-success.png | Bin .../imgs/three-success.png | Bin .../imgs/two-success.png | Bin .../imgs/all-success.png | Bin .../imgs/create-pr.png | Bin ...9524174c2aefb95145a831d4c0fd34-844x474.svg | 0 ...e335c8252420b638b7dfa43b135f2-1267x712.png | Bin .../imgs/new-pr.png | Bin .../imgs/new-repo-button.png | Bin .../imgs/new-repo-form.png | Bin .../imgs/new-repo-url.png | Bin .../imgs/successful-test.png | Bin .../imgs/unit-int-success.png | Bin .../imgs/unit-tests-running.png | Bin ...f4ccd9dd7985866c84af54806940a-1200x630.png | Bin .../imgs/OLITh8y.png | Bin ...9a7c0ebdd6e970c354bb8d7630a23c-870x457.png | Bin .../imgs/jFszNXY.png | Bin ...e50e26d645130d640c20a4deb48ee-1200x630.png | Bin ...c6b5062f48c80167a50b66eac00d-2144x1912.png | Bin ...0f556defb4a52c3a593df68336b1-1047x1200.png | Bin ...4bc1f989064c54bc0d8870f8f2e75-1480x264.png | Bin ...7c7f0f44fc853065ae7f18ca68b85-1480x264.png | Bin ...710c8856495120cba3e3d6dbc612-3200x2280.png | Bin ...b2dcfc9308f698bada759477f88f-3200x2390.png | Bin ...16c0b9d6c0831613ee362b013881-1570x1215.gif | Bin ...880ad6ea35cf1b4a29fa1cefb5df5-1360x851.png | Bin ...8f1130f12dd51ee84be1895a19a847-844x474.svg | 0 ...f1438c4416c8452417872dafe3b1c-1266x711.png | Bin .../imgs/1*OPs5D2XrAcFI1hDay-_nEQ.png | Bin ...ba67cda9493f1e1c959da2090a2ee-1350x900.png | Bin ...5e161b9445bd00b298b6264d85362a-844x474.svg | 0 ...d8c1704a9b1a43f9f355478c23714-1692x952.png | Bin .../imgs/prisma-dashboard-grafana.png | Bin .../imgs/trace-spans-waterfall.png | Bin .../imgs/tracing-otel-collectors.png | Bin .../imgs/child-span-manual.png | Bin .../imgs/express-automatic-jaeger.png | Bin ...67302a6c1d9764d103fbe9d691fe99-844x474.svg | 0 .../imgs/jaeger-query-empty.png | Bin .../imgs/jaeger-trace-details.gif | Bin ...8302e58ef25004916ad409e53ac8-2538x1428.png | Bin .../imgs/prisma-automatic-jaeger.png | Bin .../imgs/trace-diagram-example.png | Bin ...5ad5777d73b46616c520cc2afab44-2220x746.png | Bin ...2651a759db9aab07ea8a062c671a46-844x474.svg | 0 ...a92c1135e8397f9af50c91aec798c-1266x711.png | Bin .../imgs/Tryg_Prisma_Image_1.png | Bin .../imgs/Tryg_Prisma_Image_2.png | Bin ...102a57b7c9d1b71e7120cf47a8f068-846x426.png | Bin ...e751fc30531dc46b2e3edb1700df1-1692x852.png | Bin .../imgs/1*1vMUL8w54yIAxOPVSR0UjQ.png | Bin .../imgs/1*9fDpnhWdRrgN-vxB3HmLeQ.png | Bin .../imgs/1*GoxKn35GhQpmHZ6bnKbDZA.png | Bin .../imgs/1*TisP6j41cu4itqI__dDE-w.png | Bin .../imgs/1*c6bexq2J0bTeT5UioGjl_A.png | Bin .../imgs/giphy.gif | Bin ...89008892c3564dc6bc915c33581f-2000x1050.png | Bin .../imgs/1*3fi7Zud_T3VeocM7CN_FIQ.png | Bin .../imgs/1*_EjTITNbwXGCVc7f5MA7tQ.png | Bin .../imgs/1*dgGQ6f1SZcJH7nddNM0Kug.png | Bin .../imgs/1*iNK392MZ7rLIemoigPtvGA.png | Bin .../imgs/1*idRITgkP04XGflQExvz61A.png | Bin .../imgs/1*ifNy0EWA5EdrqkU0X9LT3Q.png | Bin .../imgs/1*rzI7PLKuJuRjjBIxoSiboQ.png | Bin .../imgs/1*wBWEMQXeDUu6JZBN44ZGUg-1.png | Bin .../imgs/1*wBWEMQXeDUu6JZBN44ZGUg.png | Bin ...ac6bbb52267050f3cbc5bc83839911-870x457.svg | 0 ...2d8715d9835a48db4976a57f2b859-1200x630.png | Bin .../imgs/widgets.js | 0 .../imgs/0*A9dtztGpco-x9gTF.png | Bin ...98f33faecaec5abe5adc37027f5811-400x711.png | Bin .../imgs/climatestrike1.jpg | Bin .../imgs/climatestrike1.webp | Bin ...5adff9a31064f60ab98d64c16d07ad-844x423.svg | 0 ...b95dac6e0f9d1eda6ce54cfa3ff6d-1688x845.png | Bin ...4-400cd980-d8bb-11eb-9084-cd44a1cd53f0.png | Bin ...9-04fc37e4-d8ba-4ba6-af76-479bfd2e0379.mov | Bin .../imgs/I5g4bnQ | 0 ...8a149cca2bec7d980182d69a7d540c-870x438.png | Bin ...ea2fc83cd43cbab1505eb11f517be-1692x852.png | Bin .../imgs/64ipcsj.png | Bin .../imgs/MOArOPF.mp4 | Bin .../imgs/RLsS1lm.png | Bin .../imgs/Zwby9Hs.png | Bin .../imgs/dbEMHd5.png | Bin ...84629937a237d833679a49653a117-1200x630.png | Bin ...1f1db39c0fa35305107c611a6c9a4-1444x434.png | Bin ...d490c7c307f17867861478d442505f-844x474.svg | 0 ...9f1fcdac2f9a90eea7d34d0f1c73a-1266x711.png | Bin ...01e58100abf9b60827f9cae6400b-1438x1136.png | Bin ...e3eed197fc24c2cd03e22ee90cd7-1437x1075.png | Bin ...cc06e49e7aedd5f7961f10317818-3594x1160.png | Bin ...8afea06f840a2c8b8b974a6681cbc5-844x474.svg | 0 .../imgs/before-after.webp | Bin .../imgs/binary-diagram.webp | Bin .../imgs/format.gif | Bin ...0cd5b1759ad90ed111c2889eb1d5a8-870x454.png | Bin .../imgs/jump-to-definition.gif | Bin .../imgs/linting-autocompletion.gif | Bin ...ed31d3b18fd98f4bfde023db89522-1801x941.png | Bin .../imgs/quick-fixes.gif | Bin .../imgs/syntax-highlighting.webp | Bin .../imgs/6o81g4o.jpg | Bin ...6403801afbd482ec812d046bfcf8a5-870x457.png | Bin ...b6bf26d0612835a9125136d5d1b90-1200x630.png | Bin .../imgs/prisma-team.jpg | Bin .../imgs/videoseries | 0 ...57290d4b4fc947fafe2668b7f62b-1616x1080.gif | Bin ...4270b11612fb74450d51e8be01fe-1644x1080.gif | Bin ...1c8d70371df522a7e63acbb2ae25-2290x1428.png | Bin ...096dbca0fa8c86177464074a5793-4110x1264.png | Bin ...906258be8fdcbcfc6757d4e80a7e-4106x1564.png | Bin ...4a7ba746e766d6b94389f3da3424-2458x1080.png | Bin ...6fa90ab318e6eaac176951f309e904-844x474.svg | 0 ...5c619c2490a14a32f8aa97b8cc43b-1266x711.png | Bin .../imgs/XAUJcsA.png | Bin ...722fa2c50737272fd764619c66972-1692x852.png | Bin .../imgs/tIGqo0V.png | Bin .../imgs/18401805.png | Bin .../imgs/21019.png | Bin .../imgs/71383.png | Bin ...ebe131d6a20b897c7bcb5616a60495-844x474.svg | 0 ...21b517118716dd18909da219644be-1692x852.png | Bin ...f666cc403923788d01a5eb0c959970-870x804.gif | Bin ...9cfc09bc7975b8330c675af16c5fc-1046x924.gif | Bin ...d99b44abc2b9d3a7442fd72cda4c3-1024x591.gif | Bin ...ee6e42a9e4a490c6a8da7b250c4fd-1920x788.gif | Bin ...f5c90ec0fcaefa8b6edcb76568bd2f-844x474.svg | 0 ...df35ac3957bac087e408f3b68ebf3-1200x630.png | Bin ...2f4e616e865df20bc2b56f15b7a992-400x400.jpg | Bin ...949295b175404698d43c7ce6539dcc-844x474.svg | 0 ...08dac96f99cf51d330a6c724b8415-1266x711.png | Bin ...3721ca4217827e0f291f31d7345fa4-844x474.svg | 0 ...401d4e4299f6573888377675d62c9-1266x711.png | Bin ...e360c736c90ddb97f4e218d9c29d7b-844x474.svg | 0 ...10ed0229b3c3bf715dcd1d96e56c6-1266x711.png | Bin ...0b00da2e109d1b583bd2a2fee55a09-844x474.svg | 0 ...9d25f732dfedf5f3cd739d8ed696b-1266x711.png | Bin ...46b21676bd4faa9978dc1a2cd9a2c5-870x438.png | Bin ...74927cdd406404700fda3e9efb665-1692x852.png | Bin .../imgs/FYqbgQKWIAAjGvu.jpg | Bin ...fc7d38784f178886df9098cfd402e9-870x438.png | Bin ...1a1e5ef5ef3b5171f8b36dec08ae9-1692x852.png | Bin ...28b9ef3150de53f989a640c833311-1692x852.png | Bin ...0-5945999c-4e0b-420c-9de5-4c6bf9984f0c.png | Bin ...0-ad866a4d-8624-4f05-839f-81daaaf3ce2d.png | Bin ...0-cd1f30cf-d0b4-4147-9467-70ca4da12321.png | Bin ...1-fb1049d3-ca33-4055-8e8e-0f6448e09695.png | Bin ...d8ee68aa0122190539f17f9774fd-2230x1124.png | Bin ...d811688a9551cfdf4a3ded6e129c85-844x474.svg | 0 ...98fa56a5cbddf6750801a5cc9eda2-1692x852.png | Bin ...45446995a4138069dcd5c4d664ed-1722x1620.png | Bin ...d10abfcf7d2c310d81cfaee4de21-1066x1190.png | Bin ...94338e862c881d97216ae51f7c70-2888x1372.png | Bin ...86712c3c6ac48c443d69c60e73f3-2888x2206.png | Bin ...927416c9bd776ac02895cc5775624-1348x932.png | Bin ...2f5c1cb3e19f10a0f6522f093d6291-844x474.svg | 0 ...f518c9a4f0c317c5952374add63e6-1266x711.png | Bin apps/blog/source.config.ts | 68 +++++- apps/blog/src/app/(blog)/[slug]/page.tsx | 6 +- apps/blog/src/components/BlogGrid.tsx | 4 +- apps/blog/src/lib/source.tsx | 2 +- apps/blog/src/lib/url.ts | 96 ++++++++ apps/blog/src/mdx-components.tsx | 6 +- 1420 files changed, 1983 insertions(+), 1258 deletions(-) rename apps/blog/public/{blog => }/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/03cc8051d3cdfcabcb6037fcb5fbe1d33856fc99-1816x1400.png (100%) rename apps/blog/public/{blog => }/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/1a9c595ed52f76150075536f39a1d00a014da6b1-1950x1240.png (100%) rename apps/blog/public/{blog => }/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/39eadb7214d14e787cf74adbcbd9940f6cdb4ae2-2888x2644.png (100%) rename apps/blog/public/{blog => }/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/5a5b498ea72ab4a0969ed268408ef95d6f301d53-2888x1372.png (100%) rename apps/blog/public/{blog => }/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/cbb0879b85e332bad731a1ca4c514d7c66ea9616-2888x1372.png (100%) rename apps/blog/public/{blog => }/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/e7b3db57367968f0458172fb2f8bfa532b82f7ed-2068x1600.png (100%) rename apps/blog/public/{blog => }/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/hero-af7a5b40501028b64219b2144f7b5c03723c4d99-844x474.svg (100%) rename apps/blog/public/{blog => }/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/meta-c7ef9462464563ecc68ddf667e18dbef71f9f4fd-1266x711.png (100%) rename apps/blog/public/{blog => }/accelerate-ga-release-i9cqm6bsf2g6/imgs/48bf68ea87d144f63f476efc98b9ba9d5ccb29a8-400x400.jpg (100%) rename apps/blog/public/{blog => }/accelerate-ga-release-i9cqm6bsf2g6/imgs/832974c6ad7e1bb0e8ca928e5d1a0b58ccfe8220-800x800.jpg (100%) rename apps/blog/public/{blog => }/accelerate-ga-release-i9cqm6bsf2g6/imgs/formbricks.svg (100%) rename apps/blog/public/{blog => }/accelerate-ga-release-i9cqm6bsf2g6/imgs/hero-de83f5f843f2a86abd05659c94c3069e7577a0f5-844x474.svg (100%) rename apps/blog/public/{blog => }/accelerate-ga-release-i9cqm6bsf2g6/imgs/logo-cal.svg (100%) rename apps/blog/public/{blog => }/accelerate-ga-release-i9cqm6bsf2g6/imgs/meta-42554fa75736c00b0ca55e1e440dde26f43dcb3f-1266x711.png (100%) rename apps/blog/public/{blog => }/accelerate-ipv6-first/imgs/hero-248d5719caeee73ee2c7f94a7d194de949af1524-844x475.svg (100%) rename apps/blog/public/{blog => }/accelerate-ipv6-first/imgs/meta-b5bac6d735ee17d003b0a06190a5fa5c0e3fcc15-1266x713.png (100%) rename apps/blog/public/{blog => }/accelerate-preview-release-ab229e69ed2/imgs/connection-pool-located-in-the-database-region.png (100%) rename apps/blog/public/{blog => }/accelerate-preview-release-ab229e69ed2/imgs/global-cache.png (100%) rename apps/blog/public/{blog => }/accelerate-preview-release-ab229e69ed2/imgs/hero-587aeef34568af2258cd4e5f0453710b0b94259c-844x474.svg (100%) rename apps/blog/public/{blog => }/accelerate-preview-release-ab229e69ed2/imgs/meta-3a75c0ed5f8837980765d5b7589367216653d6b7-1266x711.png (100%) rename apps/blog/public/{blog => }/accelerate-static-ip-support/imgs/14f0c87eaa0bb42137006d8f8b0ad16b23ac648b-2960x988.png (100%) rename apps/blog/public/{blog => }/accelerate-static-ip-support/imgs/150247eeac00c5b575e06024aec82d5bf08eb57e-2960x1406.png (100%) rename apps/blog/public/{blog => }/accelerate-static-ip-support/imgs/3be45327e6177e94ffb2739a1face51226c6ce5f-2572x1570.png (100%) rename apps/blog/public/{blog => }/accelerate-static-ip-support/imgs/5fba5bb200c4418e360b6a4114e3a0d3c16d7fab-791x344.png (100%) rename apps/blog/public/{blog => }/accelerate-static-ip-support/imgs/970ae13572758d9962b6cc0b72b7e5a8c1af341b-2978x1976.png (100%) rename apps/blog/public/{blog => }/accelerate-static-ip-support/imgs/d1f333f72a4431083fafc0eb1f25ba8c3c7203b6-1480x703.png (100%) rename apps/blog/public/{blog => }/accelerate-static-ip-support/imgs/hero-06da453a2597f2571d34972ec912ad3c32f37ba6-844x474.svg (100%) rename apps/blog/public/{blog => }/accelerate-static-ip-support/imgs/meta-9a5f27696242c051a689abed3d4b7099a8145301-1200x674.png (100%) rename apps/blog/public/{blog => }/advanced-database-schema-management-with-atlas-and-prisma-orm/imgs/hero-6ad0def91299fbf2a745f528d83a194350d0ee74-844x475.svg (100%) rename apps/blog/public/{blog => }/advanced-database-schema-management-with-atlas-and-prisma-orm/imgs/meta-862a4191726cfb1bcc2e53bc83e377e1af47cd5d-1200x675.png (100%) rename apps/blog/public/{blog => }/all-you-need-to-know-about-apollo-client-2-7e27e36d62fd/imgs/hero-ebd9548e6d9cfb33c4e35eac48e11a80532a8d30-1440x960.jpg (100%) rename apps/blog/public/{blog => }/ambassador-program-nxkwgcgnuvfx/imgs/hero-1bdf6237d95ded8d448f28db203012147fdcd39e-846x426.png (100%) rename apps/blog/public/{blog => }/ambassador-program-nxkwgcgnuvfx/imgs/meta-de28b5e0df55c52078065ee2ae0b44d6cdf0da1e-1692x852.png (100%) rename apps/blog/public/{blog => }/amplication-customer-story-nmlkbnlllxnn/imgs/159914408-83d5bddb-e3e7-46fa-9d47-f247ce42c68b.jpeg (100%) rename apps/blog/public/{blog => }/amplication-customer-story-nmlkbnlllxnn/imgs/amplication-prisma-diagram2.png (100%) rename apps/blog/public/{blog => }/amplication-customer-story-nmlkbnlllxnn/imgs/amplication-ui.png (100%) rename apps/blog/public/{blog => }/amplication-customer-story-nmlkbnlllxnn/imgs/hero-b1fb9ec0c8fca054011688621bfe51ea1836af10-844x474.svg (100%) rename apps/blog/public/{blog => }/amplication-customer-story-nmlkbnlllxnn/imgs/meta-4baa84e48a0da8e13e23367137d5a17515119aaf-2881x1620.png (100%) rename apps/blog/public/{blog => }/announcing-accelerate-usrvpi6sfkv4/imgs/hero-9c6258461d73719cebc60136dd4e976d79306dcb-845x475.svg (100%) rename apps/blog/public/{blog => }/announcing-accelerate-usrvpi6sfkv4/imgs/meta-25afee16878423e24c7aff2bb3fe49a433996d03-1200x631.png (100%) rename apps/blog/public/{blog => }/announcing-discord-1liaops7lxv9/imgs/discord-screenshot.png (100%) rename apps/blog/public/{blog => }/announcing-discord-1liaops7lxv9/imgs/hero-7ae00282956a1f6a68f815b4cffee5ee1b1ce934-844x474.svg (100%) rename apps/blog/public/{blog => }/announcing-discord-1liaops7lxv9/imgs/meta-388b596e6a40f7eeaf42604a4645c93dd051af6a-1267x712.png (100%) rename apps/blog/public/{blog => }/announcing-on-demand-cache-invalidation-for-prisma-accelerate/imgs/46cf59b4dcf666cc403923788d01a5eb0c959970-870x804.gif (100%) rename apps/blog/public/{blog => }/announcing-on-demand-cache-invalidation-for-prisma-accelerate/imgs/hero-4100fa47bccf0620564331dda7e0c65bcd069ef2-844x474.svg (100%) rename apps/blog/public/{blog => }/announcing-on-demand-cache-invalidation-for-prisma-accelerate/imgs/meta-40c9facc0c25985278c069ade326008e14baef9a-1266x711.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-2-n0v98rzc8br1/imgs/5YEs4IC.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-2-n0v98rzc8br1/imgs/YWeTRfU.mp4 (100%) rename apps/blog/public/{blog => }/announcing-prisma-2-n0v98rzc8br1/imgs/cQRivY4.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-2-n0v98rzc8br1/imgs/hero-11436ec45c7ccbc812212d1d6d7c8794d9514f2f-1692x852.jpg (100%) rename apps/blog/public/{blog => }/announcing-prisma-2-n0v98rzc8br1/imgs/kPGJU6j.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-2-zq1s745db8i5/imgs/AG34kGB.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-2-zq1s745db8i5/imgs/bFUA7LC.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-2-zq1s745db8i5/imgs/gqbGz7b.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-2-zq1s745db8i5/imgs/hero-34a26858c7de3cad0d84a376d12b58b82ee10da0-1200x630.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-2-zq1s745db8i5/imgs/l1Jg54Y.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-6-18-0/imgs/9393decb8beaf4ed3d4df4be8ab04809a83dcdfc-2880x1664.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-6-18-0/imgs/hero-6903d477604982ce17726b525221e1e1de6eb1a1-844x474.svg (100%) rename apps/blog/public/{blog => }/announcing-prisma-6-18-0/imgs/meta-85fc09231b7180336b63d1da7fe47a2520db99f5-1266x711.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-6-19-0/imgs/000a48b9be0569e18d23dd3c38c25fb2af113b9e-3840x1632.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-6-19-0/imgs/hero-21b965afb8b247bc0f088a71d844d66b64d5da38-844x474.svg (100%) rename apps/blog/public/{blog => }/announcing-prisma-6-19-0/imgs/meta-fab568a4879cfeb58a8405888c303ce5b6b279fb-1266x711.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-day-50cg22nn40qk/imgs/hero-d719c9276cc4c57665d4a32cc5fdae5b5bfcad50-1200x630.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-day-50cg22nn40qk/imgs/meta-eeacc461f1965ed958af330fc9dc93f635920b43-1200x630.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-orm-7-0-0/imgs/0a893742a7f9fca80962be7d17ee7582d53cb322-400x400.jpg (100%) rename apps/blog/public/{blog => }/announcing-prisma-orm-7-0-0/imgs/131c271750cb6bc7116f609982eef70a7efdca21-400x400.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-orm-7-0-0/imgs/bae4c44f9bed7c0c255b338cf93b4e498ef540a8-400x400.jpg (100%) rename apps/blog/public/{blog => }/announcing-prisma-orm-7-0-0/imgs/hero-bbef45a84ff4bd03130bed3589b7d240c29ce325-844x474.svg (100%) rename apps/blog/public/{blog => }/announcing-prisma-orm-7-0-0/imgs/meta-6b30aeef18d38ef00eb7b90286801660d84a9a0e-1266x711.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-orm-7-2-0/imgs/hero-51b054f6d21361fc56212a05c7efd36b78e62ff3-844x474.svg (100%) rename apps/blog/public/{blog => }/announcing-prisma-orm-7-2-0/imgs/meta-e05db51030f5b58e706489c501174d1d00eb99ec-1266x711.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-playground-xeywknkj0e1p/imgs/hero-1735a3ccb59d21fc0d32410b0b3ac83242fcd020-844x474.svg (100%) rename apps/blog/public/{blog => }/announcing-prisma-playground-xeywknkj0e1p/imgs/meta-470fec1fa04cf5fccadfadd70b449d857ee62116-1688x948.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-playground-xeywknkj0e1p/imgs/playground-1.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-playground-xeywknkj0e1p/imgs/playground-2.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-playground-xeywknkj0e1p/imgs/playground-3.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/022ffab1873aba7d53ea1f10ab731171741b2a0e-200x200.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/13131.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/178696d9a18e3803db87032122e7ade619554c4e-2888x1236.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/207787ea1a4636a6c13963cf3211c538beb8301a-1734x678.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/36a57a880128c93e52193c963fc0c9889ea9df5a-1282x504.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/8cf5361a40fdc079b0db4b848483b59f2e99d50b-1740x232.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/90776da4721482b7372b74a8ace42afe009d86d2-1610x886.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/9b447d300530904e726ef326c34e816553e605b8-1080x838.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/beb4ebfa5c4f39105629e6aadc77554eeaea256d-1204x274.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/c356d781c1816fad242fac28520fbe6199a9deae-2888x1858.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/c5430a6cd6e3437dc71d217e3bee9d3b4755788c-2510x1290.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/d7a8980c3be1841af6c46fee0683b93179052358-1114x592.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/ebc7c8fd2fb5b811ead970edee0ae69150f6e25c-2888x1858.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/f65bc24502ef9b28f0d5c7f3716e643015c62099-690x362.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/hero-153cb5a3d4a5447955824c28ae43788e7c407adf-633x356.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-early-access/imgs/meta-6796d74a842eae9429254e7ed11b483985ba4e50-1266x711.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-for-ai-coding-agents/imgs/ed3b8387fd31f1db39c0fa35305107c611a6c9a4-1444x434.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-for-ai-coding-agents/imgs/hero-6ad1b7b4a851a45e91418d443573f0c38accc78d-844x474.svg (100%) rename apps/blog/public/{blog => }/announcing-prisma-postgres-for-ai-coding-agents/imgs/meta-24be732ef3e8f019820d370b8a5f74ab14170fdc-1266x711.png (100%) rename apps/blog/public/{blog => }/announcing-prisma-s-mcp-server-vibe-code-with-prisma-postgres/imgs/hero-7d96f16b30c6971db0da1e546a13a985ec47f6f3-844x474.svg (100%) rename apps/blog/public/{blog => }/announcing-prisma-s-mcp-server-vibe-code-with-prisma-postgres/imgs/meta-0e15503386e31edce5fd389f4b2ee52b0f71a162-1266x711.png (100%) rename apps/blog/public/{blog => }/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/imgs/hero-807c11a11df0567a4b2ac96a0cac738b916d7416-1692x852.png (100%) rename apps/blog/public/{blog => }/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/imgs/meta-29585f8afef1e4c94930404a027807ca6ec0c2e3-2398x1208.png (100%) rename apps/blog/public/{blog => }/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/imgs/nexus-jsdoc.png (100%) rename apps/blog/public/{blog => }/announcing-typedsql-make-your-raw-sql-queries-type-safe-with-prisma-orm/imgs/hero-9d1c710f959ab75107576ad53720a7731c75797a-844x474.png (100%) rename apps/blog/public/{blog => }/announcing-typedsql-make-your-raw-sql-queries-type-safe-with-prisma-orm/imgs/meta-6212889ff7d56ad41636c0f7938159b1fd740651-1688x948.png (100%) rename apps/blog/public/{blog => }/announcing-upcoming-course-8s41wdqrlgc7/imgs/hero-c4f6ff1ce0178636ddc08d50f408c042800bac92-1270x714.png (100%) rename apps/blog/public/{blog => }/aws-marketplace/imgs/hero-f97462343e60a5322d236b809eaf9555aa725651-844x474.svg (100%) rename apps/blog/public/{blog => }/aws-marketplace/imgs/meta-328edbc9eaafbce2d4e09174ee22a13f77e758d3-1266x711.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/imgs/hero-9f73d35216a42b2bb796a971053669fbc90e36ee-846x426.svg (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/imgs/meta-9eae0d75afddb1fce65c68320479268f4cdcffd3-1692x852.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/imgs/modern-backend-3-auth-flow.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/imgs/grading-app-schema.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/imgs/hero-df67ee11927bde800c1ba033b94e182ab3565110-1692x852.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/hero-d3aa9c3e0b081fe4d675e11574d1bbcf8ea9de46-1692x852.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-actions-enable.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-actions-tab.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-github-new-secret.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-github-no-secrets-arrow.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-github-secrets.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-heroku-api-key.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run-deploy-job.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run-details.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run-test-job.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run.png (100%) rename apps/blog/public/{blog => }/backend-prisma-typescript-orm-with-postgresql-rest-api-validation-dcba1ps7kip3/imgs/hero-21fe21324bb4e62111c88b37b71091676e29f616-1692x852.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/1-a-first-request.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/1-b-subsequent.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/2-a-with-cache.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/2-a-without-cache.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/3-a-with-cache.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/3-a-without-cache.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/4-a-cache-syncronization.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/5-a-granularity.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/6-cache-utilization.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/7-cache-avalanche.png (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/hero-ce90e81e707c3b5735077783e1db72216b8a56dd-844x474.svg (100%) rename apps/blog/public/{blog => }/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/meta-72680f73691cdf86b51087621b4b0e79ac12fde7-1266x712.png (100%) rename apps/blog/public/{blog => }/bfg/imgs/hero-9e46446f32d354d43e61580e8fc6f1855839e4e5-844x474.svg (100%) rename apps/blog/public/{blog => }/bfg/imgs/meta-48f848dd9b8582c9e4ce13d14f2001a485d281d3-1266x711.png (100%) rename apps/blog/public/{blog => }/bringing-prisma-orm-to-react-native-and-expo/imgs/hero-bbb1e7f6b0f7bef3d318fac96652548cad0ef0b5-844x474.svg (100%) rename apps/blog/public/{blog => }/bringing-prisma-orm-to-react-native-and-expo/imgs/meta-289f00bdde5d5f308f3faa684d09f647974d77b6-1200x630.png (100%) rename apps/blog/public/{blog => }/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/hero-0e8c20420d860a393f68694b8bab707306822df3-1692x852.png (100%) rename apps/blog/public/{blog => }/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/meta-711f2d3f2094907c22c0ef2dd88e69992f950026-2400x1256.png (100%) rename apps/blog/public/{blog => }/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-1.png (100%) rename apps/blog/public/{blog => }/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-2.png (100%) rename apps/blog/public/{blog => }/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-3.png (100%) rename apps/blog/public/{blog => }/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-4.png (100%) rename apps/blog/public/{blog => }/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-5.png (100%) rename apps/blog/public/{blog => }/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-6.png (100%) rename apps/blog/public/{blog => }/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-7.png (100%) rename apps/blog/public/{blog => }/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-8.png (100%) rename apps/blog/public/{blog => }/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/0464e1fee8099d997e95b6aaa24a13ef5d40cbb8-1950x1392.png (100%) rename apps/blog/public/{blog => }/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/1200px-Cloudflare_Logo.png (100%) rename apps/blog/public/{blog => }/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/a695edcc461f4bc01a9eac9d3a103d8ef2ab9dfd-1960x1386.png (100%) rename apps/blog/public/{blog => }/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/dece55108fc5c399e5466b8dc5d73e8e9509cab0-1480x1696.png (100%) rename apps/blog/public/{blog => }/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/hero-66fc05379af15d65fd3dd6d792c9a575db648895-844x474.png (100%) rename apps/blog/public/{blog => }/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/meta-9804cde42d974d63b5a3b8bc951c13aeb9187101-1266x711.png (100%) rename apps/blog/public/{blog => }/caching-database-queries-with-prisma-accelerate/imgs/09cee9fb07d0f6190228e118596eed223a1ea99e-2888x1110.png (100%) rename apps/blog/public/{blog => }/caching-database-queries-with-prisma-accelerate/imgs/8b295baeeaf620323649d054718900fb542b6042-2888x1110.png (100%) rename apps/blog/public/{blog => }/caching-database-queries-with-prisma-accelerate/imgs/ff3f792f22982a08e1ebad1e81b0cc0d43c30b06-2888x1110.png (100%) rename apps/blog/public/{blog => }/caching-database-queries-with-prisma-accelerate/imgs/hero-69cd8d277e2307eb14396450817be41bb1e7c305-844x474.svg (100%) rename apps/blog/public/{blog => }/caching-database-queries-with-prisma-accelerate/imgs/meta-959743e064c1771e65e078aa6ebee2b402c28578-1266x711.png (100%) rename apps/blog/public/{blog => }/client-extensions-ga-4g4yiu8eosbb/imgs/hero-b404c12ca7de2f9288368dacbce578b790bfd66d-844x474.svg (100%) rename apps/blog/public/{blog => }/client-extensions-ga-4g4yiu8eosbb/imgs/meta-50e7e57ea5967ad67ce89e682aca57f5e19fd65a-1266x712.png (100%) rename apps/blog/public/{blog => }/client-extensions-preview-8t3w27xkrxxn/imgs/hero-1b0474b02ed0759af1c6e3f3bcba5d4ebb1d970b-844x474.svg (100%) rename apps/blog/public/{blog => }/client-extensions-preview-8t3w27xkrxxn/imgs/meta-5ca8711a05c2f835cfce511739e46b5f6df982cd-1266x712.png (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/08374161212a38430c333ecc3e64874e450f36db-1484x304.png (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/2bf416687abd9defbaac092404b907ed69507e3e-1484x406.png (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/2c4d00720394b5b0182ffa107c8facdf644c45c2-1484x508.png (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/5851e5907dea7d40565cba4e2b38ab42dbd74c28-1200x630.png (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/647674d0cfd58e8d406c45cdc75172dfc013cdc7-1480x778.png (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/76f8721b44540468af6c2c2d7335bf9691c8bedb-1200x630.png (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/8eb86e862d6739302c7bc6209ef01b2f157146f3-1480x302.png (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/9c4d4c5ad6bf475c30cc2b06dff9e6c0f484b7f1-1480x302.png (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/db7937e7875b49f2e6e4c5369db024db349c0fd6-1484x304.png (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/hero-cb3b5906c2776d8457722f79222e915cd08aa6a3-844x474.svg (100%) rename apps/blog/public/{blog => }/cloud-connectivity-report-2024/imgs/meta-4081c40e88b18cc130df73ce6102d5154c7ad39c-1200x630.png (100%) rename apps/blog/public/{blog => }/cloudflare-partnership-qerefgvwirjq/imgs/hero-726190b9f3c5c097cc8cfa5dc08581458138758f-844x474.svg (100%) rename apps/blog/public/{blog => }/cloudflare-partnership-qerefgvwirjq/imgs/meta-c3dfb4dc0d8bc7d99b379b6e68668c6135aca53c-1266x711.png (100%) rename apps/blog/public/{blog => }/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/06d5ac72c9f8596e6765f72475d6811a57c61947-4064x2334.png (100%) rename apps/blog/public/{blog => }/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/7cef11dd00cbe3b8940b3be286ce9080129e5d05-2960x1822.png (100%) rename apps/blog/public/{blog => }/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/8cf5361a40fdc079b0db4b848483b59f2e99d50b-1740x232.png (100%) rename apps/blog/public/{blog => }/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/b38aa9235dab3c4bbef178b0944da6f97a9c2c2f-660x852.png (100%) rename apps/blog/public/{blog => }/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/e6d5ed34c551a50fe047743347f2d0165d62f214-714x859.png (100%) rename apps/blog/public/{blog => }/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/hero-e23d2415c9dce256ee6090919392141e9da30678-844x474.svg (100%) rename apps/blog/public/{blog => }/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/meta-b078a6114c23eb0c00322a230a463628f4799fb4-1266x711.png (100%) rename apps/blog/public/{blog => }/cockroach-ga-5jrd9xvwqdyl/imgs/cockroach-diagram.png (100%) rename apps/blog/public/{blog => }/cockroach-ga-5jrd9xvwqdyl/imgs/hero-ebf53ec190dab44f271d4f0dd1ad658507f55b66-844x474.svg (100%) rename apps/blog/public/{blog => }/cockroach-ga-5jrd9xvwqdyl/imgs/meta-77148d314c74789939fb2b2af2bf3f82378cebc0-1920x1080.png (100%) rename apps/blog/public/{blog => }/cockroach-ga-5jrd9xvwqdyl/imgs/migration.png (100%) rename apps/blog/public/{blog => }/cockroach-ga-5jrd9xvwqdyl/imgs/release-notes.png (100%) rename apps/blog/public/{blog => }/cockroach-ga-5jrd9xvwqdyl/imgs/statements.png (100%) rename apps/blog/public/{blog => }/compliance-reqs-complete/imgs/hero-d21f1c5e95d54f9016987dc7885b6b032c1bc140-844x474.svg (100%) rename apps/blog/public/{blog => }/compliance-reqs-complete/imgs/meta-457925aa50c548e3c000c94e5dab3874b4272046-1266x711.png (100%) rename apps/blog/public/{blog => }/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/imgs/37841e4d757e5ec1c09e6285933fc7ec16ad1902-3248x2112.png (100%) rename apps/blog/public/{blog => }/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/imgs/hero-b06562c14b921f9c72bd78bcd5b04717f20cf9e4-844x474.svg (100%) rename apps/blog/public/{blog => }/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/imgs/meta-1e5148009a4294ebba377f758ce1139e3c46bcef-1266x711.png (100%) rename apps/blog/public/{blog => }/connections-edges-nodes-in-relay-758d358aa4c7/imgs/0*sPafc6eXHJvRSJhZ.png (100%) rename apps/blog/public/{blog => }/connections-edges-nodes-in-relay-758d358aa4c7/imgs/hero-a86c8de527177e03b9e08b9f1f1522dc1debbc6d-559x361.png (100%) rename apps/blog/public/{blog => }/connections-edges-nodes-in-relay-758d358aa4c7/imgs/meta-cc730c78d87244cb877764a6a4a850b2c9223871-1200x775.png (100%) rename apps/blog/public/{blog => }/convergence/imgs/hero-532d75ec739a13ee528e8b2a085d47fc962a3ca7-840x472.png (100%) rename apps/blog/public/{blog => }/convergence/imgs/meta-3963296cdd515c9ae5cb17379fcff0da144c7b35-1266x711.png (100%) rename apps/blog/public/{blog => }/coo-announcement-aer1fgviirjb/imgs/hero-c79e2c7b7f4cd64f5be9677d4fab38140809b0f9-1267x711.png (100%) rename apps/blog/public/{blog => }/data-platform-static-ips/imgs/hero-f9991a96b6b8ce0fa61dead528141fa1e8b911be-844x474.svg (100%) rename apps/blog/public/{blog => }/data-platform-static-ips/imgs/meta-725058cd14e118302aa8e56bbaf31e46436bfc91-1269x640.png (100%) rename apps/blog/public/{blog => }/data-platform-static-ips/imgs/pdp-static-egress-demo.gif (100%) rename apps/blog/public/{blog => }/data-platform-static-ips/imgs/pdp-static-egress-project.gif (100%) rename apps/blog/public/{blog => }/database-access-in-react-server-components-r2xgk9aztgdf/imgs/hero-f388984fa1fe34f5d79d884f6f599c22a4107fa1-846x426.png (100%) rename apps/blog/public/{blog => }/database-access-in-react-server-components-r2xgk9aztgdf/imgs/meta-8befd7df92cc32135332ef9c28b41e076e2c8998-1251x630.png (100%) rename apps/blog/public/{blog => }/database-access-in-react-server-components-r2xgk9aztgdf/imgs/network-waterfall.png (100%) rename apps/blog/public/{blog => }/database-access-in-react-server-components-r2xgk9aztgdf/imgs/server-components-demo.png (100%) rename apps/blog/public/{blog => }/database-access-in-react-server-components-r2xgk9aztgdf/imgs/spotify-artist-details.png (100%) rename apps/blog/public/{blog => }/database-access-in-react-server-components-r2xgk9aztgdf/imgs/traditional-and-server-components-comparison.png (100%) rename apps/blog/public/{blog => }/database-vs-application-demystifying-join-strategies/imgs/14d97834abcc4a48970178b9357c95b7c69773e1-1242x1694.png (100%) rename apps/blog/public/{blog => }/database-vs-application-demystifying-join-strategies/imgs/47ca5a5f744cde64f8caaa359a2870df758d3c91-3200x1256.png (100%) rename apps/blog/public/{blog => }/database-vs-application-demystifying-join-strategies/imgs/aecb797ff9a4fec41786e1acfd8ea81be54ba073-404x571.png (100%) rename apps/blog/public/{blog => }/database-vs-application-demystifying-join-strategies/imgs/ee53bcfbca9834771ff6856d9fcd6e77aef7bf04-1228x1708.png (100%) rename apps/blog/public/{blog => }/database-vs-application-demystifying-join-strategies/imgs/hero-5fa4fcf8d00bbf21e0b169f955a09f79332fb75b-844x474.svg (100%) rename apps/blog/public/{blog => }/database-vs-application-demystifying-join-strategies/imgs/meta-3dd1f6419862f57459fa70702fabf854946e6e13-1266x711.png (100%) rename apps/blog/public/{blog => }/datadx-event-recap-z5pcp6hzbz5m/imgs/hero-23097a272172cd3791887b9664ecd25e4dc65cff-843x474.svg (100%) rename apps/blog/public/{blog => }/datadx-event-recap-z5pcp6hzbz5m/imgs/meta-3155f43f9648d3e4eedd05759f69d6876b72d313-1265x711.png (100%) rename apps/blog/public/{blog => }/datadx-manifesto-ikgyqj170k8h/imgs/hero-2e402be560690da1dd594236284a8efa71a8f82f-844x474.svg (100%) rename apps/blog/public/{blog => }/datadx-manifesto-ikgyqj170k8h/imgs/meta-96de5fd29833ae651da6ecc88c021bb9d84eba1b-1266x711.png (100%) rename apps/blog/public/{blog => }/datadx-name-for-prismas-philosophy/imgs/hero-6b87cc279c810d8c9af92e0bfc3e4a4b21dd9bf0-844x474.svg (100%) rename apps/blog/public/{blog => }/datadx-name-for-prismas-philosophy/imgs/meta-20adaa4799629b59c11ad00ea86bdc7cfbbd0ed5-1266x711.png (100%) rename apps/blog/public/{blog => }/datamodel-v11-lrzqy1f56c90/imgs/hero-99f1530d6ebe62110fd2839ba4f0185795ee5db4-1200x630.png (100%) rename apps/blog/public/{blog => }/datamodel-v11-lrzqy1f56c90/imgs/wJCyxVy.png (100%) rename apps/blog/public/{blog => }/documenting-apis-mjjpz7e7nkvp/imgs/115104730-06d2f780-9f63-11eb-9f82-f7bd75d58558.png (100%) rename apps/blog/public/{blog => }/documenting-apis-mjjpz7e7nkvp/imgs/115109659-bfa72f80-9f7f-11eb-9fde-f995c6f51262.png (100%) rename apps/blog/public/{blog => }/documenting-apis-mjjpz7e7nkvp/imgs/115110406-ef583680-9f83-11eb-9155-753600312788.png (100%) rename apps/blog/public/{blog => }/documenting-apis-mjjpz7e7nkvp/imgs/1_btqXg9fLTExVjRDyrY1vsA.jpeg (100%) rename apps/blog/public/{blog => }/documenting-apis-mjjpz7e7nkvp/imgs/hero-2982f7850de70f0c52daa613dae904b463342823-1692x852.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/finished-ui.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/hero-2f58c7e9701e7f9a0250db211bdf5284da11d2d8-844x474.svg (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/localhost.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/messages-displayed.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/meta-dc0f147b1428391e4b3d0374523d45639d1318a6-1269x715.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/tailwind-complete.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/user-displayed.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/vite-starter.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/hero-838c88ca3817165045cc051d8845880e5a313baf-844x474.svg (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/meta-06962f83ac8be93c511d0ef6cbc29e2cff49e387-1269x715.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-connect.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-data.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-home.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-new-db.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-postgres-option.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-tables.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/run-dev.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/data.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/explorer.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/generate.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/hero-78bb7b87f2bf7e691114b2768df5ddfe12e00934-844x474.svg (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/meta-c8b654f7165277e7cf2cfde5311381d601463251-1269x715.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/model-auto.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/playground.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/prisma-client-required.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/prisma-type-required.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/yoga-start.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/1.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/2.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/3.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/api-url.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/app-complete.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/codegen.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/finished.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/generated-types.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-api-url.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-api.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-create.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-new.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/hero-b277fdcfbb2267b2f5a9b5d2bd7f06e053febf0f-844x474.svg (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/meta-42c1cab53d152b8e3e634d75bc70b9d624431cf7-1269x715.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-api-connection.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-api-url.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-connect.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-deploy-service.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-free.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-new.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-web-service.png (100%) rename apps/blog/public/{blog => }/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/url-github.png (100%) rename apps/blog/public/{blog => }/elsevier-customer-story-ssaaskagmhtn/imgs/elsevier-architecture-diagram.png (100%) rename apps/blog/public/{blog => }/elsevier-customer-story-ssaaskagmhtn/imgs/hero-4eaa561121a703742d0016b7a60b69e0cc262dc8-1692x852.png (100%) rename apps/blog/public/{blog => }/elsevier-customer-story-ssaaskagmhtn/imgs/peer-review-diagram-V3.png (100%) rename apps/blog/public/{blog => }/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*LnVsDQuQtSl-Wt-m6DfO5g.png (100%) rename apps/blog/public/{blog => }/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*ZbsVGATAeIp5iU2504VP2A.png (100%) rename apps/blog/public/{blog => }/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*m6QGz5tXtLt7uVapNCpBEw.png (100%) rename apps/blog/public/{blog => }/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/hero-88be8d72c611e06bf0170f1e0416f589d50262dd-720x481.jpg (100%) rename apps/blog/public/{blog => }/esop-exercise-windows/imgs/hero-187cb6c0e9ac7a4c48892a3e196329e955984278-844x474.svg (100%) rename apps/blog/public/{blog => }/esop-exercise-windows/imgs/meta-da1df6bc6f7afc4cf8f1620698c60d0c2a6cd768-1200x630.png (100%) rename apps/blog/public/{blog => }/formbricks-and-prisma-accelerate-solving-scalability-together/imgs/b3991bb21717cf3caaeacd5e46d17a6189105a1c-512x512.png (100%) rename apps/blog/public/{blog => }/formbricks-and-prisma-accelerate-solving-scalability-together/imgs/c4d6d20630e17f115e3b5740d6b5aba945e6b007-2000x1337.png (100%) rename apps/blog/public/{blog => }/formbricks-and-prisma-accelerate-solving-scalability-together/imgs/hero-2dedf610e6c3e1bfd7d7d262e086c9ced48412fa-804x474.svg (100%) rename apps/blog/public/{blog => }/formbricks-and-prisma-accelerate-solving-scalability-together/imgs/meta-e5f44f24630fabc28fd03092a220f9ad09fccc84-1800x945.png (100%) rename apps/blog/public/{blog => }/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/1a90825c7f7897d07fa9422a4c9a2415befb0a80-1480x695.png (100%) rename apps/blog/public/{blog => }/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/598f7a3ad7506e4515a5b40eead655dcf35c0551-1280x600.png (100%) rename apps/blog/public/{blog => }/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/c63df7c781f89520601e5a727a48e01b07475569-1280x889.png (100%) rename apps/blog/public/{blog => }/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/hero-0f2a3395d4395fe407ce7fb6b603bb7c5ff3e460-844x474.svg (100%) rename apps/blog/public/{blog => }/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/meta-ded124ddfa8412b0d678ab94a9804127188fde00-1266x711.png (100%) rename apps/blog/public/{blog => }/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/vXvfrfqqDbU (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/hero-2e21e72be724fc37acc24f269c8b6a0628ad5a18-870x438.jpg (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/meta-6edf92a2f15ffb62ed50e0da3deed2b2908d0156-2398x1208.png (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-1.png (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-10.png (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-2.png (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-3.png (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-4.png (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-5.png (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-6.png (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-7.png (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-8.png (100%) rename apps/blog/public/{blog => }/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-9.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/awesome-links-starter-project.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/cursor-pagination.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-documentation-explorer.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-example-query.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-playground.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-pothos-ok-query.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-query-db-data.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/hero-3c25e8ccea9b86c6d7a625f95cd6b42f76c8c5e7-1269x714.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/infinite-scrolling.gif (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/offset-skip-take.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/pagination-on-the-client-diagram.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/pagination-on-the-server-diagram.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/app-login-signup.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-add-hook-secret.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-add-module.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-customize-login-flow.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-create-new.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-define-action.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-login.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-ui.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-app-settings-url.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-app-settings.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-create-application.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-home.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/hero-6e7a91ceafb378a17154ba9cb238ed0953434c64-844x474.svg (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/meta-91075c8f117cdbd825ecc504f44bf57d5916e0af-1269x714.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/ngrok.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/prisma-studio-created-user.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/prisma-studio-role-update.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-all-users.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-create-user-screen.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-optional-tags.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-permissions.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-pick-username.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-user-credentials.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-users.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-management-console.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-access-settings.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-bucket-permissions.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-bucket-policy.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-cors.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-create-bucket.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-select-s3.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/hero-0672449d4925722e1d058122cf3ef071ca3235e4-844x474.svg (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/meta-020d4caf40065aad2ab5d59cff56d2bec9470bd9-1269x714.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/9OuYJ08.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/create-a-data-proxy-connection-string.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/create-project.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/data-proxy-connection-string-modal.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/data-proxy-connection-string.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/hero-487ed996090048a8225eec985d2ea001c5e1486b-844x474.svg (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/meta-6b91985fb8bb4d0d06e95090aab1d8b0ede0696b-1269x714.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/schema-sync.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/vercel-environment-variables.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/vercel-import-project.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/vercel-new-project.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/awesome-links-prisma-studio.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/awesome-links-starter-project.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/database-url-breakdown.png (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/hero-cf0efe94442ee755fc47d4c085a10f2b453c74a6-844x475.svg (100%) rename apps/blog/public/{blog => }/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/meta-1ec6d4e3035143375360a59242258c3c93609907-1269x714.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/build-a-database.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/hero-23f25185781fa115971071b951ef70832386640b-844x474.svg (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/kudos-home-complete.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/meta-f24cae902752ee69692b9010216f2d207af37321-1920x1080.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-connection-button.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-connection-modal.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-connection-string.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-default-settings.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-free-tier.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-ip-setup.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-user-setup.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/new-project.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/remix-starter.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/tailwind-css-checkpoint.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/user-collection.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/auth-flow.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/embedded-doc-helpers.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/error-message.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/form-toggle-incomplete.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/form-toggle.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/hero-29016ded5a59403f81349c8247116f8f084a0ae2-844x474.svg (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/initial-login.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/login-form.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/meta-4b70ee51aee99eaddac2a48baa614189c5fa74c2-1920x1080.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/signin-success.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/dynamic-filename.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/hero-45f6a2c1b0de348ea063b18dba5fb66f7dbb7594-844x474.svg (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/home-initial.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/kudo-feed.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/kudo-preview.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/meta-ec93dfa6d5929320447e9fa9610b276088e86dd8-1920x1080.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/nested-route-names.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/nested-route.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/portal-diagram.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/portal.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/recent-kudos.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/search-bar-sort.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/search-bar.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/select-boxes.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/sorting-functional.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/sub-routes.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/user-list.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/user-panel.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/users-logged.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/working-modal.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-add-user.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-bucket-access.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-bucket-permissions.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-bucket-policy.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-details.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-overview.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-permissions.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-s3.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-tags.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-user.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/delete-user.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/empty-profile-form.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/form-error.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/hero-a48a8ff2b7f60d0db82366f887ef868ba1ffe6ff-844x474.svg (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/image-upload.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/meta-fa4a72549e81768cec73ac357b0dacc1a4985cb6-1920x1080.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/profile-form-fields.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/referrential-delete.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/security-credentials.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/upload-result-database.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/upload-result-page.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/upload-result-s3.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/user-images.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/usercircle-header.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/congrats.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/create-repo.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/hero-a00a8da49b238e170ebeea1caa4d9a67fec1db3d-844x474.svg (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/ip-modal.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/kudos-error.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/meta-0c44161122fc6096b266ce2463146d441aef52f4-1920x1080.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/mongodb-network.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/new-repo.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/repo-pushed.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/repo-url.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/success.gif (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-deployed-dash.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-deploying.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-env.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-new.png (100%) rename apps/blog/public/{blog => }/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-repos.png (100%) rename apps/blog/public/{blog => }/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*A92lc0WjBQD120DC.png (100%) rename apps/blog/public/{blog => }/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*KQLRnImerQRjALS5.png (100%) rename apps/blog/public/{blog => }/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*QelKIjXtM12d3kAe.png (100%) rename apps/blog/public/{blog => }/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*h_JXfmCfcMYpbO__.png (100%) rename apps/blog/public/{blog => }/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*iPceJCV7B-ri4upn.png (100%) rename apps/blog/public/{blog => }/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*lWBTpLYdMBLe7BvS.png (100%) rename apps/blog/public/{blog => }/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*p_mSrJU2L90IXDSi.jpg (100%) rename apps/blog/public/{blog => }/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*t5Y1tsH07bEQHbrB.png (100%) rename apps/blog/public/{blog => }/getting-started-with-relay-modern-46f8de6bd6ec/imgs/hero-703a89ee445ad7c79ca9de6acc53c27a8e49204f-900x482.png (100%) rename apps/blog/public/{blog => }/graphql-directive-permissions-authorization-made-easy-54c076b5368e/imgs/hero-210b2d6ae4e602480f1fee9860018b83891660ee-900x482.png (100%) rename apps/blog/public/{blog => }/graphql-eu-18-eiw8bishe2di/imgs/1*-iELVZWzvAgEaKZlkNU6ZA.png (100%) rename apps/blog/public/{blog => }/graphql-eu-18-eiw8bishe2di/imgs/1*AN2VR8MNLpLeNzUOEGbCJA.png (100%) rename apps/blog/public/{blog => }/graphql-eu-18-eiw8bishe2di/imgs/1*_QMKg1HIi96OtzMMOtoajQ@2x.png (100%) rename apps/blog/public/{blog => }/graphql-eu-18-eiw8bishe2di/imgs/1*f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg (100%) rename apps/blog/public/{blog => }/graphql-eu-18-eiw8bishe2di/imgs/1*kKq-QXjiDhsDi82ZK8OX8w.png (100%) rename apps/blog/public/{blog => }/graphql-eu-18-eiw8bishe2di/imgs/Dc2NATAXcAE-sxs.webp (100%) rename apps/blog/public/{blog => }/graphql-eu-18-eiw8bishe2di/imgs/Dd5F0cmU8AI0DKJ.webp (100%) rename apps/blog/public/{blog => }/graphql-eu-18-eiw8bishe2di/imgs/hero-aa07614217b24348635532e5f06f7be6230c9077-1200x630.png (100%) rename apps/blog/public/{blog => }/graphql-middleware-zie3iphithxy/imgs/hero-00450644ec19cc8a354555367848ee135f88561c-1200x630.png (100%) rename apps/blog/public/{blog => }/graphql-middleware-zie3iphithxy/imgs/mbm2Syg.png (100%) rename apps/blog/public/{blog => }/graphql-middleware-zie3iphithxy/imgs/ygKiXlA.png (100%) rename apps/blog/public/{blog => }/graphql-schema-stitching-explained-schema-delegation-4c6caf468405/imgs/hero-b01f755cd26e943970fb26c0395027a491baa9a0-720x480.jpg (100%) rename apps/blog/public/{blog => }/graphql-sdl-schema-definition-language-6755bcb9ce51/imgs/hero-5d02853f87e521b189e585083a6fa90709310007-900x482.png (100%) rename apps/blog/public/{blog => }/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/1*2UStyS7v3NIZKl2cLsBtYA.png (100%) rename apps/blog/public/{blog => }/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/hero-53626cca942e63310e547d4bc3575d78fad23c84-720x479.png (100%) rename apps/blog/public/{blog => }/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*0ZgAAtT0Zm-Kc63SNeT5Ew.png (100%) rename apps/blog/public/{blog => }/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*6ERw4Znf6UYou_epNUutRA.png (100%) rename apps/blog/public/{blog => }/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*dMyX0jnoKvhYAa0cgSqenQ.png (100%) rename apps/blog/public/{blog => }/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*yIYI_iNabiNS_7uuzFVJDQ.png (100%) rename apps/blog/public/{blog => }/graphql-server-basics-the-network-layer-51d97d21861/imgs/hero-244004bc5e6c3eb9d27aacabfb68d51510ea275e-900x429.png (100%) rename apps/blog/public/{blog => }/graphql-server-basics-the-schema-ac5e2950214e/imgs/1*_fQh0zWBlDG1OJ-FbMnWcw.png (100%) rename apps/blog/public/{blog => }/graphql-server-basics-the-schema-ac5e2950214e/imgs/hero-4b7f2edb1e23c9afd77908b058e6904ada648cc2-900x519.png (100%) rename apps/blog/public/{blog => }/graphql-vs-firebase-496498546142/imgs/hero-c257f8c747d9610f835954d2fe2601bda2b0bff3-720x385.png (100%) rename apps/blog/public/{blog => }/grover-customer-success-story-nxkwgcgnuvfd/imgs/KZX2GIV.png (100%) rename apps/blog/public/{blog => }/grover-customer-success-story-nxkwgcgnuvfd/imgs/eSb3LiB.png (100%) rename apps/blog/public/{blog => }/grover-customer-success-story-nxkwgcgnuvfd/imgs/hero-3fcd833a161c68af69d2c13eafb3369f343e0856-844x474.svg (100%) rename apps/blog/public/{blog => }/grover-customer-success-story-nxkwgcgnuvfd/imgs/meta-cb121051733205088c9beee9cc8b5b4553e3988a-1692x852.png (100%) rename apps/blog/public/{blog => }/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/imgs/hero-b0f3d722a514f161e410fc12ccf0e00e562b5ecb-1692x852.jpg (100%) rename apps/blog/public/{blog => }/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/imgs/rapha_architecture_diagram.png (100%) rename apps/blog/public/{blog => }/how-bucket-uses-prisma-orm/imgs/ZTq9xEN.jpeg (100%) rename apps/blog/public/{blog => }/how-bucket-uses-prisma-orm/imgs/hero-529b3d14590540555baed7e42696fe030fb8d435-855x480.png (100%) rename apps/blog/public/{blog => }/how-bucket-uses-prisma-orm/imgs/meta-2912dd24525d0768088b7b6c6209b19bfba0d92f-1266x711.png (100%) rename apps/blog/public/{blog => }/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/imgs/0e1354fcf784282cfbf2048c499a4d5ff0c3446b-200x200.jpg (100%) rename apps/blog/public/{blog => }/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/imgs/hero-89282cc5e9c28bfbb3573c7bd396226f11b08089-844x474.svg (100%) rename apps/blog/public/{blog => }/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/imgs/meta-09f23372479a0a2b3a10304fc133043fa4d50948-1266x711.png (100%) rename apps/blog/public/{blog => }/how-deno-and-prisma-partnered-to-power-per-branch-databases/imgs/hero-45aa700bfa2da328ccb88b64d312672e25c2b263-844x474.svg (100%) rename apps/blog/public/{blog => }/how-deno-and-prisma-partnered-to-power-per-branch-databases/imgs/meta-b375e2f9e09737edda70601ea1d7094878822700-1200x630.png (100%) rename apps/blog/public/{blog => }/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*KQ620d8vVrnl4vCYyqkWOA.png (100%) rename apps/blog/public/{blog => }/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*SwVWiWOCRnyCCP80lKoXjw.png (100%) rename apps/blog/public/{blog => }/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*bz9k7dsElF5x_eqIfc_XWw.png (100%) rename apps/blog/public/{blog => }/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*nmcFbnUg7ooxjlZ8z-GLQA.png (100%) rename apps/blog/public/{blog => }/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*o57PeaoF5PVrON-FhR8QTA.png (100%) rename apps/blog/public/{blog => }/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/graphql-playground (100%) rename apps/blog/public/{blog => }/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/hero-da5c4b73a3fd5b55d0301343f2b5698eedc64f9e-900x545.jpg (100%) rename apps/blog/public/{blog => }/how-greatfrontend-supercharged-development-with-prisma-orm/imgs/1315101.png (100%) rename apps/blog/public/{blog => }/how-greatfrontend-supercharged-development-with-prisma-orm/imgs/1fdd15008595dc681e51014a12b087c6a93b1aa5-3792x2436.png (100%) rename apps/blog/public/{blog => }/how-greatfrontend-supercharged-development-with-prisma-orm/imgs/hero-ca1f358db8d06f5017b9d07ffb9d2dee6dac1197-844x474.svg (100%) rename apps/blog/public/{blog => }/how-greatfrontend-supercharged-development-with-prisma-orm/imgs/meta-a323448cc92e5d106e51a671d0f1d07d8667e306-1266x711.png (100%) rename apps/blog/public/{blog => }/how-masterboard-simplified-ci-cd-testing-with-prisma-postgres/imgs/hero-1f23e9b31ddcd853665664a9c2039b7c413a587e-844x474.svg (100%) rename apps/blog/public/{blog => }/how-masterboard-simplified-ci-cd-testing-with-prisma-postgres/imgs/meta-e680c2113c3e4838d591e4cac9d2889ea7317998-1266x711.png (100%) rename apps/blog/public/{blog => }/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/139663827-019df6d2-acdf-4383-a064-4521b67c5bda.jpeg (100%) rename apps/blog/public/{blog => }/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/139663846-9739c8a3-7522-457b-aae9-50d48239eb2c.jpeg (100%) rename apps/blog/public/{blog => }/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/2021-06-05-invisible-diagram.png (100%) rename apps/blog/public/{blog => }/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/hero-6c079320ad9b2a389f2419759abe8b2089f4b2d4-870x438.png (100%) rename apps/blog/public/{blog => }/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/meta-86c169055f2cef3afec8529ac1a1f9d2feb2e9ec-1692x852.png (100%) rename apps/blog/public/{blog => }/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/connection-pool.svg (100%) rename apps/blog/public/{blog => }/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/containers.png (100%) rename apps/blog/public/{blog => }/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/edge-w-db.png (100%) rename apps/blog/public/{blog => }/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/edge.png (100%) rename apps/blog/public/{blog => }/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/hero-39edebe28834872f6ce4c951529f02ea55725adc-844x474.svg (100%) rename apps/blog/public/{blog => }/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/meta-16bd738ba008cf22a31f583608f1717f4dfffb34-1266x712.png (100%) rename apps/blog/public/{blog => }/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/on-prem.png (100%) rename apps/blog/public/{blog => }/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/serverless.png (100%) rename apps/blog/public/{blog => }/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/virtual-machine.png (100%) rename apps/blog/public/{blog => }/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/12d31463e91d394c5019b14618766b4047c2bd8e-1480x731.png (100%) rename apps/blog/public/{blog => }/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/1ca939c080b3cf8bb986fcf4a17f16d6965f2a27-2220x1365.png (100%) rename apps/blog/public/{blog => }/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/885db2c52d6cd7ebe6f82437ac6e7a6034478698-1480x1696.png (100%) rename apps/blog/public/{blog => }/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/8c9fedf1d8f95be1c2cca043f80b05b991c7d161-2618x1100.png (100%) rename apps/blog/public/{blog => }/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/c2dd92cb8e0c4703e5b01448980142d32e4087fe-1998x750.png (100%) rename apps/blog/public/{blog => }/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/hero-09a857300a35ccb0e825102b49c0477ce6a88d3c-844x474.svg (100%) rename apps/blog/public/{blog => }/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/meta-1b20c9918f8c70edad559c02e68c2f0098514e92-1266x711.png (100%) rename apps/blog/public/{blog => }/how-prisma-supports-transactions-x45s1d5l0ww1/imgs/hero-644cfd40037273136103e964bfde80be554c43a7-1692x852.png (100%) rename apps/blog/public/{blog => }/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/1abd3930cb6ad0701c2860ec6491495ea20858f4-2888x1110.png (100%) rename apps/blog/public/{blog => }/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/3057a791f5ec64f5eb6394e7b8c5193d8450a23e-2618x1237.png (100%) rename apps/blog/public/{blog => }/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/542523ef4a619afc3ce8475550c08c8bbc6c8551-1850x678.png (100%) rename apps/blog/public/{blog => }/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/6eb1d966a877e30a33103ea5b451f09928de7ce1-2888x1110.png (100%) rename apps/blog/public/{blog => }/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/c808dbbce252a0914d4b1f13c09de462e9d077a1-2688x2050.png (100%) rename apps/blog/public/{blog => }/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/hero-501535574f7a2c835073bf096890b78dd3ee3490-844x474.svg (100%) rename apps/blog/public/{blog => }/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/meta-1ca84fbcd21cf4ba2965d4581c6b2e4ccbeba496-1688x948.png (100%) rename apps/blog/public/{blog => }/how-to-build-a-real-time-chat-with-graphql-subscriptions-and-apollo-d4004369b0d4/imgs/hero-c189aafe68785bbb4ff4f8c3e303c7f1ced92ea9-720x385.png (100%) rename apps/blog/public/{blog => }/how-to-improve-startup-times-kdrb9mjpev/imgs/after-json.png (100%) rename apps/blog/public/{blog => }/how-to-improve-startup-times-kdrb9mjpev/imgs/after-same-region.png (100%) rename apps/blog/public/{blog => }/how-to-improve-startup-times-kdrb9mjpev/imgs/db-near-server.png (100%) rename apps/blog/public/{blog => }/how-to-improve-startup-times-kdrb9mjpev/imgs/hero-e09fcabd4fa41b7b452a43664dea361d78f10e82-844x474.svg (100%) rename apps/blog/public/{blog => }/how-to-improve-startup-times-kdrb9mjpev/imgs/meta-76ae590ec7affe2930cc868334e99844d136473b-1266x711.png (100%) rename apps/blog/public/{blog => }/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/0*MZcp4O86JEoMbtpi.png (100%) rename apps/blog/public/{blog => }/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/hero-d817c94b8e0c665d3296db3d2983002133e7a548-900x619.png (100%) rename apps/blog/public/{blog => }/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*0mbKo-p6qfrBKgAaJb0gOQ.png (100%) rename apps/blog/public/{blog => }/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*UF5m7oNBcs1LKPboj7GQ8A.png (100%) rename apps/blog/public/{blog => }/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*m5LM8FgXa0VEMz-KwMyd3Q.png (100%) rename apps/blog/public/{blog => }/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*sGvSvA1yKloKDpXNb3jfBw.png (100%) rename apps/blog/public/{blog => }/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/hero-bf82758030919645523931bf645440e96386e06f-720x385.png (100%) rename apps/blog/public/{blog => }/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*-h6XwUanLrNSYjJk.png (100%) rename apps/blog/public/{blog => }/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*5vAu8GPtx3kpYcX9.png (100%) rename apps/blog/public/{blog => }/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*eqlu9eJJgj8vIqck.png (100%) rename apps/blog/public/{blog => }/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*mv6z4N7_OSza7_2h.png (100%) rename apps/blog/public/{blog => }/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/hero-f2e13f2e7910c8249ff5843c46423850eac4455d-1080x231.png (100%) rename apps/blog/public/{blog => }/improving-prismas-release-process-yaey8deiwaex/imgs/TvlsOeC.png (100%) rename apps/blog/public/{blog => }/improving-prismas-release-process-yaey8deiwaex/imgs/hL3C79O.png (100%) rename apps/blog/public/{blog => }/improving-prismas-release-process-yaey8deiwaex/imgs/hero-d8dabd6ac06854c11615741cb43bbae8569cdd4e-1200x630.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/hero-1c62649f62f41f22d8a54c882cd24da906c51479-844x474.svg (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/index.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/meta-c92a4afeb9d9b1df6f8104fced300d5e49233bd0-1269x714.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/query-parallelization.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/table-partitioning.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184093462-b8ec58e9-3540-4a60-9408-84e51a4f9f19.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184093478-92dea6ed-6486-46b8-b99e-62a0af29c01a.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184096935-1a680505-14fc-47ef-8862-126ef0d15708.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184096950-9fc9fa57-88b1-45d7-9b75-b49b8e4e8d70.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/185588924-4429c674-6c8e-4827-a1b1-49231aa8e3b6.mp4 (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/188598587-7ff4c4c8-c91c-4ff0-b32c-c4ab5a45db97.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/hero-21765b1aeb13badff0117580a169a45609788d7e-844x474.svg (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/index.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/meta-f47ff182b4ce89e7dd52fb5ba19e0850dd24a8fa-1692x952.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-3-kduk351qv1/imgs/184096935-1a680505-14fc-47ef-8862-126ef0d15708.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194055764-a7c4adfd-b649-4597-af10-1676b0159272.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194057994-bdf3aeca-85f8-4b06-801a-63bac39621be.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194079327-6dab2f11-a528-45f6-99f9-13db3a84cb0d.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194080275-c4bd1059-595b-40b0-b2d9-b05339dac8cc.png (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-3-kduk351qv1/imgs/hero-f7add11b063d3376bf02a64092431ac5397e82ba-844x474.svg (100%) rename apps/blog/public/{blog => }/improving-query-performance-using-indexes-3-kduk351qv1/imgs/meta-a2babe32fc26290c3dee9a6d0cb09decc68fae6a-1269x714.png (100%) rename apps/blog/public/{blog => }/introducing-auto-scaling-for-prisma-accelerate/imgs/4ffc6b8ef9456acfad56fa8a3f77bb148989afd3-1984x1132.png (100%) rename apps/blog/public/{blog => }/introducing-auto-scaling-for-prisma-accelerate/imgs/76efc2865f37348c9f7647ad34e773239eb34c12-3094x978.png (100%) rename apps/blog/public/{blog => }/introducing-auto-scaling-for-prisma-accelerate/imgs/a8231f899a60321d89f75d825fa405c6422a6e17-1820x846.png (100%) rename apps/blog/public/{blog => }/introducing-auto-scaling-for-prisma-accelerate/imgs/hero-6643cd3fa55e6b2554f2256149a7ea9e62df3258-844x474.svg (100%) rename apps/blog/public/{blog => }/introducing-auto-scaling-for-prisma-accelerate/imgs/meta-10e47c310be4f5f4dadcdf9d7c80a79bffdbd80a-1266x711.png (100%) rename apps/blog/public/{blog => }/introducing-global-omit-for-model-fields-in-prisma-orm-5-16-0/imgs/hero-88b194703cf6aa9c1e4010c7769d1ed078fce438-844x474.svg (100%) rename apps/blog/public/{blog => }/introducing-global-omit-for-model-fields-in-prisma-orm-5-16-0/imgs/meta-1325214bfbabc8d99d4e2c312dcd142ad5a550d9-1200x630.png (100%) rename apps/blog/public/{blog => }/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/AbkFWNO.png (100%) rename apps/blog/public/{blog => }/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/KMUm6rd.png (100%) rename apps/blog/public/{blog => }/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/hero-5fcd43415f21b9a4fc240fa2c5869f6b6fe2abe0-1200x630.png (100%) rename apps/blog/public/{blog => }/introducing-instant-app-deployments-in-partnership-with-vercel/imgs/hero-38b924b5e2a902a17211a9d7a9493153361dbc43-844x474.svg (100%) rename apps/blog/public/{blog => }/introducing-instant-app-deployments-in-partnership-with-vercel/imgs/meta-361d392f23fa013b8ba4f778b7727c0807fc1aca-1266x711.png (100%) rename apps/blog/public/{blog => }/introducing-platform-environments/imgs/02e32d8486dc1aea98ab63bc49ca1d233e3186b7-1800x907.png (100%) rename apps/blog/public/{blog => }/introducing-platform-environments/imgs/8678791c42ed1bcbe418c3d592f64756a2e9a2cb-1344x1029.png (100%) rename apps/blog/public/{blog => }/introducing-platform-environments/imgs/8a292af17b608eb1a80eca022984869fe9a6d0a3-1920x1080.png (100%) rename apps/blog/public/{blog => }/introducing-platform-environments/imgs/9193bd9d3c0496e3e36f00bb6800dccf89f5d651-2155x907.png (100%) rename apps/blog/public/{blog => }/introducing-platform-environments/imgs/a804b1270d904b50d3dd60d10d1e3a6cb80d6ac6-2380x907.png (100%) rename apps/blog/public/{blog => }/introducing-platform-environments/imgs/f9a5925752a6c2fc40919aa77c4c648bcba905d4-1200x305.png (100%) rename apps/blog/public/{blog => }/introducing-platform-environments/imgs/hero-aa4a9432e7742d1f7b3468e632869ef802833652-870x480.svg (100%) rename apps/blog/public/{blog => }/introducing-platform-environments/imgs/meta-5c40baf506e9ff75d2718b0a9f9906de8b417457-1800x945.png (100%) rename apps/blog/public/{blog => }/introducing-prisma-nuxt/imgs/42555908a437dac15e42224b3e7a1fbccfadd8d2-3456x2160.png (100%) rename apps/blog/public/{blog => }/introducing-prisma-nuxt/imgs/4b382494983173328bca87b9d927878808be769f-3456x2160.png (100%) rename apps/blog/public/{blog => }/introducing-prisma-nuxt/imgs/66431efa24a44146a3ca79463c0cf8a6764c9b18-3456x2160.png (100%) rename apps/blog/public/{blog => }/introducing-prisma-nuxt/imgs/hero-c442fbbddd3bf0f1894047b3e87fad73d8c4c80c-870x480.png (100%) rename apps/blog/public/{blog => }/introducing-prisma-nuxt/imgs/meta-fa5d318365caa55c59c4977b9b552b45e68c19e5-1200x631.png (100%) rename apps/blog/public/{blog => }/iopool-customer-success-story-ulscwvaqzxoa/imgs/hero-97ed1e5446a02b6a9c6be975ada9fd1d26f31173-1692x852.png (100%) rename apps/blog/public/{blog => }/iopool-customer-success-story-ulscwvaqzxoa/imgs/iopool-diagram-after.png (100%) rename apps/blog/public/{blog => }/iopool-customer-success-story-ulscwvaqzxoa/imgs/iopool-diagram-before.png (100%) rename apps/blog/public/{blog => }/iopool-customer-success-story-ulscwvaqzxoa/imgs/mWvroX_lkZI (100%) rename apps/blog/public/{blog => }/jamstack-with-nextjs-prisma-jamstackn3xt/imgs/2KmUO33.png (100%) rename apps/blog/public/{blog => }/jamstack-with-nextjs-prisma-jamstackn3xt/imgs/7cfLBlC.gif (100%) rename apps/blog/public/{blog => }/jamstack-with-nextjs-prisma-jamstackn3xt/imgs/OHfXWDh.png (100%) rename apps/blog/public/{blog => }/jamstack-with-nextjs-prisma-jamstackn3xt/imgs/QnI7OrB.png (100%) rename apps/blog/public/{blog => }/jamstack-with-nextjs-prisma-jamstackn3xt/imgs/hero-22883cd828b088978a9224cbe939e35fa9e58056-870x438.png (100%) rename apps/blog/public/{blog => }/jamstack-with-nextjs-prisma-jamstackn3xt/imgs/meta-7a8c077c90bc739fc1f24dc165998b1bdd3ae30a-1692x852.png (100%) rename apps/blog/public/{blog => }/labelbox-simnycbotiok/imgs/hero-4074c886a7303d113bad6cb6e96549dd817b8869-1200x630.png (100%) rename apps/blog/public/{blog => }/learn-typescript-a-pocketguide-tutorial-q329xmxqhujz/imgs/hero-ed0603d756c104c189e556f5a0a65cc59adde9b3-870x438.png (100%) rename apps/blog/public/{blog => }/learn-typescript-a-pocketguide-tutorial-q329xmxqhujz/imgs/meta-ea7367ba686030645338459b4feaf9733da97717-1692x852.png (100%) rename apps/blog/public/{blog => }/learn-typescript-a-pocketguide-tutorial-q329xmxqhujz/imgs/typescript-pocketguide-prisma-studio-1.png (100%) rename apps/blog/public/{blog => }/learn-typescript-a-pocketguide-tutorial-q329xmxqhujz/imgs/typescript-pocketguide-prisma-studio-2.png (100%) rename apps/blog/public/{blog => }/make-your-applications-fast-globally/imgs/5c6d845a109959a693d009e00c975f3f864b1934-800x450.gif (100%) rename apps/blog/public/{blog => }/make-your-applications-fast-globally/imgs/7722e8d6175192ca81971deffce3194c10a9d7c7-1412x1082.png (100%) rename apps/blog/public/{blog => }/make-your-applications-fast-globally/imgs/7fc10e06e94622162d4c2dd1d7b9b2c769727f2b-3206x1120.png (100%) rename apps/blog/public/{blog => }/make-your-applications-fast-globally/imgs/aec4f8712578f6cca7f95b9c9bf888968bf25f60-2888x2188.png (100%) rename apps/blog/public/{blog => }/make-your-applications-fast-globally/imgs/cf2ed1b67c2896dd4e869fb4f5f8d7dc1600d94d-1294x1676.png (100%) rename apps/blog/public/{blog => }/make-your-applications-fast-globally/imgs/d1a0428f86b58e713414612998ad51026aeea0cb-1042x948.png (100%) rename apps/blog/public/{blog => }/make-your-applications-fast-globally/imgs/hero-b39a1db6bced5d4927ad0e3215e309eaa4f944ae-844x474.svg (100%) rename apps/blog/public/{blog => }/make-your-applications-fast-globally/imgs/meta-804c14efc98c90c583f9e85df56105a3b6cb52e0-1266x711.png (100%) rename apps/blog/public/{blog => }/meetups/meetup-connect-dev-africa.png (100%) rename apps/blog/public/{blog => }/meetups/meetup-graphql.png (100%) rename apps/blog/public/{blog => }/meetups/meetup-prisma.png (100%) rename apps/blog/public/{blog => }/meetups/meetup-rust.png (100%) rename apps/blog/public/{blog => }/meetups/meetup-typescript.png (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/dashboard-grafana.gif (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/grafana-datasource-setup.gif (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/grafana-landing.png (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/hero-a497e6ffb8b0aa20963e60b3940d638c938adbf7-835x470.png (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/import-dashboard-grafana.gif (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/meta-f9d1d442f04a6301edbf164092172e4a4ea43981-1269x714.png (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/metrics-architecture.png (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/metrics-prometheus-format.png (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/prom-ui-execute-query-table.png (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/prom-ui-graph.png (100%) rename apps/blog/public/{blog => }/metrics-tutorial-prisma-pmoldgq10kz/imgs/prometheus-ui.png (100%) rename apps/blog/public/{blog => }/mongodb-general-availability-pixnun6mffmu/imgs/autocomplete.gif (100%) rename apps/blog/public/{blog => }/mongodb-general-availability-pixnun6mffmu/imgs/autocomplete.png (100%) rename apps/blog/public/{blog => }/mongodb-general-availability-pixnun6mffmu/imgs/compiler-error.png (100%) rename apps/blog/public/{blog => }/mongodb-general-availability-pixnun6mffmu/imgs/hero-d05dec22b9afb5e6e91b3a8048677f4d4021f3ac-844x474.svg (100%) rename apps/blog/public/{blog => }/mongodb-general-availability-pixnun6mffmu/imgs/issue.png (100%) rename apps/blog/public/{blog => }/mongodb-general-availability-pixnun6mffmu/imgs/launchweek.png (100%) rename apps/blog/public/{blog => }/mongodb-general-availability-pixnun6mffmu/imgs/meta-53ef0fef7dc5c54c6cee0c4cce0f47682d09cdc3-1692x882.png (100%) rename apps/blog/public/{blog => }/monitoring-best-practices-monitor5g08d0b/imgs/devops-infinity.svg (100%) rename apps/blog/public/{blog => }/monitoring-best-practices-monitor5g08d0b/imgs/hero-89513c992a1f61ae2412fbeb17417bff9504b9ff-794x380.png (100%) rename apps/blog/public/{blog => }/monitoring-best-practices-monitor5g08d0b/imgs/meta-2155fd7fac7e6abb72bd7d0a6ae53725792e0a47-1692x852.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-authentication-7d056s1s0k3l/imgs/401-GET-users.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-authentication-7d056s1s0k3l/imgs/auth-login-endpoint.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-authentication-7d056s1s0k3l/imgs/auth-workflow-swagger.gif (100%) rename apps/blog/public/{blog => }/nestjs-prisma-authentication-7d056s1s0k3l/imgs/hero-7c1df9404c5bc6f5047c3e3ba1972005f90ea2bb-843x474.svg (100%) rename apps/blog/public/{blog => }/nestjs-prisma-authentication-7d056s1s0k3l/imgs/locked-endpoints.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-authentication-7d056s1s0k3l/imgs/meta-425dd76be3dd7fa36e7051613296031be0344159-1920x1080.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-error-handling-7d056s1koop2/imgs/article-not-exist-404.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-error-handling-7d056s1koop2/imgs/hero-c86e8991069ead629ccc386f69880911bbb014c8-844x474.svg (100%) rename apps/blog/public/{blog => }/nestjs-prisma-error-handling-7d056s1koop2/imgs/meta-61137d012c97c0dc9c0a72557fe3a277a11700a4-1272x716.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-relational-data-7d056s1koabc/imgs/hero-2d5ec1b2f38575e64a7ae28b6915e68d77e197f2-1920x1080.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-relational-data-7d056s1koabc/imgs/password-omitted-get-articles.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-relational-data-7d056s1koabc/imgs/password-omitted.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-relational-data-7d056s1koabc/imgs/password-revealed-get-articles.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-relational-data-7d056s1koabc/imgs/password-revealed.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-relational-data-7d056s1koabc/imgs/users-crud-1.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-relational-data-7d056s1koabc/imgs/users-crud-2.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-rest-api-7d056s1bmol0/imgs/articles-crud-1.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-rest-api-7d056s1bmol0/imgs/articles-endpoints-grouped.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-rest-api-7d056s1bmol0/imgs/create-article-dto.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-rest-api-7d056s1bmol0/imgs/final-app.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-rest-api-7d056s1bmol0/imgs/hero-4bb8a42e7fe028072f5e7d90b2eff2435ad6dabb-844x474.svg (100%) rename apps/blog/public/{blog => }/nestjs-prisma-rest-api-7d056s1bmol0/imgs/response-types.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-rest-api-7d056s1bmol0/imgs/swagger-findall.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-rest-api-7d056s1bmol0/imgs/swagger-findone.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-rest-api-7d056s1bmol0/imgs/swagger-ui.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-validation-7d056s1kola1/imgs/hero-adc0af7eb5b3f3e751cd795ba7e184ce98a3ed81-844x474.svg (100%) rename apps/blog/public/{blog => }/nestjs-prisma-validation-7d056s1kola1/imgs/id-string.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-validation-7d056s1kola1/imgs/inject-dates.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-validation-7d056s1kola1/imgs/invalid-args-specific.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-validation-7d056s1kola1/imgs/invalid-args.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-validation-7d056s1kola1/imgs/meta-c114050a8b7a4eacbd9270a105ff912a0e91eec5-1272x716.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-validation-7d056s1kola1/imgs/valid-args.png (100%) rename apps/blog/public/{blog => }/nestjs-prisma-validation-7d056s1kola1/imgs/validation-error.png (100%) rename apps/blog/public/{blog => }/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0*c56E4V22_pl88Si4.gif (100%) rename apps/blog/public/{blog => }/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/0*zy8sNGj9yqANZhrw.png (100%) rename apps/blog/public/{blog => }/new-tooling-to-improve-your-graphql-workflows-7240c81e1ba3/imgs/hero-a61300c6ae647f6e566843a176ed58109da8e65c-900x509.png (100%) rename apps/blog/public/{blog => }/operations-based-billing/imgs/hero-1d997b49de7986be043f844425adc9214c468725-844x474.svg (100%) rename apps/blog/public/{blog => }/operations-based-billing/imgs/meta-3354519625f3caa95164b69d5b9418abd3b99059-1266x711.png (100%) rename apps/blog/public/{blog => }/optimize-now-generally-available/imgs/3e399b441533267eb607869ff0be34162b175b23-1816x586.gif (100%) rename apps/blog/public/{blog => }/optimize-now-generally-available/imgs/67916e1c4522a8994edaf4b75c47030b50f3ee4e-1497x644.png (100%) rename apps/blog/public/{blog => }/optimize-now-generally-available/imgs/8a49d78ed717ef163ffb6927acc80362c00e1055-754x706.gif (100%) rename apps/blog/public/{blog => }/optimize-now-generally-available/imgs/a36715bc4afcf3eddde3815636ed7a1ed012c7d5-1497x490.png (100%) rename apps/blog/public/{blog => }/optimize-now-generally-available/imgs/hero-a2d1af619fb547bcc995ef12e208107bffafc97f-844x474.svg (100%) rename apps/blog/public/{blog => }/optimize-now-generally-available/imgs/meta-7777dfc9a1c095451e0779fe28db8d2bcf7b0da9-1266x711.png (100%) rename apps/blog/public/{blog => }/optimizing-postgres-for-global-apps/imgs/a1acd9147d4e1ffc6b0284fc578538ab7fbc541e-1269x1660.png (100%) rename apps/blog/public/{blog => }/optimizing-postgres-for-global-apps/imgs/df130688a802da5bd87e58fd82ef867d28fd8a82-1269x1660.png (100%) rename apps/blog/public/{blog => }/optimizing-postgres-for-global-apps/imgs/e003a199c4bfcfff090449148d3185d331d5a113-1269x1660.png (100%) rename apps/blog/public/{blog => }/optimizing-postgres-for-global-apps/imgs/hero-8633a2e3d0da7dccae76ab2597e841ac444cbe7a-844x474.svg (100%) rename apps/blog/public/{blog => }/optimizing-postgres-for-global-apps/imgs/meta-2d60d46aec9dc44a8e90072330ce14346817df5b-1266x711.png (100%) rename apps/blog/public/{blog => }/organize-your-prisma-schema-with-multi-file-support/imgs/55b449e46a7d01963d4c7a3fdd3bb921b8c4619f-2908x2064.png (100%) rename apps/blog/public/{blog => }/organize-your-prisma-schema-with-multi-file-support/imgs/hero-5df6e670b8b37555a5d3caf40521722d9613b705-844x474.svg (100%) rename apps/blog/public/{blog => }/organize-your-prisma-schema-with-multi-file-support/imgs/meta-26e729ad6c2082d921722ad482ef83992eb66f5f-1266x711.png (100%) rename apps/blog/public/{blog => }/orm-6-10-0-new-features-for-prisma-postgres-remote-mcp-and-more/imgs/59abb90b65ee033198e4754d302c19eea1f42062-708x480.gif (100%) rename apps/blog/public/{blog => }/orm-6-10-0-new-features-for-prisma-postgres-remote-mcp-and-more/imgs/6f5fffc8528e9d079196ecbeca717908e0faba73-1212x720.gif (100%) rename apps/blog/public/{blog => }/orm-6-10-0-new-features-for-prisma-postgres-remote-mcp-and-more/imgs/c4941d4eff2b944aa41f4f8ac93463f16b710cb6-2048x854.png (100%) rename apps/blog/public/{blog => }/orm-6-10-0-new-features-for-prisma-postgres-remote-mcp-and-more/imgs/f9417895411f1eebbc63ef25c20e7d89a6ff20e8-712x480.gif (100%) rename apps/blog/public/{blog => }/orm-6-10-0-new-features-for-prisma-postgres-remote-mcp-and-more/imgs/hero-9eceabc4fd8dbe61ef0dc42bad3d44c0a002efcf-844x474.svg (100%) rename apps/blog/public/{blog => }/orm-6-10-0-new-features-for-prisma-postgres-remote-mcp-and-more/imgs/meta-de9f763ec9416315426528e9b4bc429a2708acbb-1266x711.png (100%) rename apps/blog/public/{blog => }/orm-6-12-0-esm-compatible-generator-in-preview-and-new-options-for-prisma-config/imgs/45bd4d06a3dcc685e428b6b08df4a8c3fbadcae8-2560x1664.png (100%) rename apps/blog/public/{blog => }/orm-6-12-0-esm-compatible-generator-in-preview-and-new-options-for-prisma-config/imgs/hero-59d3944084b95fb426e8f670cd3ee12ec2b6ef0e-844x474.svg (100%) rename apps/blog/public/{blog => }/orm-6-12-0-esm-compatible-generator-in-preview-and-new-options-for-prisma-config/imgs/meta-dcedaa0abf8db7a6e8f8fa30b3a2493752251653-1266x711.png (100%) rename apps/blog/public/{blog => }/orm-6-13-0-ci-cd-workflows-and-pgvector-for-prisma-postgres/imgs/a3438ae7d08cb86d8ac9db19dc2ad2ac4edf2c4c-3070x1866.png (100%) rename apps/blog/public/{blog => }/orm-6-13-0-ci-cd-workflows-and-pgvector-for-prisma-postgres/imgs/bd1a52263c6e36773fe0c4b003a81298d7f175f4-800x450.gif (100%) rename apps/blog/public/{blog => }/orm-6-13-0-ci-cd-workflows-and-pgvector-for-prisma-postgres/imgs/d08557fd614a1bcf64b7c3f55bd81d799443f426-2040x1618.png (100%) rename apps/blog/public/{blog => }/orm-6-13-0-ci-cd-workflows-and-pgvector-for-prisma-postgres/imgs/hero-bf92270c0f00a0ec6345ee27d0f6eba08a3a79a5-844x474.svg (100%) rename apps/blog/public/{blog => }/orm-6-13-0-ci-cd-workflows-and-pgvector-for-prisma-postgres/imgs/meta-a34efcbd2a80c31abeee44c4c8da5452619d93c4-1266x711.png (100%) rename apps/blog/public/{blog => }/orm-6-15-0-ai-safety-guardrails-for-destructive-commands-and-more/imgs/6e96adf6edf9a2019424eba3ab11054927abc353-1668x1080.gif (100%) rename apps/blog/public/{blog => }/orm-6-15-0-ai-safety-guardrails-for-destructive-commands-and-more/imgs/9a99ba8aa9c6b70479608f1693544eb1159acf22-1404x1080.gif (100%) rename apps/blog/public/{blog => }/orm-6-15-0-ai-safety-guardrails-for-destructive-commands-and-more/imgs/hero-405ae53feaf2033d74021e5007c20467a7d1069c-844x474.svg (100%) rename apps/blog/public/{blog => }/orm-6-15-0-ai-safety-guardrails-for-destructive-commands-and-more/imgs/meta-5f2a233de0328436ce4a9b015a641f91c80610a3-1266x711.png (100%) rename apps/blog/public/{blog => }/orm-v6-11-0-embedded-prisma-studio-rust-free-orm-for-mysql-in-preview-and-more/imgs/9ef5f02aad029c18e343816c7906ac2ce1dab223-1088x1080.gif (100%) rename apps/blog/public/{blog => }/orm-v6-11-0-embedded-prisma-studio-rust-free-orm-for-mysql-in-preview-and-more/imgs/d2c35b8243dd6f86ff9a353d5bb64ad79510920f-2836x981.png (100%) rename apps/blog/public/{blog => }/orm-v6-11-0-embedded-prisma-studio-rust-free-orm-for-mysql-in-preview-and-more/imgs/hero-3fe13fbc2fb282c40babce1bbdd9090f848862d9-844x474.svg (100%) rename apps/blog/public/{blog => }/orm-v6-11-0-embedded-prisma-studio-rust-free-orm-for-mysql-in-preview-and-more/imgs/meta-f3f4386ecb62981d836ac001e9ad7d7bf3983817-1266x711.png (100%) rename apps/blog/public/{blog => }/orm-v6-17-0-new-usage-metrics-and-direct-connections-in-ga-for-prisma-postgres/imgs/1b4d23d5d2d93055fe604b9767ae70064dd6b041-2470x1030.png (100%) rename apps/blog/public/{blog => }/orm-v6-17-0-new-usage-metrics-and-direct-connections-in-ga-for-prisma-postgres/imgs/e3899399a9d59b64fbedee79607fc34819eced5a-2560x1664.png (100%) rename apps/blog/public/{blog => }/orm-v6-17-0-new-usage-metrics-and-direct-connections-in-ga-for-prisma-postgres/imgs/hero-b0ff1e8edfc2f3b242e88d1e7e9c068a4b4b50dc-844x474.svg (100%) rename apps/blog/public/{blog => }/orm-v6-17-0-new-usage-metrics-and-direct-connections-in-ga-for-prisma-postgres/imgs/meta-a3ea67dcf14e1e36633f24ff1630949e82d6552e-1266x711.png (100%) rename apps/blog/public/{blog => }/overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw/imgs/connection_pooling.png (100%) rename apps/blog/public/{blog => }/overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw/imgs/distributed_db.png (100%) rename apps/blog/public/{blog => }/overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw/imgs/hero-bb568fc69c26ec5a3d262e4e598ea35dd95aa7b0-844x474.svg (100%) rename apps/blog/public/{blog => }/overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw/imgs/meta-1547411ba0da83db1dd2d474906b3c9b36a0be05-1267x711.png (100%) rename apps/blog/public/{blog => }/overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw/imgs/with_cdn.png (100%) rename apps/blog/public/{blog => }/overcoming-challenges-in-serverless-and-edge-environments-tqtona0rvxuw/imgs/without_cdn.png (100%) rename apps/blog/public/{blog => }/panther-customer-story-pdmdrrhtupsl/imgs/hero-c5d900fa6ca968fa3166f7d9faff39ee6df0fc04-846x426.svg (100%) rename apps/blog/public/{blog => }/panther-customer-story-pdmdrrhtupsl/imgs/meta-5eae06d23538e0fc1c0ce19cd2f7d370baf9ba67-1692x852.png (100%) rename apps/blog/public/{blog => }/pearly-plan-customer-success-pdmdrrhtupve/imgs/hero-865b17cd27fdb1bc38c55016a41fd23b3ea650a0-870x439.svg (100%) rename apps/blog/public/{blog => }/pearly-plan-customer-success-pdmdrrhtupve/imgs/meta-d09ee96143ce418b222844b771f5b3ffcff456f4-1692x852.png (100%) rename apps/blog/public/{blog => }/pearly-plan-customer-success-pdmdrrhtupve/imgs/pearly_diagram.png (100%) rename apps/blog/public/{blog => }/performance-benchmarks-comparing-query-latency-across-typescript-orms-and-databases/imgs/0abee36ea23b4732a1336441c6ac188b7c96b083-1860x1328.png (100%) rename apps/blog/public/{blog => }/performance-benchmarks-comparing-query-latency-across-typescript-orms-and-databases/imgs/3eb0355a3c39bcff18fa1f28aa299cbe103cd751-2531x1279.png (100%) rename apps/blog/public/{blog => }/performance-benchmarks-comparing-query-latency-across-typescript-orms-and-databases/imgs/68f3f4cb6645376e0536cbbfc973907a645a969d-1610x330.png (100%) rename apps/blog/public/{blog => }/performance-benchmarks-comparing-query-latency-across-typescript-orms-and-databases/imgs/aa05ff2c32e785fdf6a3806c3d70065d99291e85-1438x176.png (100%) rename apps/blog/public/{blog => }/performance-benchmarks-comparing-query-latency-across-typescript-orms-and-databases/imgs/bbefa219618cb27033af1542b275a88d943e44f6-2614x1884.png (100%) rename apps/blog/public/{blog => }/performance-benchmarks-comparing-query-latency-across-typescript-orms-and-databases/imgs/hero-4b8219d8c090b4183d9b4d7d70e6e4bd30f2933d-844x474.png (100%) rename apps/blog/public/{blog => }/performance-benchmarks-comparing-query-latency-across-typescript-orms-and-databases/imgs/meta-1e353482cde67f1567e51f2a62e6c4129b120822-1688x948.png (100%) rename apps/blog/public/{blog => }/performance-engineering-aeduv0rei0jk/imgs/fLCuthZ.png (100%) rename apps/blog/public/{blog => }/performance-engineering-aeduv0rei0jk/imgs/hero-e43f947aa769d0709b8e4af281e447028c0ec23e-1200x630.png (100%) rename apps/blog/public/{blog => }/poppy-customer-success-story-swnwqcgrrvpd/imgs/hero-e88c5bf7940e203a79d806c2f7ab3ff3d177b7ee-1692x852.png (100%) rename apps/blog/public/{blog => }/poppy-customer-success-story-swnwqcgrrvpd/imgs/poppy-diagram.png (100%) rename apps/blog/public/{blog => }/poppy-customer-success-story-swnwqcgrrvpd/imgs/vJyrhA4.png (100%) create mode 100644 apps/blog/public/posts/read-replicas-extension/connect-replica.png create mode 100644 apps/blog/public/posts/read-replicas-extension/create-replica.png create mode 100644 apps/blog/public/posts/read-replicas-extension/neon.png create mode 100644 apps/blog/public/posts/read-replicas-extension/reads.png create mode 100644 apps/blog/public/posts/read-replicas-extension/writes.png rename apps/blog/public/{blog => }/prisma-2-beta-b7bcl0gd8d8e/imgs/83djlkl.png (100%) rename apps/blog/public/{blog => }/prisma-2-beta-b7bcl0gd8d8e/imgs/hero-28cf1f43bc68b6f46097c6f654a0e77dfbf643ca-870x457.png (100%) rename apps/blog/public/{blog => }/prisma-2-beta-b7bcl0gd8d8e/imgs/meta-ef78167b288b460b14a81e0364434fc5c0caa204-1688x886.png (100%) rename apps/blog/public/{blog => }/prisma-5-f66prwkjx72s/imgs/after-schema-builder.png (100%) rename apps/blog/public/{blog => }/prisma-5-f66prwkjx72s/imgs/before.png (100%) rename apps/blog/public/{blog => }/prisma-5-f66prwkjx72s/imgs/hero-4d31da0f724c13e75aae400cb385bbd1da5f23e2-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-5-f66prwkjx72s/imgs/json-protocol.png (100%) rename apps/blog/public/{blog => }/prisma-5-f66prwkjx72s/imgs/meta-a667db7e2c4cdc8b7bb1b5cde2903a0d0e78fe4a-1266x712.png (100%) rename apps/blog/public/{blog => }/prisma-5-f66prwkjx72s/imgs/prisma-5-upgrade.png (100%) rename apps/blog/public/{blog => }/prisma-5-f66prwkjx72s/imgs/prisma-5-zoom-in.png (100%) rename apps/blog/public/{blog => }/prisma-6-8-0-release/imgs/65fe5d7ad676993c99bb97a938d501887f8cc957-800x450.gif (100%) rename apps/blog/public/{blog => }/prisma-6-8-0-release/imgs/a7feebd273dadac60fbfc8dfd95fddd83fd28411-800x785.gif (100%) rename apps/blog/public/{blog => }/prisma-6-8-0-release/imgs/hero-b3ae90f7c076b2606757271bab4e04cffe8bb03d-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-6-8-0-release/imgs/meta-ad55ab4fb3e73f6d3379697f1082600814e40c89-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-6-9-0-release/imgs/11bbf684b79e48e6d1e838f04d9c3908c14f8373-2470x1030.png (100%) rename apps/blog/public/{blog => }/prisma-6-9-0-release/imgs/1c1347e1e24b43ebe2bc1134b8a6fe4ce1bc20b6-3304x1216.png (100%) rename apps/blog/public/{blog => }/prisma-6-9-0-release/imgs/f7a4f862f7f12d96c98eafef1b6bf0f2d0cac943-3740x1964.png (100%) rename apps/blog/public/{blog => }/prisma-6-9-0-release/imgs/hero-b471bc0c613d1100e7f62c052743300a08093d24-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-6-9-0-release/imgs/meta-e89ea5cb6384d5ad92e1611a0ad373aa368018b0-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-6-better-performance-more-flexibility-and-type-safe-sql/imgs/cdc1687a8bc84dd978cd3e2270618719a6da7207-1920x1080.png (100%) rename apps/blog/public/{blog => }/prisma-6-better-performance-more-flexibility-and-type-safe-sql/imgs/hero-1613e4843bb6239ae9f0e74962909b219dfafbc8-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-6-better-performance-more-flexibility-and-type-safe-sql/imgs/meta-0bbe2e336e0bd55cb08133c81dc5cf297137b893-1200x630.png (100%) rename apps/blog/public/{blog => }/prisma-7-performance-benchmarks/imgs/8e23ebd4a6fa44c1c91bb28ae9e0cd07240414bb-1920x1080.png (100%) rename apps/blog/public/{blog => }/prisma-7-performance-benchmarks/imgs/hero-874c8984ae9b30a1245becadea327ddf82784916-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-7-performance-benchmarks/imgs/meta-676ac79538b53ce030818a157ac592f29650e651-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-adopts-semver-strictly/imgs/hero-28e6751ef493d53d0decd3aa5c631c0214c2d578-1692x852.png (100%) rename apps/blog/public/{blog => }/prisma-and-graphql-mfl5y2r7t49c/imgs/Cyyt5un.png (100%) rename apps/blog/public/{blog => }/prisma-and-graphql-mfl5y2r7t49c/imgs/Felin65.png (100%) rename apps/blog/public/{blog => }/prisma-and-graphql-mfl5y2r7t49c/imgs/I9D33PU.png (100%) rename apps/blog/public/{blog => }/prisma-and-graphql-mfl5y2r7t49c/imgs/NS0YFih.png (100%) rename apps/blog/public/{blog => }/prisma-and-graphql-mfl5y2r7t49c/imgs/hero-a170d7e275c2b415bc159d86a7a0eacf7b92acef-870x457.png (100%) rename apps/blog/public/{blog => }/prisma-and-graphql-mfl5y2r7t49c/imgs/meta-fa8e2859efa37829166cc290e4913124ad4a99a0-1200x630.png (100%) rename apps/blog/public/{blog => }/prisma-and-graphql-mfl5y2r7t49c/imgs/wDONhZ6.png (100%) rename apps/blog/public/{blog => }/prisma-and-graphql-mfl5y2r7t49c/imgs/ykahwzh.png (100%) rename apps/blog/public/{blog => }/prisma-and-serverless-73hbgknz6t/imgs/after-json.png (100%) rename apps/blog/public/{blog => }/prisma-and-serverless-73hbgknz6t/imgs/after-same-region.png (100%) rename apps/blog/public/{blog => }/prisma-and-serverless-73hbgknz6t/imgs/after-schema-builder.png (100%) rename apps/blog/public/{blog => }/prisma-and-serverless-73hbgknz6t/imgs/before.png (100%) rename apps/blog/public/{blog => }/prisma-and-serverless-73hbgknz6t/imgs/db-near-server.png (100%) rename apps/blog/public/{blog => }/prisma-and-serverless-73hbgknz6t/imgs/hero-e70e892329074189eda737c807804fda0b018a05-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-and-serverless-73hbgknz6t/imgs/meta-73248ed5f8354b102c538279eae67bb1bb601991-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-and-serverless-73hbgknz6t/imgs/proof.png (100%) rename apps/blog/public/{blog => }/prisma-and-serverless-73hbgknz6t/imgs/serhii.png (100%) rename apps/blog/public/{blog => }/prisma-and-serverless-73hbgknz6t/imgs/tls-comparison.png (100%) rename apps/blog/public/{blog => }/prisma-client-preview-ahph4o1umail/imgs/OyIQQxF.png (100%) rename apps/blog/public/{blog => }/prisma-client-preview-ahph4o1umail/imgs/hero-5f01c71f75711647bda65187ba3679acd63a63da-1200x630.png (100%) rename apps/blog/public/{blog => }/prisma-data-platform-now-generally-available-8d058s1bqol1/imgs/add-filter-prisma-data.png (100%) rename apps/blog/public/{blog => }/prisma-data-platform-now-generally-available-8d058s1bqol1/imgs/data-proxy-performance.png (100%) rename apps/blog/public/{blog => }/prisma-data-platform-now-generally-available-8d058s1bqol1/imgs/explore-prisma-data-model.png (100%) rename apps/blog/public/{blog => }/prisma-data-platform-now-generally-available-8d058s1bqol1/imgs/hero-4d76a71d16231a1a3c1958c52182a480a8e5f8f7-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-data-platform-now-generally-available-8d058s1bqol1/imgs/meta-ffc4c14399a711f25503a0a7af6f077b4ad57d2d-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-data-platform-now-generally-available-8d058s1bqol1/imgs/online-query-console.png (100%) rename apps/blog/public/{blog => }/prisma-data-platform-now-generally-available-8d058s1bqol1/imgs/prisma-github-synch.png (100%) rename apps/blog/public/{blog => }/prisma-data-proxy-xb16ba0p21/imgs/6GJ9C84.png (100%) rename apps/blog/public/{blog => }/prisma-data-proxy-xb16ba0p21/imgs/9OuYJ08.png (100%) rename apps/blog/public/{blog => }/prisma-data-proxy-xb16ba0p21/imgs/hero-bb301a00397c84e302d829b963462d00950d326e-870x455.png (100%) rename apps/blog/public/{blog => }/prisma-data-proxy-xb16ba0p21/imgs/meta-3fc1d1f448cde60bd38e28c64d061ce7fb171f81-2400x1254.png (100%) rename apps/blog/public/{blog => }/prisma-day-2022-announcement-v8t178dsf/imgs/hero-1a5bae00df77e3b700cef6601a86c94a9e1de572-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-day-2022-announcement-v8t178dsf/imgs/joinusforprismaday.png (100%) rename apps/blog/public/{blog => }/prisma-day-2022-announcement-v8t178dsf/imgs/meta-fcbc836a3c01592b7833e91a41e62b29fbfc9adf-2538x1272.png (100%) rename apps/blog/public/{blog => }/prisma-day-2022-announcement-v8t178dsf/imgs/sommergarten.jpg (100%) rename apps/blog/public/{blog => }/prisma-foss-fund-announcement-xw9dqi1hc24l/imgs/hero-1ece57b620fcf829b794355791d859059f7beb0b-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-foss-fund-announcement-xw9dqi1hc24l/imgs/meta-ab8f92c96761d5632f2170265bd9c63167d3f978-1268x721.png (100%) rename apps/blog/public/{blog => }/prisma-insider-program/imgs/hero-f876d2b949495eb13c451c52414fd1119f0be213-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-insider-program/imgs/meta-587a4d7eeb559a4bdeb64d945c8abd1d2aa965e0-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-microsoft-sql-server-azure-sql-production-ga/imgs/hero-89857b3836a02963a6943bf9903eadb7f467452b-846x426.png (100%) rename apps/blog/public/{blog => }/prisma-microsoft-sql-server-azure-sql-production-ga/imgs/meta-897cff06aed6d6ab31ad6dea86c04ba77a03f0ed-1252x630.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-dx-primitives/imgs/diff-execute-db.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-dx-primitives/imgs/diff-history-db.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-dx-primitives/imgs/hero-e6a865656b510a2942651367168029c0be4b650c-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-migrate-dx-primitives/imgs/meta-b291800991f4a03d10765a87a3fbc6d0e036564c-1270x639.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-ga-b5eno5g08d0b/imgs/2020-12-migrate-development-workflow.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-ga-b5eno5g08d0b/imgs/2020-12-migrate-production-workflow.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-ga-b5eno5g08d0b/imgs/2021-03-migrate-source-of-truth.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-ga-b5eno5g08d0b/imgs/hero-32d0c4e15bdc25944dcbcfbe7064746f94cef116-1692x852.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-ga-b5eno5g08d0b/imgs/meta-434780a05dbd2e625fda9fe791c5ad5952bda69d-2400x1256.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-preview-b5eno5g08d0b/imgs/2020-12-migrate-development-workflow.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-preview-b5eno5g08d0b/imgs/2020-12-migrate-production-workflow.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-preview-b5eno5g08d0b/imgs/hero-f5df6cdfa8c8cca04b7efca43a15f111cb1789b7-1692x852.png (100%) rename apps/blog/public/{blog => }/prisma-migrate-preview-b5eno5g08d0b/imgs/meta-8cce83b629d0e1fe925d32bdf2a73f80d4c4bc9f-1200x628.png (100%) rename apps/blog/public/{blog => }/prisma-mongodb-preview-release/imgs/hero-0ba86c703ae4de5651fe3afa7a2a181b0cacdb24-865x436.svg (100%) rename apps/blog/public/{blog => }/prisma-mongodb-preview-release/imgs/meta-60df4c09d5d1951a4fc6425644d652161e5aa9a1-1269x640.png (100%) rename apps/blog/public/{blog => }/prisma-online-data-browser-ejgg5c8p3u4x/imgs/HlKu4FD.png (100%) rename apps/blog/public/{blog => }/prisma-online-data-browser-ejgg5c8p3u4x/imgs/Pb0Y4bu.png (100%) rename apps/blog/public/{blog => }/prisma-online-data-browser-ejgg5c8p3u4x/imgs/REM9mBY.png (100%) rename apps/blog/public/{blog => }/prisma-online-data-browser-ejgg5c8p3u4x/imgs/hero-fe681554d217f3015ae0203b3b01a4830f6ca327-1692x852.png (100%) rename apps/blog/public/{blog => }/prisma-online-data-browser-ejgg5c8p3u4x/imgs/yZen8Js.png (100%) rename apps/blog/public/{blog => }/prisma-optimize-early-access/imgs/hero-4d64d1524a5186d98e489b0aa2d0b884ceff3ef0-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-optimize-early-access/imgs/meta-a56f096666836c7d8e6671d0b4e910c1a0c2cb62-1200x630.png (100%) rename apps/blog/public/{blog => }/prisma-orm-6-6-0-esm-support-d1-migrations-and-prisma-mcp-server/imgs/hero-836040fb8ba1449adfeb3b608ae710d2bd2d6449-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-orm-6-6-0-esm-support-d1-migrations-and-prisma-mcp-server/imgs/meta-5f4d224e4d334fff70c4eadb8b2cbef237acd3ba-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-orm-manifesto/imgs/hero-39eefe70bf535b97c35ecbc14b17c382ccb1644c-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-orm-manifesto/imgs/meta-0b66108483565f432dc3f83253879dc12818ab99-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview/imgs/0d275322775fddbf52e1e3e95cfabaaa9bafd778-874x798.png (100%) rename apps/blog/public/{blog => }/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview/imgs/7273f2beaf20bbf771e47bb7b542b3c21c31e19c-800x653.svg (100%) rename apps/blog/public/{blog => }/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview/imgs/87f24086f41106526cd3e6178ef56e71682d5855-1600x1140.svg (100%) rename apps/blog/public/{blog => }/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview/imgs/9956ed7492bd6dc77e75c9f2df3db0f2aae902cd-3200x1256.png (100%) rename apps/blog/public/{blog => }/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview/imgs/c39d9673195c2414f9ca2be1cedcb0229fa58188-1154x652.png (100%) rename apps/blog/public/{blog => }/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview/imgs/c6bf66d1ff9bac1bc0543020819db31da69ba26a-946x324.png (100%) rename apps/blog/public/{blog => }/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview/imgs/c7adac832f583577880d8f6d308c7446c9d5f27c-3200x2280.png (100%) rename apps/blog/public/{blog => }/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview/imgs/de503bc689a9489f6d97c0151adda8f98fd910bb-3200x2390.png (100%) rename apps/blog/public/{blog => }/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview/imgs/hero-cb8e59a2cadf127ac984a9913e7742e59a169fc1-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview/imgs/meta-0fff8d25a4c84741b32994979eb8ff448d60d4fe-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-orm-support-for-edge-functions-is-now-in-preview/imgs/4a84546e5ae706f5a2a15e67a4757260d14b1273-2532x1210.png (100%) rename apps/blog/public/{blog => }/prisma-orm-support-for-edge-functions-is-now-in-preview/imgs/4b2cd3e2d1da28a2f29ced7d34f75ac7bbd08f94-2532x1210.png (100%) rename apps/blog/public/{blog => }/prisma-orm-support-for-edge-functions-is-now-in-preview/imgs/b67a096af36af4026cd5c6b36b34a7693d0f2ce1-2532x1210.png (100%) rename apps/blog/public/{blog => }/prisma-orm-support-for-edge-functions-is-now-in-preview/imgs/cdc1687a8bc84dd978cd3e2270618719a6da7207-1920x1080.png (100%) rename apps/blog/public/{blog => }/prisma-orm-support-for-edge-functions-is-now-in-preview/imgs/hero-d5c2d5f06095314aeceda56c7bd867e5859e468f-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-orm-support-for-edge-functions-is-now-in-preview/imgs/meta-937f91566465c5ea1d23ce3f243d06a14f138693-2000x1123.png (100%) rename apps/blog/public/{blog => }/prisma-orm-v6-14-0-relationships-for-sql-views-more-robust-management-api-and-more/imgs/hero-72c1a4cbd495ed6f219e870b19056a529c5e03c7-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-orm-v6-14-0-relationships-for-sql-views-more-robust-management-api-and-more/imgs/meta-20e5d5b2879055d3aba22acf59aaa6c37933050a-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-orm-without-rust-latest-performance-benchmarks/imgs/hero-be74183d9d749c0b17c850334f376711d8a44d22-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-orm-without-rust-latest-performance-benchmarks/imgs/meta-8d83e1420faca85afbc7a1cf78f660374577d3f3-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-postgres-free-during-early-access/imgs/hero-c87f24556cf1217e813a4a9a08c62d7917484283-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-postgres-free-during-early-access/imgs/meta-d6dcf60dd017e2368e87d826024499f7211d4ded-1200x630.png (100%) rename apps/blog/public/{blog => }/prisma-postgres-now-in-your-favorite-environment/imgs/925efe76c055402c5dcff3bd650bd91e287083ce-2144x1566.png (100%) rename apps/blog/public/{blog => }/prisma-postgres-now-in-your-favorite-environment/imgs/d39abb4b2e5959a8e70182600426eac14ab80aee-2556x2180.png (100%) rename apps/blog/public/{blog => }/prisma-postgres-now-in-your-favorite-environment/imgs/hero-cd58c3a37787f4b995d9fad1134e4f51e697175d-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-postgres-now-in-your-favorite-environment/imgs/meta-12d6d371f827870b3696b4175ace7b5f387987e0-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-postgres-the-future-of-serverless-databases/imgs/171f49afc3bcf478194356709a65fee196225381-2314x1220.png (100%) rename apps/blog/public/{blog => }/prisma-postgres-the-future-of-serverless-databases/imgs/542523ef4a619afc3ce8475550c08c8bbc6c8551-1850x678.png (100%) rename apps/blog/public/{blog => }/prisma-postgres-the-future-of-serverless-databases/imgs/90776da4721482b7372b74a8ace42afe009d86d2-1610x886.png (100%) rename apps/blog/public/{blog => }/prisma-postgres-the-future-of-serverless-databases/imgs/d7a8980c3be1841af6c46fee0683b93179052358-1114x592.png (100%) rename apps/blog/public/{blog => }/prisma-postgres-the-future-of-serverless-databases/imgs/hero-8c5b6c03a60ac2704f65689abf686ff4adfd6e67-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-postgres-the-future-of-serverless-databases/imgs/meta-53a4a10eec49b801af6538901c44b870e7d83404-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-preview-cockroach-db-release/imgs/hero-ebf53ec190dab44f271d4f0dd1ad658507f55b66-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-preview-cockroach-db-release/imgs/meta-77148d314c74789939fb2b2af2bf3f82378cebc0-1920x1080.png (100%) rename apps/blog/public/{blog => }/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/imgs/1*MmTqUD1_jQtNRxsMhyQyDg@2x.png (100%) rename apps/blog/public/{blog => }/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/imgs/3VzVxCe.png (100%) rename apps/blog/public/{blog => }/prisma-raises-4-5m-to-build-the-graphql-data-layer-for-all-databases-663484df0f60/imgs/hero-73c2e03277f2cceb9f6cc435356d4a7ab822ed5b-1200x630.png (100%) rename apps/blog/public/{blog => }/prisma-raises-series-a-saks1zr7kip6/imgs/4YPWyaW.png (100%) rename apps/blog/public/{blog => }/prisma-raises-series-a-saks1zr7kip6/imgs/Fc7BweP.png (100%) rename apps/blog/public/{blog => }/prisma-raises-series-a-saks1zr7kip6/imgs/Hb9VOWN.png (100%) rename apps/blog/public/{blog => }/prisma-raises-series-a-saks1zr7kip6/imgs/PQSljF7.png (100%) rename apps/blog/public/{blog => }/prisma-raises-series-a-saks1zr7kip6/imgs/WwMdROo.png (100%) rename apps/blog/public/{blog => }/prisma-raises-series-a-saks1zr7kip6/imgs/kuwS06d.png (100%) rename apps/blog/public/{blog => }/prisma-raises-series-a-saks1zr7kip6/imgs/meta-c3234082c86092e77a0b0a840c32a3c9a44f3754-1252x630.png (100%) rename apps/blog/public/{blog => }/prisma-schema-language-the-best-way-to-define-your-data/imgs/1abc90c07bb139f52510e6f5175cb3437ef8385f-1170x1176.png (100%) rename apps/blog/public/{blog => }/prisma-schema-language-the-best-way-to-define-your-data/imgs/bb921b685f6e432b7090fdebf7c4c096b4e4802b-1034x592.png (100%) rename apps/blog/public/{blog => }/prisma-schema-language-the-best-way-to-define-your-data/imgs/hero-efd7f9391222815cdf5c0bb4d17f05ad6b649f70-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-schema-language-the-best-way-to-define-your-data/imgs/meta-1da35c49cd47b8676c043fdaf86754f6c724f31e-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-sql-server-support-preview-a4anl2gd8d3a/imgs/hero-a14944906d95712a04317e2c17e35cef35fac770-846x426.png (100%) rename apps/blog/public/{blog => }/prisma-startup-program/imgs/hero-8e11313115c9b81a2482973c2046e817f6a0b101-844x474.svg (100%) rename apps/blog/public/{blog => }/prisma-startup-program/imgs/meta-63addacd981bca37aca44f2cb8e46109fb7f00ce-1266x711.png (100%) rename apps/blog/public/{blog => }/prisma-studio-3rtf78dg99fe/imgs/hero-cdf9e7b1b90248dde0b35f13b0f30afdf859edeb-870x439.svg (100%) rename apps/blog/public/{blog => }/prisma-studio-3rtf78dg99fe/imgs/meta-6c7061054a1005d0cdfebd5dd8e353b56091beb9-1692x852.png (100%) rename apps/blog/public/{blog => }/prisma-studio-3rtf78dg99fe/imgs/studio-filters.png (100%) rename apps/blog/public/{blog => }/prisma-studio-3rtf78dg99fe/imgs/studio-models.png (100%) rename apps/blog/public/{blog => }/prisma-studio-3rtf78dg99fe/imgs/studio-pagination.png (100%) rename apps/blog/public/{blog => }/prisma-studio-3rtf78dg99fe/imgs/studio-relations.png (100%) rename apps/blog/public/{blog => }/prisma-studio-3rtf78dg99fe/imgs/studio-shortcuts.png (100%) rename apps/blog/public/{blog => }/prisma-studio-3rtf78dg99fe/imgs/studio-tabs.png (100%) rename apps/blog/public/{blog => }/prisma-the-complete-orm-inw24qjeawmb/imgs/2020-11-studio.png (100%) rename apps/blog/public/{blog => }/prisma-the-complete-orm-inw24qjeawmb/imgs/CTGhQZ9.png (100%) rename apps/blog/public/{blog => }/prisma-the-complete-orm-inw24qjeawmb/imgs/Hb9VOWN.png (100%) rename apps/blog/public/{blog => }/prisma-the-complete-orm-inw24qjeawmb/imgs/O1lwo0v.png (100%) rename apps/blog/public/{blog => }/prisma-the-complete-orm-inw24qjeawmb/imgs/hero-b1d4c8cd672457585505b61a7d6a73c0d6a9c37e-870x438.png (100%) rename apps/blog/public/{blog => }/prisma-the-complete-orm-inw24qjeawmb/imgs/meta-67f18c89e81a4b74c9be5ee10cee19de1033a62e-1692x852.png (100%) rename apps/blog/public/{blog => }/prisma-the-complete-orm-inw24qjeawmb/imgs/mggzrl7.png (100%) rename apps/blog/public/{blog => }/prisma-the-complete-orm-inw24qjeawmb/imgs/nF2JOQt.png (100%) rename apps/blog/public/{blog => }/prisma-the-complete-orm-inw24qjeawmb/imgs/rEVZs9a.png (100%) rename apps/blog/public/{blog => }/prisma-turso-ea-support-rxgd_tmy3uxx/imgs/embedded-replica-create-copy.png (100%) rename apps/blog/public/{blog => }/prisma-turso-ea-support-rxgd_tmy3uxx/imgs/embedded-replica-read.png (100%) rename apps/blog/public/{blog => }/prisma-turso-ea-support-rxgd_tmy3uxx/imgs/embedded-replica-remote-read.png (100%) rename apps/blog/public/{blog => }/prisma-turso-ea-support-rxgd_tmy3uxx/imgs/embedded-replica-timing.png (100%) rename apps/blog/public/{blog => }/prisma-turso-ea-support-rxgd_tmy3uxx/imgs/embedded-replica-write-propagation.png (100%) rename apps/blog/public/{blog => }/prisma-turso-ea-support-rxgd_tmy3uxx/imgs/hero-95bd2c2570955da7f55308c6531d0e28e6ed262d-844x475.svg (100%) rename apps/blog/public/{blog => }/prisma-turso-ea-support-rxgd_tmy3uxx/imgs/meta-c9c3aaf0efdf8abb7b2e576e7da9e728058bf1bd-1200x675.png (100%) rename apps/blog/public/{blog => }/prisma-turso-ea-support-rxgd_tmy3uxx/imgs/mind-blown.gif (100%) rename apps/blog/public/{blog => }/prisma-turso-ea-support-rxgd_tmy3uxx/imgs/remote-sqlite-timing.png (100%) rename apps/blog/public/{blog => }/read-replicas-prisma-client-extension-f66prwk56wow/imgs/hero-a717625cf0bcb939c62e28aa934c650dfb597df6-844x474.svg (100%) rename apps/blog/public/{blog => }/read-replicas-prisma-client-extension-f66prwk56wow/imgs/meta-c31e5ccdacb3cf0cffd480480c7d6f19950f8eca-1266x711.png (100%) rename apps/blog/public/{blog => }/relay-moderns-connection-directive-1ecd8322f5c8/imgs/hero-d77cd8556b1e37826824d5a4feb83f16ea5b35b7-720x385.png (100%) rename apps/blog/public/{blog => }/relay-vs-apollo-comparing-graphql-clients-for-react-apps-b40af58c1534/imgs/145.png (100%) rename apps/blog/public/{blog => }/relay-vs-apollo-comparing-graphql-clients-for-react-apps-b40af58c1534/imgs/hero-bec4b18f6f63be54e12c792608ca39e7793a9216-900x482.png (100%) rename apps/blog/public/{blog => }/restructure-announcement-1a9ek279du8j/imgs/hero-6cee39353188494b1c1877524e073b4f7c27f4b7-844x474.svg (100%) rename apps/blog/public/{blog => }/restructure-announcement-1a9ek279du8j/imgs/meta-8f493f2942862133572d5da0ff85cfc0f6980c42-1266x712.png (100%) rename apps/blog/public/{blog => }/rust-free-prisma-orm-is-ready-for-production/imgs/cba14193002175661ac170da6197c024be53b5ca-2386x1982.png (100%) rename apps/blog/public/{blog => }/rust-free-prisma-orm-is-ready-for-production/imgs/hero-a6f1588362b51200aac9693f9c331101d6b397d1-844x474.svg (100%) rename apps/blog/public/{blog => }/rust-free-prisma-orm-is-ready-for-production/imgs/meta-9c1f5eb2a51fc9c54ed069779bcc76e5eb0af5d4-1266x711.png (100%) rename apps/blog/public/{blog => }/rust-to-typescript-update-boosting-prisma-orm-performance/imgs/727c131f97f5cc9f326082e0f7d55a1ea61f6b80-1480x695.png (100%) rename apps/blog/public/{blog => }/rust-to-typescript-update-boosting-prisma-orm-performance/imgs/c63df7c781f89520601e5a727a48e01b07475569-1280x889.png (100%) rename apps/blog/public/{blog => }/rust-to-typescript-update-boosting-prisma-orm-performance/imgs/hero-508e044038cf37bd9138323288a3d8b5be57ca63-844x474.svg (100%) rename apps/blog/public/{blog => }/rust-to-typescript-update-boosting-prisma-orm-performance/imgs/meta-a0def58926eae703ce0eccf28d5df589a2c5bc05-1266x711.png (100%) rename apps/blog/public/{blog => }/satisfies-operator-ur8ys8ccq7zb/imgs/hero-2bc010b9062230164bcd686cf3416266fd0ece1f-843x474.svg (100%) rename apps/blog/public/{blog => }/satisfies-operator-ur8ys8ccq7zb/imgs/meta-5c8b99ea1a4d8c800d3bdeb71a4734c95d56d6c4-1270x715.png (100%) rename apps/blog/public/{blog => }/saving-black-friday-with-connection-pooling/imgs/084efc320878cc99d8cacd362bc36ecea48ce4c5-1850x678.png (100%) rename apps/blog/public/{blog => }/saving-black-friday-with-connection-pooling/imgs/2ffcfaaf2c3a95c87535631c0e8da79c5b2d05e5-2888x2464.png (100%) rename apps/blog/public/{blog => }/saving-black-friday-with-connection-pooling/imgs/55376e6a0b41c8735bfef186518bb6d5a9eddd6a-2888x2188.png (100%) rename apps/blog/public/{blog => }/saving-black-friday-with-connection-pooling/imgs/8b7fe6e1d5bd133b0643df2fd58b5f9678f52b43-2888x1016.png (100%) rename apps/blog/public/{blog => }/saving-black-friday-with-connection-pooling/imgs/a5992f7bbbf2c39d1d0beb63e7360f628483a4bb-2888x2366.png (100%) rename apps/blog/public/{blog => }/saving-black-friday-with-connection-pooling/imgs/dea47b106e4341d0dc41e8659a31d432fa7b7772-1742x1096.png (100%) rename apps/blog/public/{blog => }/saving-black-friday-with-connection-pooling/imgs/hero-038b90e253764d69963a9b4ef3891d95fe6bbaa2-844x474.svg (100%) rename apps/blog/public/{blog => }/saving-black-friday-with-connection-pooling/imgs/meta-6d20845cc06f6ca9bb7babc20be49a42b22c3dd0-1200x630.png (100%) rename apps/blog/public/{blog => }/securely-access-prisma-postgres-from-the-frontend-early-access/imgs/12abb77ae3ff06a4a3335ea856e1a89422e3e007-3286x985.png (100%) rename apps/blog/public/{blog => }/securely-access-prisma-postgres-from-the-frontend-early-access/imgs/466abaeacebd44acc8f0aa9d5a7548cb62bf1932-3286x985.png (100%) rename apps/blog/public/{blog => }/securely-access-prisma-postgres-from-the-frontend-early-access/imgs/hero-13e2df77207c89a8c1ef8564e21b5efca86a55a3-844x474.svg (100%) rename apps/blog/public/{blog => }/securely-access-prisma-postgres-from-the-frontend-early-access/imgs/meta-386582d6124851db648d76377cab73647fcd1fdb-1266x711.png (100%) rename apps/blog/public/{blog => }/series-b-announcement-v8t12ksi6x/imgs/dal.png (100%) rename apps/blog/public/{blog => }/series-b-announcement-v8t12ksi6x/imgs/hero-947eaa8ea58c544f00d8eff50fa587e2e10932cb-844x474.svg (100%) rename apps/blog/public/{blog => }/series-b-announcement-v8t12ksi6x/imgs/meta-d0fb3a031df9c776e2ca156ac0a8a297c9340574-1267x711.png (100%) rename apps/blog/public/{blog => }/series-b-announcement-v8t12ksi6x/imgs/pdp-diagram.png (100%) rename apps/blog/public/{blog => }/series-b-announcement-v8t12ksi6x/imgs/pdp-illustration.png (100%) rename apps/blog/public/{blog => }/series-b-announcement-v8t12ksi6x/imgs/timesquare.jpeg (100%) rename apps/blog/public/{blog => }/series-b-announcement-v8t12ksi6x/imgs/wad.png (100%) rename apps/blog/public/{blog => }/serverless-database-drivers-kml1ehxorxzv/imgs/connection-pooling.png (100%) rename apps/blog/public/{blog => }/serverless-database-drivers-kml1ehxorxzv/imgs/hero-57908d058c349573b2f17ef889d25a23a427b0e2-844x474.svg (100%) rename apps/blog/public/{blog => }/serverless-database-drivers-kml1ehxorxzv/imgs/meta-216c379698ad6fde0769ab278a33890eecc24240-1266x711.png (100%) rename apps/blog/public/{blog => }/serverless-database-drivers-kml1ehxorxzv/imgs/neon-logo.png (100%) rename apps/blog/public/{blog => }/serverless-database-drivers-kml1ehxorxzv/imgs/planetscale-logo.png (100%) rename apps/blog/public/{blog => }/serverless-database-drivers-kml1ehxorxzv/imgs/with-driver-adapter.png (100%) rename apps/blog/public/{blog => }/serverless-database-drivers-kml1ehxorxzv/imgs/without-driver-adapter.png (100%) rename apps/blog/public/{blog => }/state-of-prisma-2-december-rcrwcqyu655e/imgs/FmaRakd.png (100%) rename apps/blog/public/{blog => }/state-of-prisma-2-december-rcrwcqyu655e/imgs/cHaIWlh.png (100%) rename apps/blog/public/{blog => }/state-of-prisma-2-december-rcrwcqyu655e/imgs/hero-9f370997d51d3a43686ee7fc9e492dc1d54d197c-1200x630.png (100%) rename apps/blog/public/{blog => }/state-of-prisma-2-december-rcrwcqyu655e/imgs/vVHmtEQ.png (100%) rename apps/blog/public/{blog => }/studio-for-prisma-postgres-view-and-edit-your-data-online/imgs/785ef0347e31f513204bbc42d5af3a46984834ba-1080x266.png (100%) rename apps/blog/public/{blog => }/studio-for-prisma-postgres-view-and-edit-your-data-online/imgs/fe39b81e4a2a8ae7a983960b62edde68bdd82569-1965x1327.gif (100%) rename apps/blog/public/{blog => }/studio-for-prisma-postgres-view-and-edit-your-data-online/imgs/hero-b9eb48224460d3dd63221a55e6322efd9f81e833-844x474.svg (100%) rename apps/blog/public/{blog => }/studio-for-prisma-postgres-view-and-edit-your-data-online/imgs/meta-ad1ac68a3b55942c10ba0e35763322f77a8173cd-1266x711.png (100%) rename apps/blog/public/{blog => }/sveltekit-prisma-kvcoeoeqlc/imgs/hero-b3ac03355cfac30be65afcc3da2556f9cb07cbdd-844x478.svg (100%) rename apps/blog/public/{blog => }/sveltekit-prisma-kvcoeoeqlc/imgs/meta-b2a7a9354acfb2927aec03119e98cf6e5c04271b-1266x712.png (100%) rename apps/blog/public/{blog => }/sveltekit-prisma-kvcoeoeqlc/imgs/sveltekit-fullstack-app.png (100%) rename apps/blog/public/{blog => }/testing-series-1-8erb5p0y8o/imgs/hero-c96c41c8c5f42d2c52751fac51563dbc8f01b52c-844x474.svg (100%) rename apps/blog/public/{blog => }/testing-series-1-8erb5p0y8o/imgs/meta-4fe84c71772f90f758778c5a9f5e6db96af0efd2-1266x712.png (100%) rename apps/blog/public/{blog => }/testing-series-1-8erb5p0y8o/imgs/mock-functions.png (100%) rename apps/blog/public/{blog => }/testing-series-1-8erb5p0y8o/imgs/spy-functions.png (100%) rename apps/blog/public/{blog => }/testing-series-1-8erb5p0y8o/imgs/testing_meme.png (100%) rename apps/blog/public/{blog => }/testing-series-1-8erb5p0y8o/imgs/undefined.png (100%) rename apps/blog/public/{blog => }/testing-series-2-xphjjmiesm/imgs/file-nesting-config.png (100%) rename apps/blog/public/{blog => }/testing-series-2-xphjjmiesm/imgs/file-nesting-option.png (100%) rename apps/blog/public/{blog => }/testing-series-2-xphjjmiesm/imgs/hero-c9711528e68bdd2e62b432a8fad0f7e6f4859ede-844x474.svg (100%) rename apps/blog/public/{blog => }/testing-series-2-xphjjmiesm/imgs/meta-5b092626852ebeccdc7962534c6e45d87869900d-1266x712.png (100%) rename apps/blog/public/{blog => }/testing-series-2-xphjjmiesm/imgs/nested-files.png (100%) rename apps/blog/public/{blog => }/testing-series-2-xphjjmiesm/imgs/success.png (100%) rename apps/blog/public/{blog => }/testing-series-2-xphjjmiesm/imgs/test-graphic.svg (100%) rename apps/blog/public/{blog => }/testing-series-3-abuyf8nxan/imgs/all-tests-success.png (100%) rename apps/blog/public/{blog => }/testing-series-3-abuyf8nxan/imgs/docker-compose-running.png (100%) rename apps/blog/public/{blog => }/testing-series-3-abuyf8nxan/imgs/example.png (100%) rename apps/blog/public/{blog => }/testing-series-3-abuyf8nxan/imgs/hero-d60da664991c33bbb498244fe0303813fad6a657-844x474.svg (100%) rename apps/blog/public/{blog => }/testing-series-3-abuyf8nxan/imgs/signup-suite-success.png (100%) rename apps/blog/public/{blog => }/testing-series-3-abuyf8nxan/imgs/test-success.png (100%) rename apps/blog/public/{blog => }/testing-series-3-abuyf8nxan/imgs/tests-run.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/empty-suite.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/five-success.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/four-success.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/hero-205e6248fbc41a4e2b56b77d5a68ccc8e67742db-844x474.svg (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/intellisense.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/invalid-login.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/login.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/meta-b984941339322c22e27db8dae8010454522fba88-1266x712.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/playwright-options.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/single-success.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/three-success.png (100%) rename apps/blog/public/{blog => }/testing-series-4-ovxtdis201/imgs/two-success.png (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/all-success.png (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/create-pr.png (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/hero-1f810a93209524174c2aefb95145a831d4c0fd34-844x474.svg (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/meta-1688da94cebe335c8252420b638b7dfa43b135f2-1267x712.png (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/new-pr.png (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/new-repo-button.png (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/new-repo-form.png (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/new-repo-url.png (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/successful-test.png (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/unit-int-success.png (100%) rename apps/blog/public/{blog => }/testing-series-5-xwogenroxm/imgs/unit-tests-running.png (100%) rename apps/blog/public/{blog => }/the-guild-takes-over-oss-libraries-vvluy2i4uevs/imgs/hero-9955207df52f4ccd9dd7985866c84af54806940a-1200x630.png (100%) rename apps/blog/public/{blog => }/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3/imgs/OLITh8y.png (100%) rename apps/blog/public/{blog => }/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3/imgs/hero-91c07e1fd19a7c0ebdd6e970c354bb8d7630a23c-870x457.png (100%) rename apps/blog/public/{blog => }/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3/imgs/jFszNXY.png (100%) rename apps/blog/public/{blog => }/the-problems-of-schema-first-graphql-development-x1mn4cb0tyl3/imgs/meta-72943771e4be50e26d645130d640c20a4deb48ee-1200x630.png (100%) rename apps/blog/public/{blog => }/top-5-myths-about-prisma-orm/imgs/2115069c1f42c6b5062f48c80167a50b66eac00d-2144x1912.png (100%) rename apps/blog/public/{blog => }/top-5-myths-about-prisma-orm/imgs/25269e1341880f556defb4a52c3a593df68336b1-1047x1200.png (100%) rename apps/blog/public/{blog => }/top-5-myths-about-prisma-orm/imgs/32a81d2c9ce4bc1f989064c54bc0d8870f8f2e75-1480x264.png (100%) rename apps/blog/public/{blog => }/top-5-myths-about-prisma-orm/imgs/5f7e0d66d047c7f0f44fc853065ae7f18ca68b85-1480x264.png (100%) rename apps/blog/public/{blog => }/top-5-myths-about-prisma-orm/imgs/8c960545b98a710c8856495120cba3e3d6dbc612-3200x2280.png (100%) rename apps/blog/public/{blog => }/top-5-myths-about-prisma-orm/imgs/aa38701684dfb2dcfc9308f698bada759477f88f-3200x2390.png (100%) rename apps/blog/public/{blog => }/top-5-myths-about-prisma-orm/imgs/acff3e3fd1fd16c0b9d6c0831613ee362b013881-1570x1215.gif (100%) rename apps/blog/public/{blog => }/top-5-myths-about-prisma-orm/imgs/fc9995d3f9b880ad6ea35cf1b4a29fa1cefb5df5-1360x851.png (100%) rename apps/blog/public/{blog => }/top-5-myths-about-prisma-orm/imgs/hero-24e01331d58f1130f12dd51ee84be1895a19a847-844x474.svg (100%) rename apps/blog/public/{blog => }/top-5-myths-about-prisma-orm/imgs/meta-7dcace1c4f6f1438c4416c8452417872dafe3b1c-1266x711.png (100%) rename apps/blog/public/{blog => }/top-5-reasons-to-use-graphql-b60cfa683511/imgs/1*OPs5D2XrAcFI1hDay-_nEQ.png (100%) rename apps/blog/public/{blog => }/top-5-reasons-to-use-graphql-b60cfa683511/imgs/hero-646eacc9490ba67cda9493f1e1c959da2090a2ee-1350x900.png (100%) rename apps/blog/public/{blog => }/tracing-launch-announcement-pmk4rlpc0ll/imgs/hero-e70fb09d875e161b9445bd00b298b6264d85362a-844x474.svg (100%) rename apps/blog/public/{blog => }/tracing-launch-announcement-pmk4rlpc0ll/imgs/meta-3de44ed88cad8c1704a9b1a43f9f355478c23714-1692x952.png (100%) rename apps/blog/public/{blog => }/tracing-launch-announcement-pmk4rlpc0ll/imgs/prisma-dashboard-grafana.png (100%) rename apps/blog/public/{blog => }/tracing-launch-announcement-pmk4rlpc0ll/imgs/trace-spans-waterfall.png (100%) rename apps/blog/public/{blog => }/tracing-launch-announcement-pmk4rlpc0ll/imgs/tracing-otel-collectors.png (100%) rename apps/blog/public/{blog => }/tracing-tutorial-prisma-pmkddgq1lm2/imgs/child-span-manual.png (100%) rename apps/blog/public/{blog => }/tracing-tutorial-prisma-pmkddgq1lm2/imgs/express-automatic-jaeger.png (100%) rename apps/blog/public/{blog => }/tracing-tutorial-prisma-pmkddgq1lm2/imgs/hero-fd54935bd567302a6c1d9764d103fbe9d691fe99-844x474.svg (100%) rename apps/blog/public/{blog => }/tracing-tutorial-prisma-pmkddgq1lm2/imgs/jaeger-query-empty.png (100%) rename apps/blog/public/{blog => }/tracing-tutorial-prisma-pmkddgq1lm2/imgs/jaeger-trace-details.gif (100%) rename apps/blog/public/{blog => }/tracing-tutorial-prisma-pmkddgq1lm2/imgs/meta-5d370d0add518302e58ef25004916ad409e53ac8-2538x1428.png (100%) rename apps/blog/public/{blog => }/tracing-tutorial-prisma-pmkddgq1lm2/imgs/prisma-automatic-jaeger.png (100%) rename apps/blog/public/{blog => }/tracing-tutorial-prisma-pmkddgq1lm2/imgs/trace-diagram-example.png (100%) rename apps/blog/public/{blog => }/try-the-new-rust-free-version-of-prisma-orm-early-access/imgs/d58c2ba3c9e5ad5777d73b46616c520cc2afab44-2220x746.png (100%) rename apps/blog/public/{blog => }/try-the-new-rust-free-version-of-prisma-orm-early-access/imgs/hero-72705c07c42651a759db9aab07ea8a062c671a46-844x474.svg (100%) rename apps/blog/public/{blog => }/try-the-new-rust-free-version-of-prisma-orm-early-access/imgs/meta-ff0b26daee0a92c1135e8397f9af50c91aec798c-1266x711.png (100%) rename apps/blog/public/{blog => }/tryg-customer-story-pdmdrrhtupvd/imgs/Tryg_Prisma_Image_1.png (100%) rename apps/blog/public/{blog => }/tryg-customer-story-pdmdrrhtupvd/imgs/Tryg_Prisma_Image_2.png (100%) rename apps/blog/public/{blog => }/tryg-customer-story-pdmdrrhtupvd/imgs/hero-efb10e8cb1102a57b7c9d1b71e7120cf47a8f068-846x426.png (100%) rename apps/blog/public/{blog => }/tryg-customer-story-pdmdrrhtupvd/imgs/meta-4b9d0487846e751fc30531dc46b2e3edb1700df1-1692x852.png (100%) rename apps/blog/public/{blog => }/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*1vMUL8w54yIAxOPVSR0UjQ.png (100%) rename apps/blog/public/{blog => }/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*9fDpnhWdRrgN-vxB3HmLeQ.png (100%) rename apps/blog/public/{blog => }/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*GoxKn35GhQpmHZ6bnKbDZA.png (100%) rename apps/blog/public/{blog => }/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*TisP6j41cu4itqI__dDE-w.png (100%) rename apps/blog/public/{blog => }/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/1*c6bexq2J0bTeT5UioGjl_A.png (100%) rename apps/blog/public/{blog => }/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/giphy.gif (100%) rename apps/blog/public/{blog => }/tutorial-building-a-realtime-graphql-server-with-subscriptions-2758cfc6d427/imgs/hero-781be5bd42b889008892c3564dc6bc915c33581f-2000x1050.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*3fi7Zud_T3VeocM7CN_FIQ.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*_EjTITNbwXGCVc7f5MA7tQ.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*dgGQ6f1SZcJH7nddNM0Kug.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*iNK392MZ7rLIemoigPtvGA.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*idRITgkP04XGflQExvz61A.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*ifNy0EWA5EdrqkU0X9LT3Q.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*rzI7PLKuJuRjjBIxoSiboQ.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*wBWEMQXeDUu6JZBN44ZGUg-1.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/1*wBWEMQXeDUu6JZBN44ZGUg.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/hero-f130ef1313ac6bbb52267050f3cbc5bc83839911-870x457.svg (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/meta-e2111dc3b582d8715d9835a48db4976a57f2b859-1200x630.png (100%) rename apps/blog/public/{blog => }/tutorial-render-props-in-react-apollo-2-1-199e9e2bd01e/imgs/widgets.js (100%) rename apps/blog/public/{blog => }/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/imgs/0*A9dtztGpco-x9gTF.png (100%) rename apps/blog/public/{blog => }/tutorial-using-create-react-native-app-with-graphql-apollo-e630aee3ae1e/imgs/hero-a83dd1e60398f33faecaec5abe5adc37027f5811-400x711.png (100%) rename apps/blog/public/{blog => }/tweets-for-trees-arboreal/imgs/climatestrike1.jpg (100%) rename apps/blog/public/{blog => }/tweets-for-trees-arboreal/imgs/climatestrike1.webp (100%) rename apps/blog/public/{blog => }/tweets-for-trees-arboreal/imgs/hero-ab93d4111f5adff9a31064f60ab98d64c16d07ad-844x423.svg (100%) rename apps/blog/public/{blog => }/tweets-for-trees-arboreal/imgs/meta-f097a759f1bb95dac6e0f9d1eda6ce54cfa3ff6d-1688x845.png (100%) rename apps/blog/public/{blog => }/type-safe-js-with-jsdoc-typesaf3js/imgs/123747164-400cd980-d8bb-11eb-9084-cd44a1cd53f0.png (100%) rename apps/blog/public/{blog => }/type-safe-js-with-jsdoc-typesaf3js/imgs/146181009-04fc37e4-d8ba-4ba6-af76-479bfd2e0379.mov (100%) rename apps/blog/public/{blog => }/type-safe-js-with-jsdoc-typesaf3js/imgs/I5g4bnQ (100%) rename apps/blog/public/{blog => }/type-safe-js-with-jsdoc-typesaf3js/imgs/hero-98db3908d18a149cca2bec7d980182d69a7d540c-870x438.png (100%) rename apps/blog/public/{blog => }/type-safe-js-with-jsdoc-typesaf3js/imgs/meta-e05807a6755ea2fc83cd43cbab1505eb11f517be-1692x852.png (100%) rename apps/blog/public/{blog => }/using-graphql-nexus-with-a-database-pmyl3660ncst/imgs/64ipcsj.png (100%) rename apps/blog/public/{blog => }/using-graphql-nexus-with-a-database-pmyl3660ncst/imgs/MOArOPF.mp4 (100%) rename apps/blog/public/{blog => }/using-graphql-nexus-with-a-database-pmyl3660ncst/imgs/RLsS1lm.png (100%) rename apps/blog/public/{blog => }/using-graphql-nexus-with-a-database-pmyl3660ncst/imgs/Zwby9Hs.png (100%) rename apps/blog/public/{blog => }/using-graphql-nexus-with-a-database-pmyl3660ncst/imgs/dbEMHd5.png (100%) rename apps/blog/public/{blog => }/using-graphql-nexus-with-a-database-pmyl3660ncst/imgs/hero-d5d2d2a170d84629937a237d833679a49653a117-1200x630.png (100%) rename apps/blog/public/{blog => }/vibe-coding-with-limits-how-to-build-apps-in-the-age-of-ai/imgs/ed3b8387fd31f1db39c0fa35305107c611a6c9a4-1444x434.png (100%) rename apps/blog/public/{blog => }/vibe-coding-with-limits-how-to-build-apps-in-the-age-of-ai/imgs/hero-08d54d27c0d490c7c307f17867861478d442505f-844x474.svg (100%) rename apps/blog/public/{blog => }/vibe-coding-with-limits-how-to-build-apps-in-the-age-of-ai/imgs/meta-636ed67ba959f1fcdac2f9a90eea7d34d0f1c73a-1266x711.png (100%) rename apps/blog/public/{blog => }/vibe-coding-with-prisma-mcp-and-nextjs/imgs/4702c210844401e58100abf9b60827f9cae6400b-1438x1136.png (100%) rename apps/blog/public/{blog => }/vibe-coding-with-prisma-mcp-and-nextjs/imgs/d4d8e00ccf27e3eed197fc24c2cd03e22ee90cd7-1437x1075.png (100%) rename apps/blog/public/{blog => }/vibe-coding-with-prisma-mcp-and-nextjs/imgs/fe8dbe5251efcc06e49e7aedd5f7961f10317818-3594x1160.png (100%) rename apps/blog/public/{blog => }/vibe-coding-with-prisma-mcp-and-nextjs/imgs/hero-11982eebff8afea06f840a2c8b8b974a6681cbc5-844x474.svg (100%) rename apps/blog/public/{blog => }/vscode-extension-prisma-rust-webassembly/imgs/before-after.webp (100%) rename apps/blog/public/{blog => }/vscode-extension-prisma-rust-webassembly/imgs/binary-diagram.webp (100%) rename apps/blog/public/{blog => }/vscode-extension-prisma-rust-webassembly/imgs/format.gif (100%) rename apps/blog/public/{blog => }/vscode-extension-prisma-rust-webassembly/imgs/hero-aa75a645380cd5b1759ad90ed111c2889eb1d5a8-870x454.png (100%) rename apps/blog/public/{blog => }/vscode-extension-prisma-rust-webassembly/imgs/jump-to-definition.gif (100%) rename apps/blog/public/{blog => }/vscode-extension-prisma-rust-webassembly/imgs/linting-autocompletion.gif (100%) rename apps/blog/public/{blog => }/vscode-extension-prisma-rust-webassembly/imgs/meta-494b96fe117ed31d3b18fd98f4bfde023db89522-1801x941.png (100%) rename apps/blog/public/{blog => }/vscode-extension-prisma-rust-webassembly/imgs/quick-fixes.gif (100%) rename apps/blog/public/{blog => }/vscode-extension-prisma-rust-webassembly/imgs/syntax-highlighting.webp (100%) rename apps/blog/public/{blog => }/watch-prisma-day-talks-z11sg6ipb3i1/imgs/6o81g4o.jpg (100%) rename apps/blog/public/{blog => }/watch-prisma-day-talks-z11sg6ipb3i1/imgs/hero-e1f0832d806403801afbd482ec812d046bfcf8a5-870x457.png (100%) rename apps/blog/public/{blog => }/watch-prisma-day-talks-z11sg6ipb3i1/imgs/meta-fea8ecef646b6bf26d0612835a9125136d5d1b90-1200x630.png (100%) rename apps/blog/public/{blog => }/watch-prisma-day-talks-z11sg6ipb3i1/imgs/prisma-team.jpg (100%) rename apps/blog/public/{blog => }/watch-prisma-day-talks-z11sg6ipb3i1/imgs/videoseries (100%) rename apps/blog/public/{blog => }/we-made-prisma-studio-even-better/imgs/2e54afa225ec57290d4b4fc947fafe2668b7f62b-1616x1080.gif (100%) rename apps/blog/public/{blog => }/we-made-prisma-studio-even-better/imgs/4b4f7a10429a4270b11612fb74450d51e8be01fe-1644x1080.gif (100%) rename apps/blog/public/{blog => }/we-made-prisma-studio-even-better/imgs/52552ee5fade1c8d70371df522a7e63acbb2ae25-2290x1428.png (100%) rename apps/blog/public/{blog => }/we-made-prisma-studio-even-better/imgs/a1966cf74b40096dbca0fa8c86177464074a5793-4110x1264.png (100%) rename apps/blog/public/{blog => }/we-made-prisma-studio-even-better/imgs/d2e5e6e50243906258be8fdcbcfc6757d4e80a7e-4106x1564.png (100%) rename apps/blog/public/{blog => }/we-made-prisma-studio-even-better/imgs/f64ca7afcc114a7ba746e766d6b94389f3da3424-2458x1080.png (100%) rename apps/blog/public/{blog => }/we-made-prisma-studio-even-better/imgs/hero-1d76f11db26fa90ab318e6eaac176951f309e904-844x474.svg (100%) rename apps/blog/public/{blog => }/we-made-prisma-studio-even-better/imgs/meta-d6de7a02e965c619c2490a14a32f8aa97b8cc43b-1266x711.png (100%) rename apps/blog/public/{blog => }/whats-new-in-prisma-q1-2021-spjyqp0e2rk1/imgs/XAUJcsA.png (100%) rename apps/blog/public/{blog => }/whats-new-in-prisma-q1-2021-spjyqp0e2rk1/imgs/hero-d9d93ef80b0722fa2c50737272fd764619c66972-1692x852.png (100%) rename apps/blog/public/{blog => }/whats-new-in-prisma-q1-2021-spjyqp0e2rk1/imgs/tIGqo0V.png (100%) rename apps/blog/public/{blog => }/whats-new-in-prisma-q2-2021-z70muetl386d/imgs/18401805.png (100%) rename apps/blog/public/{blog => }/whats-new-in-prisma-q2-2021-z70muetl386d/imgs/21019.png (100%) rename apps/blog/public/{blog => }/whats-new-in-prisma-q2-2021-z70muetl386d/imgs/71383.png (100%) rename apps/blog/public/{blog => }/whats-new-in-prisma-q2-2021-z70muetl386d/imgs/hero-05546705b2ebe131d6a20b897c7bcb5616a60495-844x474.svg (100%) rename apps/blog/public/{blog => }/whats-new-in-prisma-q2-2021-z70muetl386d/imgs/meta-63928bca38d21b517118716dd18909da219644be-1692x852.png (100%) rename apps/blog/public/{blog => }/why-prisma-2024/imgs/46cf59b4dcf666cc403923788d01a5eb0c959970-870x804.gif (100%) rename apps/blog/public/{blog => }/why-prisma-2024/imgs/7aed9752dfe9cfc09bc7975b8330c675af16c5fc-1046x924.gif (100%) rename apps/blog/public/{blog => }/why-prisma-2024/imgs/b0477e4bb40d99b44abc2b9d3a7442fd72cda4c3-1024x591.gif (100%) rename apps/blog/public/{blog => }/why-prisma-2024/imgs/d51cab2510fee6e42a9e4a490c6a8da7b250c4fd-1920x788.gif (100%) rename apps/blog/public/{blog => }/why-prisma-2024/imgs/hero-a1ecc2ab21f5c90ec0fcaefa8b6edcb76568bd2f-844x474.svg (100%) rename apps/blog/public/{blog => }/why-prisma-2024/imgs/meta-c9f26242397df35ac3957bac087e408f3b68ebf3-1200x630.png (100%) rename apps/blog/public/{blog => }/why-prisma-orm-checks-types-faster-than-drizzle/imgs/e7f6b90fa12f4e616e865df20bc2b56f15b7a992-400x400.jpg (100%) rename apps/blog/public/{blog => }/why-prisma-orm-checks-types-faster-than-drizzle/imgs/hero-2a6e0cf3a5949295b175404698d43c7ce6539dcc-844x474.svg (100%) rename apps/blog/public/{blog => }/why-prisma-orm-checks-types-faster-than-drizzle/imgs/meta-08ce54c475608dac96f99cf51d330a6c724b8415-1266x711.png (100%) rename apps/blog/public/{blog => }/why-prisma-orm-generates-code-into-node-modules-and-why-it-ll-change/imgs/hero-790371627d3721ca4217827e0f291f31d7345fa4-844x474.svg (100%) rename apps/blog/public/{blog => }/why-prisma-orm-generates-code-into-node-modules-and-why-it-ll-change/imgs/meta-3524d5ed551401d4e4299f6573888377675d62c9-1266x711.png (100%) rename apps/blog/public/{blog => }/why-sitegpt-chose-prisma-postgres-for-scalable-ai-powered-chatbots/imgs/hero-2181220b1ae360c736c90ddb97f4e218d9c29d7b-844x474.svg (100%) rename apps/blog/public/{blog => }/why-sitegpt-chose-prisma-postgres-for-scalable-ai-powered-chatbots/imgs/meta-891a52655ec10ed0229b3c3bf715dcd1d96e56c6-1266x711.png (100%) rename apps/blog/public/{blog => }/why-the-prisma-cli-asks-for-your-feedback/imgs/hero-b14ae5c0100b00da2e109d1b583bd2a2fee55a09-844x474.svg (100%) rename apps/blog/public/{blog => }/why-the-prisma-cli-asks-for-your-feedback/imgs/meta-276249e7efd9d25f732dfedf5f3cd739d8ed696b-1266x711.png (100%) rename apps/blog/public/{blog => }/wnip-q1-dsk0golh8v/imgs/hero-ca96e8f08146b21676bd4faa9978dc1a2cd9a2c5-870x438.png (100%) rename apps/blog/public/{blog => }/wnip-q1-dsk0golh8v/imgs/meta-e22bcc2581574927cdd406404700fda3e9efb665-1692x852.png (100%) rename apps/blog/public/{blog => }/wnip-q2-2022-pmn7rulcj8x/imgs/FYqbgQKWIAAjGvu.jpg (100%) rename apps/blog/public/{blog => }/wnip-q2-2022-pmn7rulcj8x/imgs/hero-fa9e8efd5bfc7d38784f178886df9098cfd402e9-870x438.png (100%) rename apps/blog/public/{blog => }/wnip-q2-2022-pmn7rulcj8x/imgs/meta-299642e5f461a1e5ef5ef3b5171f8b36dec08ae9-1692x852.png (100%) rename apps/blog/public/{blog => }/wnip-q3-hpk7pyth8v/imgs/hero-0bf3438608c28b9ef3150de53f989a640c833311-1692x852.png (100%) rename apps/blog/public/{blog => }/wnip-q4-2022-f66prwkjx72s/imgs/183606710-5945999c-4e0b-420c-9de5-4c6bf9984f0c.png (100%) rename apps/blog/public/{blog => }/wnip-q4-2022-f66prwkjx72s/imgs/183627500-ad866a4d-8624-4f05-839f-81daaaf3ce2d.png (100%) rename apps/blog/public/{blog => }/wnip-q4-2022-f66prwkjx72s/imgs/187421410-cd1f30cf-d0b4-4147-9467-70ca4da12321.png (100%) rename apps/blog/public/{blog => }/wnip-q4-2022-f66prwkjx72s/imgs/204537961-fb1049d3-ca33-4055-8e8e-0f6448e09695.png (100%) rename apps/blog/public/{blog => }/wnip-q4-2022-f66prwkjx72s/imgs/hero-2a1d85280674d8ee68aa0122190539f17f9774fd-2230x1124.png (100%) rename apps/blog/public/{blog => }/wnip-q4-dsk0golh8v/imgs/hero-a3f37c182ad811688a9551cfdf4a3ded6e129c85-844x474.svg (100%) rename apps/blog/public/{blog => }/wnip-q4-dsk0golh8v/imgs/meta-ff86a30923498fa56a5cbddf6750801a5cc9eda2-1692x852.png (100%) rename apps/blog/public/{blog => }/working-with-data-in-large-teams/imgs/692db4b94d2545446995a4138069dcd5c4d664ed-1722x1620.png (100%) rename apps/blog/public/{blog => }/working-with-data-in-large-teams/imgs/8e1499926a4ed10abfcf7d2c310d81cfaee4de21-1066x1190.png (100%) rename apps/blog/public/{blog => }/working-with-data-in-large-teams/imgs/a4b58bb31aec94338e862c881d97216ae51f7c70-2888x1372.png (100%) rename apps/blog/public/{blog => }/working-with-data-in-large-teams/imgs/f84211e7150686712c3c6ac48c443d69c60e73f3-2888x2206.png (100%) rename apps/blog/public/{blog => }/working-with-data-in-large-teams/imgs/f95eeb393e9927416c9bd776ac02895cc5775624-1348x932.png (100%) rename apps/blog/public/{blog => }/working-with-data-in-large-teams/imgs/hero-3d53c303fc2f5c1cb3e19f10a0f6522f093d6291-844x474.svg (100%) rename apps/blog/public/{blog => }/working-with-data-in-large-teams/imgs/meta-22576a7f1d6f518c9a4f0c317c5952374add63e6-1266x711.png (100%) create mode 100644 apps/blog/src/lib/url.ts diff --git a/apps/blog/content/blog/about-mcp-servers-and-how-we-built-one-for-prisma/index.mdx b/apps/blog/content/blog/about-mcp-servers-and-how-we-built-one-for-prisma/index.mdx index 27d8e5d374..d50c37c6be 100644 --- a/apps/blog/content/blog/about-mcp-servers-and-how-we-built-one-for-prisma/index.mdx +++ b/apps/blog/content/blog/about-mcp-servers-and-how-we-built-one-for-prisma/index.mdx @@ -5,8 +5,11 @@ date: "2025-05-07" authors: - "Nikolas Burk" metaTitle: "About MCP Servers & How We Built One for Prisma" -metaImagePath: "/blog/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/meta-c7ef9462464563ecc68ddf667e18dbef71f9f4fd-1266x711.png" -heroImagePath: "/blog/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/hero-af7a5b40501028b64219b2144f7b5c03723c4d99-844x474.svg" +metaImagePath: "/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/meta-c7ef9462464563ecc68ddf667e18dbef71f9f4fd-1266x711.png" +heroImagePath: "/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/hero-af7a5b40501028b64219b2144f7b5c03723c4d99-844x474.svg" +tags: + - "education" + - "orm" excerpt: | Learn how MCP works by following the practical example of how we built the Prisma MCP server, including the tradeoffs between local and remote MCP servers, the `@modelcontextprotocol/sdk` package, and how we enabled LLMs to use the Prisma CLI. @@ -42,7 +45,7 @@ In such scenarios, an LLM needs additional capabilities to interact with the "ou LLM providers have responded to this need by implementing so-called _tool_ access. Individual providers use different names for it: OpenAI calls it [function calling](https://platform.openai.com/docs/guides/function-calling?api-mode=responses), Anthropic refers to it as [tool use](https://docs.anthropic.com/en/docs/build-with-claude/tool-use/overview), and others use terms like "plugins" or "actions." -![](/blog/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/5a5b498ea72ab4a0969ed268408ef95d6f301d53-2888x1372.png) +![](/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/5a5b498ea72ab4a0969ed268408ef95d6f301d53-2888x1372.png) This approach was messy because each LLM had a different interface for interacting with tools. @@ -99,7 +102,7 @@ In November 2024, [Anthropic introduced the Model Context Protocol](https://www. MCP provides a universal, open standard for connecting AI systems with external data sources. All LLMs that implement the MCP protocol can now access the same functionality if it's exposed through an MCP server. -![](/blog/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/cbb0879b85e332bad731a1ca4c514d7c66ea9616-2888x1372.png) +![](/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/cbb0879b85e332bad731a1ca4c514d7c66ea9616-2888x1372.png) Returning to the previous example: With MCP, you only need to implement the invoice search functionality _once_. You can then expose it via an MCP server to all LLMs that support the MCP protocol. Here's a pseudocode implementation: @@ -124,7 +127,7 @@ await server.connect(transport); ``` Anthropic clearly struck a chord with this standard. If you were on X at the time, you probably saw multiple MCP posts a day. Google Trends for "MCP" tell the same story: -![](/blog/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/03cc8051d3cdfcabcb6037fcb5fbe1d33856fc99-1816x1400.png) +![](/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/03cc8051d3cdfcabcb6037fcb5fbe1d33856fc99-1816x1400.png) ### How to connect an LLM to an MCP server @@ -167,7 +170,7 @@ Before MCP, we would have had to implement support separately for each LLM. With When introducing MCP, Anthropic released SDKs for various languages. The TypeScript SDK lives in the [`typescript-sdk`](https://github.com/modelcontextprotocol/typescript-sdk) repository and provides everything needed to implement MCP clients and servers. -![](/blog/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/e7b3db57367968f0458172fb2f8bfa532b82f7ed-2068x1600.png) +![](/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/e7b3db57367968f0458172fb2f8bfa532b82f7ed-2068x1600.png) ### Local vs. remote MCP servers @@ -175,7 +178,7 @@ When building an MCP server, you must decide if it runs _locally_ (on the same m This depends on what the server does. If it needs access to the user's file system, it must run locally. If it just calls APIs, it can be local or remote (because an API can be called both from a local and remote machine). -![](/blog/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/39eadb7214d14e787cf74adbcbd9940f6cdb4ae2-2888x2644.png) +![](/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/39eadb7214d14e787cf74adbcbd9940f6cdb4ae2-2888x2644.png) In the case of Prisma, the LLM primarily needs access to the Prisma CLI in order to support developers with database-related workflows. The Prisma CLI may connect to a local or a remote database instance. However, because the CLI commands are executed locally, the Prisma MCP server also must be local. @@ -305,7 +308,7 @@ Or check out our [docs](https://www.prisma.io/docs/postgres/integrations/mcp-ser Once added, your AI tool will show the MCP server's status and available tools. Here's how it looks in Cursor: -![](/blog/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/1a9c595ed52f76150075536f39a1d00a014da6b1-1950x1240.png) +![](/about-mcp-servers-and-how-we-built-one-for-prisma/imgs/1a9c595ed52f76150075536f39a1d00a014da6b1-1950x1240.png) ## Beyond MCP: New capabilities for Prisma users in VS Code diff --git a/apps/blog/content/blog/accelerate-ga-release-i9cqm6bsf2g6/index.mdx b/apps/blog/content/blog/accelerate-ga-release-i9cqm6bsf2g6/index.mdx index c4dcdb8212..9903dbc153 100644 --- a/apps/blog/content/blog/accelerate-ga-release-i9cqm6bsf2g6/index.mdx +++ b/apps/blog/content/blog/accelerate-ga-release-i9cqm6bsf2g6/index.mdx @@ -6,9 +6,12 @@ authors: - "Sam Bhatti" metaTitle: "Prisma Accelerate now in General Availability" metaDescription: "Supercharge your applications with Prisma Accelerate's scalable connection pooling and global edge caching. Plus, enjoy our exclusive launch offer." -metaImagePath: "/blog/accelerate-ga-release-i9cqm6bsf2g6/imgs/meta-42554fa75736c00b0ca55e1e440dde26f43dcb3f-1266x711.png" -heroImagePath: "/blog/accelerate-ga-release-i9cqm6bsf2g6/imgs/hero-de83f5f843f2a86abd05659c94c3069e7577a0f5-844x474.svg" +metaImagePath: "/accelerate-ga-release-i9cqm6bsf2g6/imgs/meta-42554fa75736c00b0ca55e1e440dde26f43dcb3f-1266x711.png" +heroImagePath: "/accelerate-ga-release-i9cqm6bsf2g6/imgs/hero-de83f5f843f2a86abd05659c94c3069e7577a0f5-844x474.svg" heroImageAlt: "Prisma Accelerate now in General Availability" +tags: + - "announcement" + - "data-platform" excerpt: | Now in General Availability: Dive into [Prisma Accelerate](https://pris.ly/accelerate-blog), enhancing global database connections with connection pooling and edge caching for fast data access. diff --git a/apps/blog/content/blog/accelerate-ipv6-first/index.mdx b/apps/blog/content/blog/accelerate-ipv6-first/index.mdx index 2230b76538..22ae065d95 100644 --- a/apps/blog/content/blog/accelerate-ipv6-first/index.mdx +++ b/apps/blog/content/blog/accelerate-ipv6-first/index.mdx @@ -6,8 +6,10 @@ authors: - "Tyler Benfield" metaTitle: "We Transitioned Prisma Accelerate to IPv6 Without Anyone Noticing" metaDescription: "In July 2023, AWS announced the decision to begin charging for IPv4 addresses beginning in February 2024. This move had a major impact on Prisma Accelerate for reasons we’ll get into, prompting us to go all-in on IPv6. Join us for a deep dive into how we approached our IPv6 migration, lessons learned, and the outcome for users of Prisma Accelerate." -metaImagePath: "/blog/accelerate-ipv6-first/imgs/meta-b5bac6d735ee17d003b0a06190a5fa5c0e3fcc15-1266x713.png" -heroImagePath: "/blog/accelerate-ipv6-first/imgs/hero-248d5719caeee73ee2c7f94a7d194de949af1524-844x475.svg" +metaImagePath: "/accelerate-ipv6-first/imgs/meta-b5bac6d735ee17d003b0a06190a5fa5c0e3fcc15-1266x713.png" +heroImagePath: "/accelerate-ipv6-first/imgs/hero-248d5719caeee73ee2c7f94a7d194de949af1524-844x475.svg" +tags: + - "data-platform" excerpt: | In July 2023, [AWS announced](https://aws.amazon.com/blogs/aws/new-aws-public-ipv4-address-charge-public-ip-insights/) the decision to begin charging for IPv4 addresses beginning in February 2024. This move had a major impact on [Prisma Accelerate](https://www.prisma.io/data-platform/accelerate) for reasons we’ll get into, prompting us to go all-in on IPv6. Join us for a deep dive into how we approached our IPv6 migration, lessons learned, and the outcome for users of Prisma Accelerate. --- diff --git a/apps/blog/content/blog/accelerate-preview-release-ab229e69ed2/index.mdx b/apps/blog/content/blog/accelerate-preview-release-ab229e69ed2/index.mdx index 1047594c41..c4a8d09768 100644 --- a/apps/blog/content/blog/accelerate-preview-release-ab229e69ed2/index.mdx +++ b/apps/blog/content/blog/accelerate-preview-release-ab229e69ed2/index.mdx @@ -6,9 +6,12 @@ authors: - "Ankur Datta" metaTitle: "Accelerate in Preview: Global Database Cache & Scalable Connection Pool" metaDescription: "Accelerate is going into Preview! Learn how to enable high-speed, scalable applications with a global cache and connection pooler." -metaImagePath: "/blog/accelerate-preview-release-ab229e69ed2/imgs/meta-3a75c0ed5f8837980765d5b7589367216653d6b7-1266x711.png" -heroImagePath: "/blog/accelerate-preview-release-ab229e69ed2/imgs/hero-587aeef34568af2258cd4e5f0453710b0b94259c-844x474.svg" +metaImagePath: "/accelerate-preview-release-ab229e69ed2/imgs/meta-3a75c0ed5f8837980765d5b7589367216653d6b7-1266x711.png" +heroImagePath: "/accelerate-preview-release-ab229e69ed2/imgs/hero-587aeef34568af2258cd4e5f0453710b0b94259c-844x474.svg" heroImageAlt: "Accelerate in Preview" +tags: + - "announcement" + - "data-platform" excerpt: | [Prisma Accelerate](https://www.prisma.io/data-platform/accelerate) is now available to everyone in Preview! Make your application faster with our powerful global cache and scalable connection pooler. [Get started now](https://pris.ly/pdp), and let us know what you think. diff --git a/apps/blog/content/blog/accelerate-static-ip-support/index.mdx b/apps/blog/content/blog/accelerate-static-ip-support/index.mdx index 88bcf7a10f..869c8dabe0 100644 --- a/apps/blog/content/blog/accelerate-static-ip-support/index.mdx +++ b/apps/blog/content/blog/accelerate-static-ip-support/index.mdx @@ -6,9 +6,12 @@ authors: - "Ankur Datta" metaTitle: "Increase Database Security With Static IP Support in Prisma Accelerate" metaDescription: "Prisma Accelerate now supports Static IPs, ensuring secure database connections with predictable IPs for controlled access." -metaImagePath: "/blog/accelerate-static-ip-support/imgs/meta-9a5f27696242c051a689abed3d4b7099a8145301-1200x674.png" -heroImagePath: "/blog/accelerate-static-ip-support/imgs/hero-06da453a2597f2571d34972ec912ad3c32f37ba6-844x474.svg" +metaImagePath: "/accelerate-static-ip-support/imgs/meta-9a5f27696242c051a689abed3d4b7099a8145301-1200x674.png" +heroImagePath: "/accelerate-static-ip-support/imgs/hero-06da453a2597f2571d34972ec912ad3c32f37ba6-844x474.svg" heroImageAlt: "Enable Static IP in Prisma Accelerate" +tags: + - "announcement" + - "data-platform" excerpt: | [Prisma Accelerate](https://www.prisma.io/data-platform/accelerate) introduces Static IP support, enabling secure connections to your database with predictable IPs for controlled access and minimized exposure. This allows connections from Accelerate to databases requiring trusted IP access. --- @@ -29,21 +32,21 @@ By layering these defenses, you can better protect your database from various ty To add one layer of these security measures, you can restrict database access from the public internet by configuring firewalls and IP allowlists to limit access to trusted IP addresses. It becomes possible if the IP addresses that require access to your database are static IP addresses. -![Access request to your database from unauthorized IP](/blog/accelerate-static-ip-support/imgs/150247eeac00c5b575e06024aec82d5bf08eb57e-2960x1406.png) +![Access request to your database from unauthorized IP](/accelerate-static-ip-support/imgs/150247eeac00c5b575e06024aec82d5bf08eb57e-2960x1406.png) A static IP address is an IPv4 or an IPv6 address that doesn’t change. Unlike dynamic IP addresses, which can change unpredictably, traffic from static IP addresses are easier to identify. -![Dynamic vs Static IP](/blog/accelerate-static-ip-support/imgs/14f0c87eaa0bb42137006d8f8b0ad16b23ac648b-2960x988.png) +![Dynamic vs Static IP](/accelerate-static-ip-support/imgs/14f0c87eaa0bb42137006d8f8b0ad16b23ac648b-2960x988.png) Using static IP addresses benefits managing and securing traffic by allowing you to configure your network firewalls or set up IP allowlisting to restrict access to your resources from specific IP addresses that don’t change. Enabling static IP within your Prisma Accelerate configuration in a project environment allows using Accelerate with databases that have IP allowlisting enabled. -![Allow Accelerate](/blog/accelerate-static-ip-support/imgs/5fba5bb200c4418e360b6a4114e3a0d3c16d7fab-791x344.png) +![Allow Accelerate](/accelerate-static-ip-support/imgs/5fba5bb200c4418e360b6a4114e3a0d3c16d7fab-791x344.png) You can add the Accelerate static IP address in the database firewall IP allowlist or permit access to the IP address within your private network. This ensures that Accelerate can securely access your database while other unauthorized requests to your database are denied. -![Allow accelerate traffic and deny unknown traffic](/blog/accelerate-static-ip-support/imgs/d1f333f72a4431083fafc0eb1f25ba8c3c7203b6-1480x703.png) +![Allow accelerate traffic and deny unknown traffic](/accelerate-static-ip-support/imgs/d1f333f72a4431083fafc0eb1f25ba8c3c7203b6-1480x703.png) ## Enable static IP in Prisma Accelerate @@ -54,10 +57,10 @@ To enable static IP support for Accelerate within your existing or new project e Users can opt-in to using static IP in the Platform Console in two ways: 1. When enabling Accelerate for your project environment, opt-in to static IP after specifying your database connection string and connection pool region. - ![Enable static IP when enabling Accelerate](/blog/accelerate-static-ip-support/imgs/970ae13572758d9962b6cc0b72b7e5a8c1af341b-2978x1976.png) + ![Enable static IP when enabling Accelerate](/accelerate-static-ip-support/imgs/970ae13572758d9962b6cc0b72b7e5a8c1af341b-2978x1976.png) 2. For projects already using Accelerate, enable static IP by navigating to Accelerate settings in your project environment. - ![Enable static IP when updating Accelerate configuration](/blog/accelerate-static-ip-support/imgs/3be45327e6177e94ffb2739a1face51226c6ce5f-2572x1570.png) + ![Enable static IP when updating Accelerate configuration](/accelerate-static-ip-support/imgs/3be45327e6177e94ffb2739a1face51226c6ce5f-2572x1570.png) After you enable static IP within your Prisma Accelerate configuration, you’ll see a list of IPv4 and IPv6 addresses , which you will use to allow Accelerate traffic to your database. diff --git a/apps/blog/content/blog/advanced-database-schema-management-with-atlas-and-prisma-orm/index.mdx b/apps/blog/content/blog/advanced-database-schema-management-with-atlas-and-prisma-orm/index.mdx index e4ef5c271a..abbb4334cf 100644 --- a/apps/blog/content/blog/advanced-database-schema-management-with-atlas-and-prisma-orm/index.mdx +++ b/apps/blog/content/blog/advanced-database-schema-management-with-atlas-and-prisma-orm/index.mdx @@ -6,8 +6,11 @@ authors: - "Nikolas Burk" metaTitle: "Advanced Database Schema Management with Atlas & Prisma ORM" metaDescription: "Atlas is a powerful data modeling and migrations tool enabling advanced DB schema management workflows, like CI/CD, schema monitoring, versioning, and more." -metaImagePath: "/blog/advanced-database-schema-management-with-atlas-and-prisma-orm/imgs/meta-862a4191726cfb1bcc2e53bc83e377e1af47cd5d-1200x675.png" -heroImagePath: "/blog/advanced-database-schema-management-with-atlas-and-prisma-orm/imgs/hero-6ad0def91299fbf2a745f528d83a194350d0ee74-844x475.svg" +metaImagePath: "/advanced-database-schema-management-with-atlas-and-prisma-orm/imgs/meta-862a4191726cfb1bcc2e53bc83e377e1af47cd5d-1200x675.png" +heroImagePath: "/advanced-database-schema-management-with-atlas-and-prisma-orm/imgs/hero-6ad0def91299fbf2a745f528d83a194350d0ee74-844x475.svg" +tags: + - "orm" + - "education" excerpt: | [Atlas](https://atlasgo.io/) is a powerful migration tool that enables advanced database schema management workflows, like CI/CD, schema monitoring, versioning, and more. Learn how to use Atlas together with Prisma ORM and make use of Atlas' capabilities by using low-level database features. --- diff --git a/apps/blog/content/blog/all-you-need-to-know-about-apollo-client-2-7e27e36d62fd/index.mdx b/apps/blog/content/blog/all-you-need-to-know-about-apollo-client-2-7e27e36d62fd/index.mdx index 9f67d07083..a0bc17152c 100644 --- a/apps/blog/content/blog/all-you-need-to-know-about-apollo-client-2-7e27e36d62fd/index.mdx +++ b/apps/blog/content/blog/all-you-need-to-know-about-apollo-client-2-7e27e36d62fd/index.mdx @@ -5,8 +5,8 @@ date: "2017-11-07" authors: - "Nikolas Burk" metaTitle: "All you need to know about Apollo Client 2 | Prisma" -metaImagePath: "/blog/all-you-need-to-know-about-apollo-client-2-7e27e36d62fd/imgs/hero-ebd9548e6d9cfb33c4e35eac48e11a80532a8d30-1440x960.jpg" -heroImagePath: "/blog/all-you-need-to-know-about-apollo-client-2-7e27e36d62fd/imgs/hero-ebd9548e6d9cfb33c4e35eac48e11a80532a8d30-1440x960.jpg" +metaImagePath: "/all-you-need-to-know-about-apollo-client-2-7e27e36d62fd/imgs/hero-ebd9548e6d9cfb33c4e35eac48e11a80532a8d30-1440x960.jpg" +heroImagePath: "/all-you-need-to-know-about-apollo-client-2-7e27e36d62fd/imgs/hero-ebd9548e6d9cfb33c4e35eac48e11a80532a8d30-1440x960.jpg" heroImageAlt: "All you need to know about Apollo Client 2" excerpt: | Apollo Client, a powerful and flexible GraphQL client library, just reached version 2.0. In this post, we want to diff --git a/apps/blog/content/blog/ambassador-program-nxkwgcgnuvfx/index.mdx b/apps/blog/content/blog/ambassador-program-nxkwgcgnuvfx/index.mdx index a33c4deb5a..d2e983f436 100644 --- a/apps/blog/content/blog/ambassador-program-nxkwgcgnuvfx/index.mdx +++ b/apps/blog/content/blog/ambassador-program-nxkwgcgnuvfx/index.mdx @@ -7,9 +7,11 @@ authors: - "Nikolas Burk" metaTitle: "Announcing the Prisma Ambassador Program — Building A Community of Experts" metaDescription: "We are thrilled to announce the launch of the Ambassador Program to empower the Prisma community, while also helping individual contributors build their own brand." -metaImagePath: "/blog/ambassador-program-nxkwgcgnuvfx/imgs/meta-de28b5e0df55c52078065ee2ae0b44d6cdf0da1e-1692x852.png" -heroImagePath: "/blog/ambassador-program-nxkwgcgnuvfx/imgs/hero-1bdf6237d95ded8d448f28db203012147fdcd39e-846x426.png" +metaImagePath: "/ambassador-program-nxkwgcgnuvfx/imgs/meta-de28b5e0df55c52078065ee2ae0b44d6cdf0da1e-1692x852.png" +heroImagePath: "/ambassador-program-nxkwgcgnuvfx/imgs/hero-1bdf6237d95ded8d448f28db203012147fdcd39e-846x426.png" heroImageAlt: "Prisma Ambassador Program — Building A Community of Experts" +tags: + - "announcement" excerpt: | We are thrilled to announce the [Prisma Ambassador Program](https://www.prisma.io/ambassador) to empower the Prisma community, while also helping individual contributors build their own brand. diff --git a/apps/blog/content/blog/amplication-customer-story-nmlkbnlllxnn/index.mdx b/apps/blog/content/blog/amplication-customer-story-nmlkbnlllxnn/index.mdx index 0f195dbb66..82559cd9eb 100644 --- a/apps/blog/content/blog/amplication-customer-story-nmlkbnlllxnn/index.mdx +++ b/apps/blog/content/blog/amplication-customer-story-nmlkbnlllxnn/index.mdx @@ -6,9 +6,11 @@ authors: - "Alex Emerich" metaTitle: "How Prisma helps Amplication evolutionize backend development" metaDescription: "How Prisma helps Amplication evolutionize backend development" -metaImagePath: "/blog/amplication-customer-story-nmlkbnlllxnn/imgs/meta-4baa84e48a0da8e13e23367137d5a17515119aaf-2881x1620.png" -heroImagePath: "/blog/amplication-customer-story-nmlkbnlllxnn/imgs/hero-b1fb9ec0c8fca054011688621bfe51ea1836af10-844x474.svg" +metaImagePath: "/amplication-customer-story-nmlkbnlllxnn/imgs/meta-4baa84e48a0da8e13e23367137d5a17515119aaf-2881x1620.png" +heroImagePath: "/amplication-customer-story-nmlkbnlllxnn/imgs/hero-b1fb9ec0c8fca054011688621bfe51ea1836af10-844x474.svg" heroImageAlt: "How Prisma helps Amplication evolutionize backend development" +tags: + - "usersuccessstory" excerpt: | [Amplication](https://amplication.com/) is an open-source development tool. It helps you develop quality Node.js applications without spending time on repetitive coding tasks. It’s perfect for both backend and fullstack developers. @@ -27,7 +29,7 @@ Working at larger companies, [Amplication](https://amplication.com/) founder, Yu With Amplication, you can easily create data models and configure role-based access control with a simple and intuitive UI (or even [via their CLI](https://github.com/amplication/amplication/tree/master/packages/amplication-cli#amp-entitiescreate-displayname)). Based on these model definitions, Amplication generates production-ready, yet fully customizable, application code. This code is continuously pushed to your GitHub repository, and you get a dedicated Docker container to house your database, a Node.js application, and a React client. -![Amplication UI](/blog/amplication-customer-story-nmlkbnlllxnn/imgs/amplication-ui.png) +![Amplication UI](/amplication-customer-story-nmlkbnlllxnn/imgs/amplication-ui.png) For fullstack developers, their repetitive coding tasks are taken care of, but they still retain **complete ownership** of the code to deploy where they wish and are free to download the generated app code and continue development elsewhere. @@ -48,7 +50,7 @@ For the server side you get: - [Jest](https://jestjs.io/): A delightful JavaScript testing framework with a focus on simplicity - [Docker](https://www.docker.com/): An open platform for developing, shipping, and running applications -![Generated App Server-side Architecture](/blog/amplication-customer-story-nmlkbnlllxnn/imgs/amplication-prisma-diagram2.png) +![Generated App Server-side Architecture](/amplication-customer-story-nmlkbnlllxnn/imgs/amplication-prisma-diagram2.png) The Amplication team strongly believes in open-source technology and a user focused community, so they made sure this belief was at the center of the tools they bring their users. diff --git a/apps/blog/content/blog/announcing-accelerate-usrvpi6sfkv4/index.mdx b/apps/blog/content/blog/announcing-accelerate-usrvpi6sfkv4/index.mdx index 782b0fb527..db51c062e6 100644 --- a/apps/blog/content/blog/announcing-accelerate-usrvpi6sfkv4/index.mdx +++ b/apps/blog/content/blog/announcing-accelerate-usrvpi6sfkv4/index.mdx @@ -6,9 +6,12 @@ authors: - "Andrew Carlson" metaTitle: "Prisma | Introducing Accelerate in Early Access" metaDescription: "Query up to 1000x faster on any Prisma-supported database with our new distributed cache and scalable connection pool for Serverless apps." -metaImagePath: "/blog/announcing-accelerate-usrvpi6sfkv4/imgs/meta-25afee16878423e24c7aff2bb3fe49a433996d03-1200x631.png" -heroImagePath: "/blog/announcing-accelerate-usrvpi6sfkv4/imgs/hero-9c6258461d73719cebc60136dd4e976d79306dcb-845x475.svg" +metaImagePath: "/announcing-accelerate-usrvpi6sfkv4/imgs/meta-25afee16878423e24c7aff2bb3fe49a433996d03-1200x631.png" +heroImagePath: "/announcing-accelerate-usrvpi6sfkv4/imgs/hero-9c6258461d73719cebc60136dd4e976d79306dcb-845x475.svg" heroImageAlt: "Introducing Accelerate in Early Access" +tags: + - "announcement" + - "data-platform" excerpt: | Query up to 1000x faster on any Prisma-supported database with our distributed cache and scalable connection pool for Serverless apps. diff --git a/apps/blog/content/blog/announcing-discord-1liaops7lxv9/index.mdx b/apps/blog/content/blog/announcing-discord-1liaops7lxv9/index.mdx index 6fb8ab01cf..fb76f75c78 100644 --- a/apps/blog/content/blog/announcing-discord-1liaops7lxv9/index.mdx +++ b/apps/blog/content/blog/announcing-discord-1liaops7lxv9/index.mdx @@ -6,9 +6,11 @@ authors: - "Jon Harrell" metaTitle: "Building on an Established Community: Prisma Now on Discord" metaDescription: "Prisma is excited to expand the established Prisma Community Discord and further collaborate with the Prisma community." -metaImagePath: "/blog/announcing-discord-1liaops7lxv9/imgs/meta-388b596e6a40f7eeaf42604a4645c93dd051af6a-1267x712.png" -heroImagePath: "/blog/announcing-discord-1liaops7lxv9/imgs/hero-7ae00282956a1f6a68f815b4cffee5ee1b1ce934-844x474.svg" +metaImagePath: "/announcing-discord-1liaops7lxv9/imgs/meta-388b596e6a40f7eeaf42604a4645c93dd051af6a-1267x712.png" +heroImagePath: "/announcing-discord-1liaops7lxv9/imgs/hero-7ae00282956a1f6a68f815b4cffee5ee1b1ce934-844x474.svg" heroImageAlt: "Prisma Now on Discord" +tags: + - "announcement" excerpt: | We are more than excited to join [Discord](https://discord.gg/KQyTW2H5ca)! Read to learn more about how we're approaching our Discord community, what to expect from it and how you can join. @@ -44,7 +46,7 @@ From code repositories to social media feeds, Discord's integration capabilities With features like Stage Channels, we can host live events, AMAs, webinars, and more, encouraging real-time interaction between our team and the community. -![](/blog/announcing-discord-1liaops7lxv9/imgs/discord-screenshot.png) +![](/announcing-discord-1liaops7lxv9/imgs/discord-screenshot.png) We're incredibly excited to embark on this new chapter on Discord and look forward to enhancing the sense of camaraderie and collaboration that the Prisma community is known for. So whether you're an old member or a newcomer, we welcome you to join us on this exciting journey! diff --git a/apps/blog/content/blog/announcing-on-demand-cache-invalidation-for-prisma-accelerate/index.mdx b/apps/blog/content/blog/announcing-on-demand-cache-invalidation-for-prisma-accelerate/index.mdx index 2540adbcf6..071038e4d3 100644 --- a/apps/blog/content/blog/announcing-on-demand-cache-invalidation-for-prisma-accelerate/index.mdx +++ b/apps/blog/content/blog/announcing-on-demand-cache-invalidation-for-prisma-accelerate/index.mdx @@ -6,9 +6,12 @@ authors: - "Ankur Datta" metaTitle: "On-Demand Cache Invalidation Now Available in Prisma Accelerate" metaDescription: "Boost app performance with precise control using Prisma's on-demand cache invalidation." -metaImagePath: "/blog/announcing-on-demand-cache-invalidation-for-prisma-accelerate/imgs/meta-40c9facc0c25985278c069ade326008e14baef9a-1266x711.png" -heroImagePath: "/blog/announcing-on-demand-cache-invalidation-for-prisma-accelerate/imgs/hero-4100fa47bccf0620564331dda7e0c65bcd069ef2-844x474.svg" +metaImagePath: "/announcing-on-demand-cache-invalidation-for-prisma-accelerate/imgs/meta-40c9facc0c25985278c069ade326008e14baef9a-1266x711.png" +heroImagePath: "/announcing-on-demand-cache-invalidation-for-prisma-accelerate/imgs/hero-4100fa47bccf0620564331dda7e0c65bcd069ef2-844x474.svg" heroImageAlt: "Prisma Accelerate's cache invalidation API in a code block" +tags: + - "data-platform" + - "newrelease-feature" excerpt: | Caching with Prisma Accelerate can significantly boost performance for read-heavy applications while reducing strain on your database. On-demand cache invalidation gives you precise control over refreshes, simplifying management and optimization while ensuring that up-to-date information is always served. --- @@ -18,7 +21,7 @@ excerpt: | Caching stores frequently accessed data in a temporary layer for quicker access, minimizing the need for repeated fetching from the original source. Prisma Accelerate caches data in the location closest to your server to provide faster data retrieval. > Explore our [speed test](https://accelerate-speed-test.prisma.io/) to experience firsthand how caching can dramatically improve your application's performance. -> ![Prisma Accelerate speed test result GIF](/blog/announcing-on-demand-cache-invalidation-for-prisma-accelerate/imgs/46cf59b4dcf666cc403923788d01a5eb0c959970-870x804.gif) +> ![Prisma Accelerate speed test result GIF](/announcing-on-demand-cache-invalidation-for-prisma-accelerate/imgs/46cf59b4dcf666cc403923788d01a5eb0c959970-870x804.gif) > **Benefits of caching:** diff --git a/apps/blog/content/blog/announcing-prisma-2-n0v98rzc8br1/index.mdx b/apps/blog/content/blog/announcing-prisma-2-n0v98rzc8br1/index.mdx index 2d3693ac64..13d36c247f 100644 --- a/apps/blog/content/blog/announcing-prisma-2-n0v98rzc8br1/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-2-n0v98rzc8br1/index.mdx @@ -5,8 +5,8 @@ date: "2020-06-09" authors: - "Nikolas Burk" metaTitle: "Announcing Prisma 2: Confidence and productivity for your database" -metaImagePath: "/blog/announcing-prisma-2-n0v98rzc8br1/imgs/hero-11436ec45c7ccbc812212d1d6d7c8794d9514f2f-1692x852.jpg" -heroImagePath: "/blog/announcing-prisma-2-n0v98rzc8br1/imgs/hero-11436ec45c7ccbc812212d1d6d7c8794d9514f2f-1692x852.jpg" +metaImagePath: "/announcing-prisma-2-n0v98rzc8br1/imgs/hero-11436ec45c7ccbc812212d1d6d7c8794d9514f2f-1692x852.jpg" +heroImagePath: "/announcing-prisma-2-n0v98rzc8br1/imgs/hero-11436ec45c7ccbc812212d1d6d7c8794d9514f2f-1692x852.jpg" heroImageAlt: " Ombre Prisma" excerpt: | Accessing databases in Node.js and TypeScript can feel brittle and painful. Prisma removes the pain with an auto-generated and type-safe query builder that's tailored to your data! [Try it out!](https://www.prisma.io/docs/getting-started/quickstart) @@ -74,7 +74,7 @@ As an example, assume you have these `User` and `Post` tables: -![Entity Relationship Diagram](/blog/announcing-prisma-2-n0v98rzc8br1/imgs/cQRivY4.png) +![Entity Relationship Diagram](/announcing-prisma-2-n0v98rzc8br1/imgs/cQRivY4.png) ```sql CREATE TABLE "User" ( @@ -378,7 +378,7 @@ it now takes half a day to implement something that used to take two or three. Server-side applications typically expose an _API_ that's consumed by frontend (e.g. web or mobile) or other apps. Prisma Client is compatible with all existing API technologies, such as REST, GraphQL, Thrift, or gRPC. -![REST, GraphQL, Thrift, gRPC and more](/blog/announcing-prisma-2-n0v98rzc8br1/imgs/kPGJU6j.png) +![REST, GraphQL, Thrift, gRPC and more](/announcing-prisma-2-n0v98rzc8br1/imgs/kPGJU6j.png) ### Prisma works with various deployment models diff --git a/apps/blog/content/blog/announcing-prisma-2-zq1s745db8i5/index.mdx b/apps/blog/content/blog/announcing-prisma-2-zq1s745db8i5/index.mdx index 405a445b5e..40d0b82994 100644 --- a/apps/blog/content/blog/announcing-prisma-2-zq1s745db8i5/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-2-zq1s745db8i5/index.mdx @@ -5,8 +5,8 @@ date: "2019-06-18" authors: - "Nikolas Burk" metaTitle: "Type-safe Database Access & Declarative Migrations | Prisma 2 Preview" -metaImagePath: "/blog/announcing-prisma-2-zq1s745db8i5/imgs/hero-34a26858c7de3cad0d84a376d12b58b82ee10da0-1200x630.png" -heroImagePath: "/blog/announcing-prisma-2-zq1s745db8i5/imgs/hero-34a26858c7de3cad0d84a376d12b58b82ee10da0-1200x630.png" +metaImagePath: "/announcing-prisma-2-zq1s745db8i5/imgs/hero-34a26858c7de3cad0d84a376d12b58b82ee10da0-1200x630.png" +heroImagePath: "/announcing-prisma-2-zq1s745db8i5/imgs/hero-34a26858c7de3cad0d84a376d12b58b82ee10da0-1200x630.png" heroImageAlt: "Prisma 2 Preview: Type-safe Database Access & Declarative Migrations" excerpt: | @@ -49,7 +49,7 @@ In recent years, many areas of application development have been modernized to f But what about the **database workflows** developers are dealing with every day? What's the next-generation tooling for **accessing databases** from within an application or for performing **schema migrations**? -![Confusion with data management](/blog/announcing-prisma-2-zq1s745db8i5/imgs/gqbGz7b.png) +![Confusion with data management](/announcing-prisma-2-zq1s745db8i5/imgs/gqbGz7b.png) For database access, developers can use traditional ORMs (e.g. [Sequelize](http://docs.sequelizejs.com) for Node.js or [GORM](https://github.com/jinzhu/gorm) for Go). While often beneficial to get a project off the ground, these aren't a good longterm fit as project complexity quickly outgrows the capabilities of traditional ORMs. @@ -68,7 +68,7 @@ Let's take a look at Photon and Lift in more detail. ### Photon – A type-safe database client to replace traditional ORMs -![Photon.js diagram](/blog/announcing-prisma-2-zq1s745db8i5/imgs/AG34kGB.png) +![Photon.js diagram](/announcing-prisma-2-zq1s745db8i5/imgs/AG34kGB.png) Photon is a type-safe database client that's auto-generated based on the Prisma data model (which is a representation of your database schema). It provides a powerful and lightweight layer of mapping code you can use to talk to a database in your application. @@ -76,7 +76,7 @@ It has a modern and ergonomic data access API that's tailored to the needs of ap ### Lift – Declarative data modeling & migrations -![Lift demo](/blog/announcing-prisma-2-zq1s745db8i5/imgs/bFUA7LC.png) +![Lift demo](/announcing-prisma-2-zq1s745db8i5/imgs/bFUA7LC.png) Lift is based on Prisma's declarative [data model definition](https://github.com/prisma/prisma2/blob/master/docs/data-modeling.md) which codifies your database schema(s). To migrate your database, you adjust the data model and "apply" the changes using the Lift CLI. @@ -423,7 +423,7 @@ The Prisma server that was required as a database proxy in Prisma 1 is now optio This is due to a fundamental architecture change: the query and migration engines that previously ran inside the Prisma server can now run as plain binaries alongside your application on the same host. -![Prisma client](/blog/announcing-prisma-2-zq1s745db8i5/imgs/l1Jg54Y.png) +![Prisma client](/announcing-prisma-2-zq1s745db8i5/imgs/l1Jg54Y.png) ### The Prisma core is rewritten in Rust diff --git a/apps/blog/content/blog/announcing-prisma-6-18-0/index.mdx b/apps/blog/content/blog/announcing-prisma-6-18-0/index.mdx index a30c1452d3..f318eec6df 100644 --- a/apps/blog/content/blog/announcing-prisma-6-18-0/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-6-18-0/index.mdx @@ -6,9 +6,12 @@ authors: - "Mike Hartington" metaTitle: "Prisma ORM 6.18.0, Postgres Database Metrics and Config Modernization" metaDescription: "Catch up on the lates 6.18.0 release for Prisma ORM and Prisma Postgres." -metaImagePath: "/blog/announcing-prisma-6-18-0/imgs/meta-85fc09231b7180336b63d1da7fe47a2520db99f5-1266x711.png" -heroImagePath: "/blog/announcing-prisma-6-18-0/imgs/hero-6903d477604982ce17726b525221e1e1de6eb1a1-844x474.svg" +metaImagePath: "/announcing-prisma-6-18-0/imgs/meta-85fc09231b7180336b63d1da7fe47a2520db99f5-1266x711.png" +heroImagePath: "/announcing-prisma-6-18-0/imgs/hero-6903d477604982ce17726b525221e1e1de6eb1a1-844x474.svg" heroImageAlt: "Prisma 6.18.0 Release " +tags: + - "newrelease-feature" + - "orm" excerpt: | We just released Prisma [6.18.0](https://github.com/prisma/prisma/releases/tag/6.18.0) with several bug fixes and improvments. Additionally, we added more support for the Prisma Config file to prepare for the next major release of Prisma ORM. --- @@ -17,7 +20,7 @@ excerpt: | Last release, we included a new workspace metrics overview, so folks can get a quick glance on their usage data across your entire workspace. Now, we’ve added more insights into your database usage with database metrics. -![](/blog/announcing-prisma-6-18-0/imgs/9393decb8beaf4ed3d4df4be8ab04809a83dcdfc-2880x1664.png) +![](/announcing-prisma-6-18-0/imgs/9393decb8beaf4ed3d4df4be8ab04809a83dcdfc-2880x1664.png) Here, you can view the usage of an individual database, with stats on: diff --git a/apps/blog/content/blog/announcing-prisma-6-19-0/index.mdx b/apps/blog/content/blog/announcing-prisma-6-19-0/index.mdx index 6e819e882b..3e87e071e8 100644 --- a/apps/blog/content/blog/announcing-prisma-6-19-0/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-6-19-0/index.mdx @@ -6,8 +6,12 @@ authors: - "Mike Hartington" metaTitle: "Announcing Prisma 6.19.0" metaDescription: "Prisma 6.19 release includes pooled Postgres connections and VS Code extension improvements" -metaImagePath: "/blog/announcing-prisma-6-19-0/imgs/meta-fab568a4879cfeb58a8405888c303ce5b6b279fb-1266x711.png" -heroImagePath: "/blog/announcing-prisma-6-19-0/imgs/hero-21b965afb8b247bc0f088a71d844d66b64d5da38-844x474.svg" +metaImagePath: "/announcing-prisma-6-19-0/imgs/meta-fab568a4879cfeb58a8405888c303ce5b6b279fb-1266x711.png" +heroImagePath: "/announcing-prisma-6-19-0/imgs/hero-21b965afb8b247bc0f088a71d844d66b64d5da38-844x474.svg" +tags: + - "prisma-postgres" + - "orm" + - "newrelease-feature" excerpt: | We just released Prisma 6.19.0 ORM, which includes several bug fixes and improvements. We’ve also included a bunch of improvements to managing your Prisma Postgres Connection, connection pooling, and local Prisma Postgres within VS Code. --- @@ -24,7 +28,7 @@ If you’re not using the Prisma extension for VS Code, Cursor, or Windsurf, you Now, we’ve updated the extension to support local Prisma Postgres without having to login. This has been a [frequently requested feature](https://github.com/prisma/language-tools/pull/1914), so we’re happy to get this done. We’ve also cleaned up the UI a bit to have a clearer separation between what is your local databases, and what is your remote databases. -![Local Prisma Postgres in VS Code without any login](/blog/announcing-prisma-6-19-0/imgs/000a48b9be0569e18d23dd3c38c25fb2af113b9e-3840x1632.png) +![Local Prisma Postgres in VS Code without any login](/announcing-prisma-6-19-0/imgs/000a48b9be0569e18d23dd3c38c25fb2af113b9e-3840x1632.png) ## Preparing for the future diff --git a/apps/blog/content/blog/announcing-prisma-day-50cg22nn40qk/index.mdx b/apps/blog/content/blog/announcing-prisma-day-50cg22nn40qk/index.mdx index a334cd386f..0515b5d232 100644 --- a/apps/blog/content/blog/announcing-prisma-day-50cg22nn40qk/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-day-50cg22nn40qk/index.mdx @@ -5,8 +5,8 @@ date: "2019-04-11" authors: - "Etel Sverdlov" metaTitle: "Prisma Day 2019 - community conference on modern app development" -metaImagePath: "/blog/announcing-prisma-day-50cg22nn40qk/imgs/meta-eeacc461f1965ed958af330fc9dc93f635920b43-1200x630.png" -heroImagePath: "/blog/announcing-prisma-day-50cg22nn40qk/imgs/hero-d719c9276cc4c57665d4a32cc5fdae5b5bfcad50-1200x630.png" +metaImagePath: "/announcing-prisma-day-50cg22nn40qk/imgs/meta-eeacc461f1965ed958af330fc9dc93f635920b43-1200x630.png" +heroImagePath: "/announcing-prisma-day-50cg22nn40qk/imgs/hero-d719c9276cc4c57665d4a32cc5fdae5b5bfcad50-1200x630.png" heroImageAlt: "Announcing Prisma Day the future of data" excerpt: | Announcing the first [Prisma Day](https://www.prisma.io/day), a one-day Prisma community conference on the diff --git a/apps/blog/content/blog/announcing-prisma-orm-7-0-0/index.mdx b/apps/blog/content/blog/announcing-prisma-orm-7-0-0/index.mdx index 9330c56e84..6e3932a7c3 100644 --- a/apps/blog/content/blog/announcing-prisma-orm-7-0-0/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-orm-7-0-0/index.mdx @@ -6,8 +6,10 @@ authors: - "Mike Hartington" metaTitle: "Prisma 7 Release: Rust-Free, Faster, and More Compatible" metaDescription: "Prisma ORM 7 delivers major performance gains, a Rust-free client, and a streamlined developer experience, plus deeper Prisma Postgres integration." -metaImagePath: "/blog/announcing-prisma-orm-7-0-0/imgs/meta-6b30aeef18d38ef00eb7b90286801660d84a9a0e-1266x711.png" -heroImagePath: "/blog/announcing-prisma-orm-7-0-0/imgs/hero-bbef45a84ff4bd03130bed3589b7d240c29ce325-844x474.svg" +metaImagePath: "/announcing-prisma-orm-7-0-0/imgs/meta-6b30aeef18d38ef00eb7b90286801660d84a9a0e-1266x711.png" +heroImagePath: "/announcing-prisma-orm-7-0-0/imgs/hero-bbef45a84ff4bd03130bed3589b7d240c29ce325-844x474.svg" +tags: + - "announcement" excerpt: | Today, we’re thrilled to announce the latest release of Prisma ORM and Prisma Postgres. Over the past year we focused on making it simpler and faster to build applications with Prisma, no matter what tools you use or where you deploy, with exceptional developer experience at the core. --- diff --git a/apps/blog/content/blog/announcing-prisma-orm-7-2-0/index.mdx b/apps/blog/content/blog/announcing-prisma-orm-7-2-0/index.mdx index 8368b9894b..461ad21d10 100644 --- a/apps/blog/content/blog/announcing-prisma-orm-7-2-0/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-orm-7-2-0/index.mdx @@ -6,8 +6,10 @@ authors: - "Mike Hartington" metaTitle: "Prisma ORM 7.2.0 Released: CLI Improvements, Bug Fixes & Better Configs" metaDescription: "Prisma ORM 7.2.0 is out with key improvements: the return of the --url flag, smarter prisma init configs for Node and Bun, better CLI errors, and fixes for @db.Money. Upgrade today." -metaImagePath: "/blog/announcing-prisma-orm-7-2-0/imgs/meta-e05db51030f5b58e706489c501174d1d00eb99ec-1266x711.png" -heroImagePath: "/blog/announcing-prisma-orm-7-2-0/imgs/hero-51b054f6d21361fc56212a05c7efd36b78e62ff3-844x474.svg" +metaImagePath: "/announcing-prisma-orm-7-2-0/imgs/meta-e05db51030f5b58e706489c501174d1d00eb99ec-1266x711.png" +heroImagePath: "/announcing-prisma-orm-7-2-0/imgs/hero-51b054f6d21361fc56212a05c7efd36b78e62ff3-844x474.svg" +tags: + - "orm" excerpt: | We just released Prisma ORM 7.2.0, which includes several bug fixes and improvements. We’ve also been reviewing community feedback on Prisma 7 and making adjustments to better support your needs. diff --git a/apps/blog/content/blog/announcing-prisma-playground-xeywknkj0e1p/index.mdx b/apps/blog/content/blog/announcing-prisma-playground-xeywknkj0e1p/index.mdx index ed5aa9f8ce..e09f709a4a 100644 --- a/apps/blog/content/blog/announcing-prisma-playground-xeywknkj0e1p/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-playground-xeywknkj0e1p/index.mdx @@ -6,9 +6,11 @@ authors: - "Nikolas Burk" metaTitle: "Prisma Playground: An Interactive Learning Experience for Prisma" metaDescription: "Explore the Prisma Client API to send database queries and Prisma Migrate worklfows to evolve your database schema in an interactive environment." -metaImagePath: "/blog/announcing-prisma-playground-xeywknkj0e1p/imgs/meta-470fec1fa04cf5fccadfadd70b449d857ee62116-1688x948.png" -heroImagePath: "/blog/announcing-prisma-playground-xeywknkj0e1p/imgs/hero-1735a3ccb59d21fc0d32410b0b3ac83242fcd020-844x474.svg" +metaImagePath: "/announcing-prisma-playground-xeywknkj0e1p/imgs/meta-470fec1fa04cf5fccadfadd70b449d857ee62116-1688x948.png" +heroImagePath: "/announcing-prisma-playground-xeywknkj0e1p/imgs/hero-1735a3ccb59d21fc0d32410b0b3ac83242fcd020-844x474.svg" heroImageAlt: "Prisma Playground: An Interactive Learning Experience for Prisma" +tags: + - "announcement" excerpt: | We are excited to announce [Prisma Playground](https://playground.prisma.io/), an interactive learning experience for the Prisma ORM. The Playground lets you explore Prisma Client queries and learn Prisma Migrate workflows in an isolated sandbox environment. @@ -41,7 +43,7 @@ If you're not yet using Prisma, be sure to visit the Playground to explore the P When getting started with the Prisma Playgroud, you can choose whether you want to learn about Prisma Client or Prisma Migrate. -![](/blog/announcing-prisma-playground-xeywknkj0e1p/imgs/playground-1.png) +![](/announcing-prisma-playground-xeywknkj0e1p/imgs/playground-1.png) Depending on what you choose, you'll end up in the interactive editor to send queries with Prisma Client or follow interactive guides that teach you Prisma Migrate workflows. @@ -55,13 +57,13 @@ While the explorer has a bunch of preconfigured queries, you're totally free to For convenience, the Prisma Client API explorer comes with initial sample data and a fixed schema that you can view by hitting the **`prisma/schema.prisma`** tab next to the **Run** button. -![](/blog/announcing-prisma-playground-xeywknkj0e1p/imgs/playground-2.png) +![](/announcing-prisma-playground-xeywknkj0e1p/imgs/playground-2.png) ### Learn Prisma Migrate workflows For Prisma Migrate, the Playground offers interactive guides that give instructions for you to learn about the various migration workflows Prisma Migrate supports, such as [creating a table](https://playground.prisma.io/guides/migrations_tables_create?step=0), [renaming a column](https://playground.prisma.io/guides/migrations_column_rename?step=0) or [defining a many-to-many relationship](https://playground.prisma.io/guides/relations_many-to-many-implicit?step=0). -![](/blog/announcing-prisma-playground-xeywknkj0e1p/imgs/playground-3.png) +![](/announcing-prisma-playground-xeywknkj0e1p/imgs/playground-3.png) ## Let us know what you think diff --git a/apps/blog/content/blog/announcing-prisma-postgres-early-access/index.mdx b/apps/blog/content/blog/announcing-prisma-postgres-early-access/index.mdx index 13ffbe5d19..0a13f7fa68 100644 --- a/apps/blog/content/blog/announcing-prisma-postgres-early-access/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-postgres-early-access/index.mdx @@ -6,8 +6,10 @@ authors: - "Nikolas Burk" metaTitle: "Prisma Postgres®: Building a Modern PostgreSQL Service Using Unikernels & MicroVMs" metaDescription: "At Prisma, we believe that deploying a database should be as simple as adding a new page in Notion. Today, we are excited to share the first milestone towards this vision: Prisma Postgres® gives developers an always-on database with pay-as-you-go pricing, thanks to our unique architecture design." -metaImagePath: "/blog/announcing-prisma-postgres-early-access/imgs/meta-6796d74a842eae9429254e7ed11b483985ba4e50-1266x711.png" -heroImagePath: "/blog/announcing-prisma-postgres-early-access/imgs/hero-153cb5a3d4a5447955824c28ae43788e7c407adf-633x356.png" +metaImagePath: "/announcing-prisma-postgres-early-access/imgs/meta-6796d74a842eae9429254e7ed11b483985ba4e50-1266x711.png" +heroImagePath: "/announcing-prisma-postgres-early-access/imgs/hero-153cb5a3d4a5447955824c28ae43788e7c407adf-633x356.png" +tags: + - "announcement" excerpt: | At Prisma, we believe that deploying a database should be as simple as adding a new page in Notion. Today, we are excited to share the first milestone towards this vision: Prisma Postgres® gives developers an _always-on_ database with _pay-as-you-go_ pricing — thanks to our unique architecture design. [Try it now!](https://www.prisma.io/docs/getting-started/quickstart-prismaPostgres) --- @@ -42,7 +44,7 @@ When using serverless databases, developers don't need to think about provisioni The promise of auto-scaling often means that a database can scale down to zero, i.e., it's _suspended_. This can lead to high query latencies and poor user experience when the database needs to be "woken up" after inactivity, for example: -![](/blog/announcing-prisma-postgres-early-access/imgs/36a57a880128c93e52193c963fc0c9889ea9df5a-1282x504.png) +![](/announcing-prisma-postgres-early-access/imgs/36a57a880128c93e52193c963fc0c9889ea9df5a-1282x504.png) *Source: [Vercel Docs | Vercel Postgres Limits](https://vercel.com/docs/storage/vercel-postgres/limits#vercel-postgres-cold-starts)* @@ -62,7 +64,7 @@ This difficulty has led companies like [PlanetScale](https://planetscale.com/blo What if you could get all the benefits of "serverless" without the drawbacks, like limited free tiers and cold starts? We are making this vision a reality by building a managed PostgreSQL service from the ground up. -![](/blog/announcing-prisma-postgres-early-access/imgs/f65bc24502ef9b28f0d5c7f3716e643015c62099-690x362.png) +![](/announcing-prisma-postgres-early-access/imgs/f65bc24502ef9b28f0d5c7f3716e643015c62099-690x362.png) Today, we are thrilled to share the first step in this direction: We've teamed up with [Unikraft](https://unikraft.cloud/) to provision PostgreSQL instances using [Unikraft Cloud](https://unikraft.cloud/docs/), a groundbreaking millisecond cloud platform that eliminates cold starts, enables millisecond scale-to-zero and auto-scale, and allows for thousands of instances to run on a single bare metal machine. @@ -93,7 +95,7 @@ Prisma Postgres is neither. Instead, it uses Unikraft Cloud and is based on a ne Let's take a closer look at Unikraft Cloud's millisecond cloud infrastructure: -![](/blog/announcing-prisma-postgres-early-access/imgs/8cf5361a40fdc079b0db4b848483b59f2e99d50b-1740x232.png) +![](/announcing-prisma-postgres-early-access/imgs/8cf5361a40fdc079b0db4b848483b59f2e99d50b-1740x232.png) To provide high efficiency and millisecond semantics, the Unikraft team had to optimize network components, cloud stack and application start time. Here's a quick overview of Unikraft Cloud's [core components](https://unikraft.cloud/how-it-works/) from the diagram above: @@ -141,7 +143,7 @@ Unikraft Cloud, which uses unikernels as one of its core components, provides th Through an extra compilation step, Unikraft turns a traditional fullstack application container into a unikernel binary image that includes only the resources needed to run it — think: a _specialized operating system tailored to the needs of each particular application_: -![](/blog/announcing-prisma-postgres-early-access/imgs/d7a8980c3be1841af6c46fee0683b93179052358-1114x592.png) +![](/announcing-prisma-postgres-early-access/imgs/d7a8980c3be1841af6c46fee0683b93179052358-1114x592.png) *Source: [Unikraft Cloud - How it works](https://unikraft.cloud/how-it-works)* @@ -149,13 +151,13 @@ Through an extra compilation step, Unikraft turns a traditional fullstack applic We've created the Prisma Postgres unikernel binary image in close collaboration with the Unikraft team. Here's the diagram of the Unikraft compilation process from before — but specialized for Prisma Postgres: -![](/blog/announcing-prisma-postgres-early-access/imgs/c5430a6cd6e3437dc71d217e3bee9d3b4755788c-2510x1290.png) +![](/announcing-prisma-postgres-early-access/imgs/c5430a6cd6e3437dc71d217e3bee9d3b4755788c-2510x1290.png) The Unikraft team managed to trim the original PostgreSQL image down from 280MB to 61MB. Here's a breakdown of the components of the **Prisma Postgres image**: -![](/blog/announcing-prisma-postgres-early-access/imgs/c356d781c1816fad242fac28520fbe6199a9deae-2888x1858.png) +![](/announcing-prisma-postgres-early-access/imgs/c356d781c1816fad242fac28520fbe6199a9deae-2888x1858.png) We reduced the image to about 20% of its original size by identifying and removing unnecessary packages from our deployment. The original PostgreSQL image includes a lot of generic functionality that isn't needed for Prisma Postgres. @@ -163,7 +165,7 @@ In our architecture, these specialized binary images are deployed as unikernels Thanks to unikraft, a single machine can host thousands of application (in our case: Prisma Postgres) instances: -![](/blog/announcing-prisma-postgres-early-access/imgs/90776da4721482b7372b74a8ace42afe009d86d2-1610x886.png) +![](/announcing-prisma-postgres-early-access/imgs/90776da4721482b7372b74a8ace42afe009d86d2-1610x886.png) ### Comparing standard virtual machines, containers & unikernels @@ -176,14 +178,14 @@ Unikernels take a first-principles approach to cloud deployment. In the cloud, a Everything in between the two is overhead. A unikernel adds the thinnest possible layer of software between the two such that the application can run on the hypervisor with the highest efficiency: -![](/blog/announcing-prisma-postgres-early-access/imgs/178696d9a18e3803db87032122e7ade619554c4e-2888x1236.png) +![](/announcing-prisma-postgres-early-access/imgs/178696d9a18e3803db87032122e7ade619554c4e-2888x1236.png) *Source: [Unikraft Docs - Virtualization](https://unikraft.org/docs/concepts/virtualization)* Here's a summary of the advantages unikernels have in comparison to standard VMs and containers: -![](/blog/announcing-prisma-postgres-early-access/imgs/beb4ebfa5c4f39105629e6aadc77554eeaea256d-1204x274.png) +![](/announcing-prisma-postgres-early-access/imgs/beb4ebfa5c4f39105629e6aadc77554eeaea256d-1204x274.png) Unikraft's mission is to "enable developers to create a specialized OS for every single application to ensure the best performance, security guarantees, and desired KPIs." @@ -205,7 +207,7 @@ Prisma Postgres is a major step towards our vision of providing a fully integrat Our suite of Prisma products ensures you can [build, fortify, and grow](https://www.prisma.io/blog/bfg) data-driven applications without worrying about data modeling, migrations, querying, or complex and expensive infrastructure (like Redis or Apache Kafka): -![](/blog/announcing-prisma-postgres-early-access/imgs/ebc7c8fd2fb5b811ead970edee0ae69150f6e25c-2888x1858.png) +![](/announcing-prisma-postgres-early-access/imgs/ebc7c8fd2fb5b811ead970edee0ae69150f6e25c-2888x1858.png) Here's an overview of what you get with Prisma: diff --git a/apps/blog/content/blog/announcing-prisma-postgres-for-ai-coding-agents/index.mdx b/apps/blog/content/blog/announcing-prisma-postgres-for-ai-coding-agents/index.mdx index e5ba41f744..71a382affd 100644 --- a/apps/blog/content/blog/announcing-prisma-postgres-for-ai-coding-agents/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-postgres-for-ai-coding-agents/index.mdx @@ -5,8 +5,10 @@ date: "2025-02-06" authors: - "Søren Bramer Schmidt" metaTitle: "Announcing: Instant Prisma Postgres for AI Coding Agents" -metaImagePath: "/blog/announcing-prisma-postgres-for-ai-coding-agents/imgs/meta-24be732ef3e8f019820d370b8a5f74ab14170fdc-1266x711.png" -heroImagePath: "/blog/announcing-prisma-postgres-for-ai-coding-agents/imgs/hero-6ad1b7b4a851a45e91418d443573f0c38accc78d-844x474.svg" +metaImagePath: "/announcing-prisma-postgres-for-ai-coding-agents/imgs/meta-24be732ef3e8f019820d370b8a5f74ab14170fdc-1266x711.png" +heroImagePath: "/announcing-prisma-postgres-for-ai-coding-agents/imgs/hero-6ad1b7b4a851a45e91418d443573f0c38accc78d-844x474.svg" +tags: + - "announcement" excerpt: | The rapidly evolving AI coding agent landscape demands new infrastructure solutions that can keep up with the accelerating pace of app development. Prisma Postgres' ability to provision DB instances in single-digit miliseconds and without authentication is the best way to build AI-powered apps. --- @@ -27,7 +29,7 @@ So what's the optimal approach to building fullstack applications while leveragi AI coding tools exist along a spectrum of abstraction, each offering different levels of assistance and control. Which tool to reach for depends on your very-own experience and individual goals. -![](/blog/announcing-prisma-postgres-for-ai-coding-agents/imgs/ed3b8387fd31f1db39c0fa35305107c611a6c9a4-1444x434.png) +![](/announcing-prisma-postgres-for-ai-coding-agents/imgs/ed3b8387fd31f1db39c0fa35305107c611a6c9a4-1444x434.png) Let’s take a closer look at the levels of abstractions and where to place the most popular AI software development tools. diff --git a/apps/blog/content/blog/announcing-prisma-s-mcp-server-vibe-code-with-prisma-postgres/index.mdx b/apps/blog/content/blog/announcing-prisma-s-mcp-server-vibe-code-with-prisma-postgres/index.mdx index 099dd3358e..d68d4593b6 100644 --- a/apps/blog/content/blog/announcing-prisma-s-mcp-server-vibe-code-with-prisma-postgres/index.mdx +++ b/apps/blog/content/blog/announcing-prisma-s-mcp-server-vibe-code-with-prisma-postgres/index.mdx @@ -6,8 +6,8 @@ authors: - "Nikolas Burk" metaTitle: "Announcing Prisma’s MCP Server: Vibe Code with Prisma Postgres" metaDescription: "With Prisma’s MCP server, Cursor, Windsurf and other AI tools, can now provision and manage Postgres databases for your apps.." -metaImagePath: "/blog/announcing-prisma-s-mcp-server-vibe-code-with-prisma-postgres/imgs/meta-0e15503386e31edce5fd389f4b2ee52b0f71a162-1266x711.png" -heroImagePath: "/blog/announcing-prisma-s-mcp-server-vibe-code-with-prisma-postgres/imgs/hero-7d96f16b30c6971db0da1e546a13a985ec47f6f3-844x474.svg" +metaImagePath: "/announcing-prisma-s-mcp-server-vibe-code-with-prisma-postgres/imgs/meta-0e15503386e31edce5fd389f4b2ee52b0f71a162-1266x711.png" +heroImagePath: "/announcing-prisma-s-mcp-server-vibe-code-with-prisma-postgres/imgs/hero-7d96f16b30c6971db0da1e546a13a985ec47f6f3-844x474.svg" excerpt: | With AI-native IDEs, we are all developing apps with remarkable speed. So much so that managing infrastructure is becoming the bottleneck. With [Prisma’s MCP server](https://www.prisma.io/docs/postgres/mcp-server), Cursor, Windsurf and other AI tools, can now provision and manage Postgres databases for your apps, so you don’t have to spend time fiddling with infrastructure. --- diff --git a/apps/blog/content/blog/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/index.mdx b/apps/blog/content/blog/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/index.mdx index 3dc96a97ba..ab4fc99ceb 100644 --- a/apps/blog/content/blog/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/index.mdx +++ b/apps/blog/content/blog/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/index.mdx @@ -6,8 +6,8 @@ authors: - "Ryan Chenkie" metaTitle: "Announcing Nexus 1.0: Type-Safe, Code-First GraphQL APIs | Prisma" metaDescription: "Nexus, the library for building code-first, type-safe GraphQL APIs has just reached 1.0." -metaImagePath: "/blog/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/imgs/meta-29585f8afef1e4c94930404a027807ca6ec0c2e3-2398x1208.png" -heroImagePath: "/blog/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/imgs/hero-807c11a11df0567a4b2ac96a0cac738b916d7416-1692x852.png" +metaImagePath: "/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/imgs/meta-29585f8afef1e4c94930404a027807ca6ec0c2e3-2398x1208.png" +heroImagePath: "/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/imgs/hero-807c11a11df0567a4b2ac96a0cac738b916d7416-1692x852.png" heroImageAlt: "Nexus 1.0: A Major Release for Type-Safe, Code-First GraphQL APIs" excerpt: | Prisma is a core contributor to Nexus, a library for building code-first and type-safe GraphQL APIs. Nexus has just reached 1.0. In this post, we'll recap what Nexus is and the value it brings and what's new at 1.0. @@ -371,7 +371,7 @@ JSDoc support provides an improved developer experience. The content of the docs - Links to the official docs - Links to the GraphQL spec -![JSDoc in Nexus](/blog/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/imgs/nexus-jsdoc.png) +![JSDoc in Nexus](/announcing-the-release-of-nexus-schema-v1-b5eno5g08d0b/imgs/nexus-jsdoc.png) #### Codesandbox Examples diff --git a/apps/blog/content/blog/announcing-typedsql-make-your-raw-sql-queries-type-safe-with-prisma-orm/index.mdx b/apps/blog/content/blog/announcing-typedsql-make-your-raw-sql-queries-type-safe-with-prisma-orm/index.mdx index 40d505ae9f..a43ceaf935 100644 --- a/apps/blog/content/blog/announcing-typedsql-make-your-raw-sql-queries-type-safe-with-prisma-orm/index.mdx +++ b/apps/blog/content/blog/announcing-typedsql-make-your-raw-sql-queries-type-safe-with-prisma-orm/index.mdx @@ -6,8 +6,12 @@ authors: - "Nikolas Burk" metaTitle: "Announcing TypedSQL: Make your raw SQL queries type-safe with Prisma ORM" metaDescription: "Prisma ORM now supports the ability to write raw sql queries and have the inputs and outputs be fully type-safe! Get the benefit of a high-level API with the power of raw SQL." -metaImagePath: "/blog/announcing-typedsql-make-your-raw-sql-queries-type-safe-with-prisma-orm/imgs/meta-6212889ff7d56ad41636c0f7938159b1fd740651-1688x948.png" -heroImagePath: "/blog/announcing-typedsql-make-your-raw-sql-queries-type-safe-with-prisma-orm/imgs/hero-9d1c710f959ab75107576ad53720a7731c75797a-844x474.png" +metaImagePath: "/announcing-typedsql-make-your-raw-sql-queries-type-safe-with-prisma-orm/imgs/meta-6212889ff7d56ad41636c0f7938159b1fd740651-1688x948.png" +heroImagePath: "/announcing-typedsql-make-your-raw-sql-queries-type-safe-with-prisma-orm/imgs/hero-9d1c710f959ab75107576ad53720a7731c75797a-844x474.png" +tags: + - "newrelease-feature" + - "orm" + - "announcement" excerpt: | With today’s [v5.19.0](https://github.com/prisma/prisma/releases/tag/5.19.0) release, Prisma ORM introduces a new way to write raw SQL queries in a type-safe way! You now get the best of both worlds with Prisma ORM: A convenient high-level abstraction for the majority of queries _and_ a flexible, type-safe escape hatch for raw SQL. --- diff --git a/apps/blog/content/blog/announcing-upcoming-course-8s41wdqrlgc7/index.mdx b/apps/blog/content/blog/announcing-upcoming-course-8s41wdqrlgc7/index.mdx index 69e80f9316..55c175a2b2 100644 --- a/apps/blog/content/blog/announcing-upcoming-course-8s41wdqrlgc7/index.mdx +++ b/apps/blog/content/blog/announcing-upcoming-course-8s41wdqrlgc7/index.mdx @@ -6,9 +6,11 @@ authors: - "Mahmoud Abdelwahab" metaTitle: "New Course: Fullstack App Using Next.js, GraphQL, TypeScript & Prisma TypeScript and Node.js ORM" metaDescription: "We are working on a course, where you are going to learn how to build a fullstack app using Next.js, GraphQL, TypeScript and Prisma!" -metaImagePath: "/blog/announcing-upcoming-course-8s41wdqrlgc7/imgs/hero-c4f6ff1ce0178636ddc08d50f408c042800bac92-1270x714.png" -heroImagePath: "/blog/announcing-upcoming-course-8s41wdqrlgc7/imgs/hero-c4f6ff1ce0178636ddc08d50f408c042800bac92-1270x714.png" +metaImagePath: "/announcing-upcoming-course-8s41wdqrlgc7/imgs/hero-c4f6ff1ce0178636ddc08d50f408c042800bac92-1270x714.png" +heroImagePath: "/announcing-upcoming-course-8s41wdqrlgc7/imgs/hero-c4f6ff1ce0178636ddc08d50f408c042800bac92-1270x714.png" heroImageAlt: "New Course: Fullstack App Using Next.js, GraphQL, TypeScript & Prisma" +tags: + - "education" excerpt: | We're thrilled to announce that we're working on a new course where you'll learn how to build a fullstack app using Next.js, GraphQL, TypeScript, and Prisma! diff --git a/apps/blog/content/blog/aws-marketplace/index.mdx b/apps/blog/content/blog/aws-marketplace/index.mdx index 1b8f0202a7..212db6ded9 100644 --- a/apps/blog/content/blog/aws-marketplace/index.mdx +++ b/apps/blog/content/blog/aws-marketplace/index.mdx @@ -6,9 +6,11 @@ authors: - "Nitin Gupta" metaTitle: "Prisma products are now available for purchase on AWS Marketplace" metaDescription: "AWS Marketplace customers can purchase Prisma products through AWS Marketplace." -metaImagePath: "/blog/aws-marketplace/imgs/meta-328edbc9eaafbce2d4e09174ee22a13f77e758d3-1266x711.png" -heroImagePath: "/blog/aws-marketplace/imgs/hero-f97462343e60a5322d236b809eaf9555aa725651-844x474.svg" +metaImagePath: "/aws-marketplace/imgs/meta-328edbc9eaafbce2d4e09174ee22a13f77e758d3-1266x711.png" +heroImagePath: "/aws-marketplace/imgs/hero-f97462343e60a5322d236b809eaf9555aa725651-844x474.svg" heroImageAlt: "Prisma on AWS Marketplace" +tags: + - "announcement" excerpt: | Customers can now purchase Prisma products through the familiar interface of AWS Marketplace and consolidate their infra spend under one billing system. --- diff --git a/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/index.mdx b/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/index.mdx index e5a4fa015e..dc9fa4ed3c 100644 --- a/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/index.mdx +++ b/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/index.mdx @@ -5,12 +5,11 @@ date: "2020-09-10" authors: - "Daniel Norman" metaTitle: "TypeScript, PostgreSQL, Prisma Backend | Authentication, Authorization" -metaImagePath: "/blog/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/imgs/meta-9eae0d75afddb1fce65c68320479268f4cdcffd3-1692x852.png" -heroImagePath: "/blog/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/imgs/hero-9f73d35216a42b2bb796a971053669fbc90e36ee-846x426.svg" +metaImagePath: "/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/imgs/meta-9eae0d75afddb1fce65c68320479268f4cdcffd3-1692x852.png" +heroImagePath: "/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/imgs/hero-9f73d35216a42b2bb796a971053669fbc90e36ee-846x426.svg" heroImageAlt: "Backend with TypeScript, PostgreSQL & Prisma: Authentication & Authz" series: title: "Building a modern backend with TypeScript, PostgreSQL and Prisma" - slug: "modern-backend-bdes2ps5kibb" seriesIndex: 3 excerpt: | In this third part of the series, we'll look at how to secure the REST API with passwordless authentication using Prisma for token storage and implement authorization. @@ -149,7 +148,7 @@ Email-based passwordless authentication is a two-step process that involves two The authentication flow will look as follows: -![](/blog/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/imgs/modern-backend-3-auth-flow.png) +![](/backend-prisma-typescript-orm-with-postgresql-auth-mngp1ps7kip4/imgs/modern-backend-3-auth-flow.png) 1. The user calls the `/login` endpoint in the API with the email in the payload to begin the authentication process. 2. If the email is new, the user is created in the _User_ table. diff --git a/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/index.mdx b/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/index.mdx index 39f6736de7..372d8548d9 100644 --- a/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/index.mdx +++ b/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/index.mdx @@ -5,12 +5,11 @@ date: "2020-07-30" authors: - "Daniel Norman" metaTitle: "TypeScript, PostgreSQL, Prisma | Data Modeling, CRUD, Aggregates" -metaImagePath: "/blog/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/imgs/hero-df67ee11927bde800c1ba033b94e182ab3565110-1692x852.png" -heroImagePath: "/blog/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/imgs/hero-df67ee11927bde800c1ba033b94e182ab3565110-1692x852.png" +metaImagePath: "/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/imgs/hero-df67ee11927bde800c1ba033b94e182ab3565110-1692x852.png" +heroImagePath: "/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/imgs/hero-df67ee11927bde800c1ba033b94e182ab3565110-1692x852.png" heroImageAlt: "Backend with TypeScript PostgreSQL & Prisma: Data Modeling & CRUD" series: title: "Building a modern backend with TypeScript, PostgreSQL and Prisma" - slug: "modern-backend-bdes2ps5kibb" seriesIndex: 1 excerpt: | This article is part of a series of [live streams](https://www.youtube.com/playlist?list=PLn2e1F9Rfr6k7ULe0gzQvtaXLoXrPqpki) and articles on building a backend with TypeScript, PostgreSQL, and Prisma. In this article, which summarizes the first live stream, we'll look at how to design the data model, perform CRUD operations, and query aggregates using Prisma. @@ -111,7 +110,7 @@ The online grading system will have the following entities: The entities can be visualized to demonstrate how they would be represented in a relational database (in this case PostgreSQL). The [diagram](https://dbdiagram.io/d/5f19635fe586385b4ff7a26d) below adds the columns relevant for each entity and foreign keys to describe the relationships between the entities. -![](/blog/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/imgs/grading-app-schema.png) +![](/backend-prisma-typescript-orm-with-postgresql-data-modeling-tsjs1ps7kip1/imgs/grading-app-schema.png) The first thing to note about the diagram is that every entity maps to a database table. diff --git a/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/index.mdx b/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/index.mdx index 12f955c568..085c788fea 100644 --- a/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/index.mdx +++ b/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/index.mdx @@ -5,12 +5,11 @@ date: "2020-09-17" authors: - "Daniel Norman" metaTitle: "TypeScript, PostgreSQL, Prisma | Continuous Integration & Deployment" -metaImagePath: "/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/hero-d3aa9c3e0b081fe4d675e11574d1bbcf8ea9de46-1692x852.png" -heroImagePath: "/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/hero-d3aa9c3e0b081fe4d675e11574d1bbcf8ea9de46-1692x852.png" +metaImagePath: "/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/hero-d3aa9c3e0b081fe4d675e11574d1bbcf8ea9de46-1692x852.png" +heroImagePath: "/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/hero-d3aa9c3e0b081fe4d675e11574d1bbcf8ea9de46-1692x852.png" heroImageAlt: "Backend with TypeScript, PostgreSQL & Prisma: CI & Deployment" series: title: "Building a modern backend with TypeScript, PostgreSQL and Prisma" - slug: "modern-backend-bdes2ps5kibb" seriesIndex: 4 excerpt: | In this fourth part of the series, we'll configure continuous integration (CI) and continuous deployment (CD) with GitHub Actions to test and deploy the backend to Heroku. @@ -182,11 +181,11 @@ Begin by forking the [GitHub repository](https://github.com/2color/real-world-gr Once forked, go to the _actions_ tab on Github: -![](/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-actions-tab.png) +![](/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-actions-tab.png) Enable the workflow by clicking on the enable button: -![](/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-actions-enable.png) +![](/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-actions-enable.png) Now, when you push a commit to the repository, GitHub will run the workflow. @@ -251,21 +250,21 @@ heroku config:get DATABASE_URL The Heroku API key can be retrieved from your [Heroku account settings](https://dashboard.heroku.com/account): -![Heroku API key in the Heroku account settings](/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-heroku-api-key.png) +![Heroku API key in the Heroku account settings](/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-heroku-api-key.png) ### Creating the secrets in GitHub To create the four secrets, go to the repository settings and open the _Secrets_ tab: -![GitHub repository secrets](/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-github-no-secrets-arrow.png) +![GitHub repository secrets](/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-github-no-secrets-arrow.png) Click on **New secret**, use the name field for the secret name, e.g., `HEROKU_APP_NAME` and set the value: -![](/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-github-new-secret.png) +![](/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-github-new-secret.png) **Checkpoint:** After creating the four secrets, you should see the following: -![GitHub repository secrets](/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-github-secrets.png) +![GitHub repository secrets](/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-github-secrets.png) ## Defining the environment variables on Heroku @@ -296,17 +295,17 @@ git push ``` Once you have pushed a commit, go to the Actions tab of your GitHub repository and you should see the following: -![](/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run.png) +![](/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run.png) Click on the first row in the table with the commit message: -![](/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run-details.png) +![](/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run-details.png) ## Viewing the logs for the `test` job To view the logs for the `test` job, click on `test` which should allow you to view the logs for each step. For example, in the screenshot below, you can view the results of the tests: -![](/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run-test-job.png) +![](/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run-test-job.png) ## Verifying the deployment to Heroku @@ -314,7 +313,7 @@ To verify that `deploy` job successfully deployed to Heroku, click on `deploy` o ``` remote: https://***.herokuapp.com/ deployed to Heroku ``` -![](/blog/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run-deploy-job.png) +![](/backend-prisma-typescript-orm-with-postgresql-deployment-bbba1ps7kip5/imgs/modern-backend-4-workflow-run-deploy-job.png) To access the API from the browser, use the following Heroku CLI command, from the cloned repository folder: ``` diff --git a/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-rest-api-validation-dcba1ps7kip3/index.mdx b/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-rest-api-validation-dcba1ps7kip3/index.mdx index 3bea4e4049..2d88b748a3 100644 --- a/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-rest-api-validation-dcba1ps7kip3/index.mdx +++ b/apps/blog/content/blog/backend-prisma-typescript-orm-with-postgresql-rest-api-validation-dcba1ps7kip3/index.mdx @@ -5,12 +5,11 @@ date: "2020-08-20" authors: - "Daniel Norman" metaTitle: "TypeScript, PostgreSQL, Prisma Backend | REST API, Validation, Testing" -metaImagePath: "/blog/backend-prisma-typescript-orm-with-postgresql-rest-api-validation-dcba1ps7kip3/imgs/hero-21fe21324bb4e62111c88b37b71091676e29f616-1692x852.png" -heroImagePath: "/blog/backend-prisma-typescript-orm-with-postgresql-rest-api-validation-dcba1ps7kip3/imgs/hero-21fe21324bb4e62111c88b37b71091676e29f616-1692x852.png" +metaImagePath: "/backend-prisma-typescript-orm-with-postgresql-rest-api-validation-dcba1ps7kip3/imgs/hero-21fe21324bb4e62111c88b37b71091676e29f616-1692x852.png" +heroImagePath: "/backend-prisma-typescript-orm-with-postgresql-rest-api-validation-dcba1ps7kip3/imgs/hero-21fe21324bb4e62111c88b37b71091676e29f616-1692x852.png" heroImageAlt: "Backend with TypeScript, PostgreSQL & Prisma: REST, Validation & Tests" series: title: "Building a modern backend with TypeScript, PostgreSQL and Prisma" - slug: "modern-backend-bdes2ps5kibb" seriesIndex: 2 excerpt: | This article is part of a series of [live streams](https://www.youtube.com/playlist?list=PLn2e1F9Rfr6k7ULe0gzQvtaXLoXrPqpki) and articles on building a backend with TypeScript, PostgreSQL, and Prisma. In this article, we'll look at how to build a REST API, validate input, and testing the API. diff --git a/apps/blog/content/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/index.mdx b/apps/blog/content/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/index.mdx index df9ecf9f92..9bfa6fc806 100644 --- a/apps/blog/content/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/index.mdx +++ b/apps/blog/content/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/index.mdx @@ -6,9 +6,11 @@ authors: - "Ankur Datta" metaTitle: "Database Caching: A Double-Edged Sword? Examining the Pros and Cons" metaDescription: "Discover the advantages and hurdles of caching database query results. Learn how caching enhances performance, scalability, and resource utilization, while also delving into the associated challenges." -metaImagePath: "/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/meta-72680f73691cdf86b51087621b4b0e79ac12fde7-1266x712.png" -heroImagePath: "/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/hero-ce90e81e707c3b5735077783e1db72216b8a56dd-844x474.svg" +metaImagePath: "/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/meta-72680f73691cdf86b51087621b4b0e79ac12fde7-1266x712.png" +heroImagePath: "/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/hero-ce90e81e707c3b5735077783e1db72216b8a56dd-844x474.svg" heroImageAlt: "Database Caching" +tags: + - "education" excerpt: | Caching database query results can have amazing benefits for performance, cost efficiency and user experience! In this article, we'll talk about these benefits as well as the challenges and drawbacks of database @@ -33,15 +35,15 @@ excerpt: | When creating a web application, retrieving data from a database is essential. However, as your traffic and database size grows, database queries can become progressively slower. To provide fast responses to users, caching database query results can be a cost-effective and simple solution instead of implementing complex query optimizations or upgrading your database. -![Request response lifecycle without cache](/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/1-a-first-request.png) -![Request response lifecycle with cache](/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/1-b-subsequent.png) +![Request response lifecycle without cache](/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/1-a-first-request.png) +![Request response lifecycle with cache](/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/1-b-subsequent.png) ### Caching significantly improves performance Using a cache to store database query results can significantly boost the performance of your application. A database cache is much faster and usually hosted closer to the application server, which reduces the load on the main database, accelerates data retrieval, and minimizes network and query latency. -![Performance without cache](/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/2-a-without-cache.png) -![Performance with cache](/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/2-a-with-cache.png) +![Performance without cache](/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/2-a-without-cache.png) +![Performance with cache](/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/2-a-with-cache.png) #### Faster data retrieval @@ -57,8 +59,8 @@ By efficiently utilizing resources, system resources are freed up in both the da In addition to performance enhancements, caching also plays a crucial role in improving the scalability of your application, allowing it to handle increased loads and accommodate higher user concurrency and more extensive data volumes. -![Serving users with an application and a database](/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/3-a-without-cache.png) -![Serving users with an application, a cache and a database](/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/3-a-with-cache.png) +![Serving users with an application and a database](/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/3-a-without-cache.png) +![Serving users with an application, a cache and a database](/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/3-a-with-cache.png) #### Reduced application server and database load @@ -93,7 +95,7 @@ Time is crucial in determining when to invalidate the cache. Invalidating it too A cache can store a large amount of data, and it is difficult to know which cached data to invalidate when a subset of that data changes in the underlying database. Fine-grained cache invalidation can be an expensive operation, while coarse-grained invalidation results in unnecessary data being removed. -![Cache invalidation granularity](/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/5-a-granularity.png) +![Cache invalidation granularity](/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/5-a-granularity.png) #### Coherency @@ -101,7 +103,7 @@ When using a globally distributed cache, invalidating a cache item requires that A load balancer should be used between your application servers and distributed cache servers to manage traffic. Additionally, a synchronization mechanism is required to reflect changes across all cache nodes to prevent the serving of stale data. -![Syncronising cache nodes](/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/4-a-cache-syncronization.png) +![Syncronising cache nodes](/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/4-a-cache-syncronization.png) ### A caching system can be complicated to manage @@ -109,7 +111,7 @@ Hosting and managing a cache layer between your server and database requires add Situations such as a _cache avalanche_ may occur when, for some reason, the cache set or the cache system fails, or there is no data in the cache within a short period of time. When this happens, all concurrent traffic goes directly to the database, putting extensive pressure on it. As a result, there is a significant drop in application performance, which can cause downtime. -![Cache avalanche](/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/7-cache-avalanche.png) +![Cache avalanche](/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/7-cache-avalanche.png) To avoid such scenarios, proper planning, expertise, and ongoing maintenance are necessary to handle these complexities and ensure a reliable and high-performance caching infrastructure. @@ -119,7 +121,7 @@ Caching utilizes memory storage to enable fast data retrieval. However, managed To estimate the optimal cache size, historical usage patterns, workload characteristics, and anticipated growth should be taken into consideration. Scaling the cache capacity based on these insights ensures efficient resource utilization and performance while managing the cost of memory allocation against caching benefits. -![Managed cache capacity estimation](/blog/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/6-cache-utilization.png) +![Managed cache capacity estimation](/benefits-and-challenges-of-caching-database-query-results-x2s9ei21e8kq/imgs/6-cache-utilization.png) ### Synchronizing the cache globally is challenging diff --git a/apps/blog/content/blog/bfg/index.mdx b/apps/blog/content/blog/bfg/index.mdx index 1eab62ceed..5ff2cda091 100644 --- a/apps/blog/content/blog/bfg/index.mdx +++ b/apps/blog/content/blog/bfg/index.mdx @@ -7,9 +7,11 @@ authors: - "Nitin Gupta" metaTitle: "Explanation of Prisma's Build, Fortify, Grow (BFG) Framework" metaDescription: "An overview of how Prisma products interoperate at each stage and aid in enhancing data-driven application development." -metaImagePath: "/blog/bfg/imgs/meta-48f848dd9b8582c9e4ce13d14f2001a485d281d3-1266x711.png" -heroImagePath: "/blog/bfg/imgs/hero-9e46446f32d354d43e61580e8fc6f1855839e4e5-844x474.svg" +metaImagePath: "/bfg/imgs/meta-48f848dd9b8582c9e4ce13d14f2001a485d281d3-1266x711.png" +heroImagePath: "/bfg/imgs/hero-9e46446f32d354d43e61580e8fc6f1855839e4e5-844x474.svg" heroImageAlt: "Build, Fortify, Grow Framework" +tags: + - "announcement" excerpt: | Dive into Prisma’s ‘Build, Fortify, Grow’ framework. Learn how Prisma products interoperate at each stage of the framework, and aid in enhancing data-driven application development. --- diff --git a/apps/blog/content/blog/bringing-prisma-orm-to-react-native-and-expo/index.mdx b/apps/blog/content/blog/bringing-prisma-orm-to-react-native-and-expo/index.mdx index bb92258f90..56ed6413fa 100644 --- a/apps/blog/content/blog/bringing-prisma-orm-to-react-native-and-expo/index.mdx +++ b/apps/blog/content/blog/bringing-prisma-orm-to-react-native-and-expo/index.mdx @@ -6,8 +6,10 @@ authors: - "Søren Bramer Schmidt" metaTitle: "Bringing Prisma ORM to React Native and Expo" metaDescription: "Prisma ORM now provides Early Access support for React Native and Expo. The integration introduces reactive queries, using React hooks to auto-update the UI when the underlying data changes." -metaImagePath: "/blog/bringing-prisma-orm-to-react-native-and-expo/imgs/meta-289f00bdde5d5f308f3faa684d09f647974d77b6-1200x630.png" -heroImagePath: "/blog/bringing-prisma-orm-to-react-native-and-expo/imgs/hero-bbb1e7f6b0f7bef3d318fac96652548cad0ef0b5-844x474.svg" +metaImagePath: "/bringing-prisma-orm-to-react-native-and-expo/imgs/meta-289f00bdde5d5f308f3faa684d09f647974d77b6-1200x630.png" +heroImagePath: "/bringing-prisma-orm-to-react-native-and-expo/imgs/hero-bbb1e7f6b0f7bef3d318fac96652548cad0ef0b5-844x474.svg" +tags: + - "newrelease-feature" excerpt: | Prisma ORM now provides Early Access support for React Native and Expo, fulfilling a popular community request. The integration introduces *reactive queries*, using React hooks to auto-update the UI when the underlying data changes. --- diff --git a/apps/blog/content/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/index.mdx b/apps/blog/content/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/index.mdx index 8b95325470..72b781322d 100644 --- a/apps/blog/content/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/index.mdx +++ b/apps/blog/content/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/index.mdx @@ -5,9 +5,11 @@ date: "2020-12-17" authors: - "Ryan Chenkie" metaTitle: "How to build an App With Svelte and TypeScript | Prisma" -metaImagePath: "/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/meta-711f2d3f2094907c22c0ef2dd88e69992f950026-2400x1256.png" -heroImagePath: "/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/hero-0e8c20420d860a393f68694b8bab707306822df3-1692x852.png" +metaImagePath: "/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/meta-711f2d3f2094907c22c0ef2dd88e69992f950026-2400x1256.png" +heroImagePath: "/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/hero-0e8c20420d860a393f68694b8bab707306822df3-1692x852.png" heroImageAlt: "Build an App With Svelte and TypeScript" +tags: + - "education" excerpt: | TypeScript is all the rage across the whole stack and, increasingly, in every frontend framework. Svelte now comes with TypeScript support. Learn how to build a Svelte app using TypeScript and find out how you can get greater confidence and better developer ergonimics as you do. @@ -142,7 +144,7 @@ In `App.svelte`, import and use the `Users` component so we can see the results Refresh the page to make sure the results come through. -![GitHub users data being resolved from an API call](/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-2.png) +![GitHub users data being resolved from an API call](/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-2.png) Next, let's add a template to the `Users` component to render the data. We'll use an Await block, as well as an Each block to iterate over the users. @@ -185,11 +187,11 @@ We've adjusted the `getUsers` call to create a reactive declaration. This allows We're awaiting this promise using an Await block in the template and then using an Each block to loop over and display each entry. -![GitHub users data being resolved from an API call](/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-3.png) +![GitHub users data being resolved from an API call](/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-3.png) If you are using an editor that has TypeScript support such as VS Code, you should now see issues when trying to access the `avatar_url` and `login` properties. -![Type error when accessing properties in the template](/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-4.png) +![Type error when accessing properties in the template](/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-4.png) To fix this, we need to make our component aware of the type information for this data. @@ -344,7 +346,7 @@ The key thing to point out in this setup is that we have type safety for the inp userLogin={42} /> ``` -![Type error when passing an incorrect type to the UserDetails component](/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-5.png) +![Type error when passing an incorrect type to the UserDetails component](/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-5.png) Right now we have `any` applied as the return type to the `getUserDetails` function in `UserDetails.svelte`. Let's apply type-safety here by defining a type and using it. @@ -515,7 +517,7 @@ This will open up Prisma Studio in the browser at `http://locahost:5555`. We can click into the `User` table to view it. We can also take this opportunity to create some new data right through the UI. -![Adding a record using Prisma Studio](/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-7.png) +![Adding a record using Prisma Studio](/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-7.png) ### Create an Endpoint to Get the User Data @@ -589,7 +591,7 @@ In the Svelte project, let's swap our the github.com URL in the fetch call in `U With this simple change, we should now be getting data from our server instead of from GitHub. -![Svelte app pulling user data from our own API](/blog/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-8.png) +![Svelte app pulling user data from our own API](/build-an-app-with-svelte-and-typescript-pzdy3t93qatd/imgs/svelte-typescript-8.png) ## Wrapping Up diff --git a/apps/blog/content/blog/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/index.mdx b/apps/blog/content/blog/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/index.mdx index 3ebe39cfb2..31a0f61a9e 100644 --- a/apps/blog/content/blog/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/index.mdx +++ b/apps/blog/content/blog/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/index.mdx @@ -6,8 +6,12 @@ authors: - "Nikolas Burk" metaTitle: "Build Applications at the Edge with Prisma ORM & Cloudflare D1 (Preview)1" metaDescription: "Prisma ORM now supports Cloudflare D1 databases. Read this article to learn how to query D1 from a Cloudflare Worker." -metaImagePath: "/blog/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/meta-9804cde42d974d63b5a3b8bc951c13aeb9187101-1266x711.png" -heroImagePath: "/blog/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/hero-66fc05379af15d65fd3dd6d792c9a575db648895-844x474.png" +metaImagePath: "/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/meta-9804cde42d974d63b5a3b8bc951c13aeb9187101-1266x711.png" +heroImagePath: "/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/hero-66fc05379af15d65fd3dd6d792c9a575db648895-844x474.png" +tags: + - "announcement" + - "orm" + - "newrelease-feature" excerpt: | Cloudflare has been pioneering the edge computing landscape since the introduction of Workers in 2017. With [D1](https://developers.cloudflare.com/d1/), Cloudflare recently released a native serverless database. We’re excited to announce that you can now talk to D1 using Prisma ORM! --- @@ -48,7 +52,7 @@ At Prisma, we believe that Cloudflare is at the forefront of building the future [Supporting D1](https://github.com/prisma/prisma/issues/13310) has been one of the most popular feature requests for Prisma ORM on GitHub. -![](/blog/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/dece55108fc5c399e5466b8dc5d73e8e9509cab0-1480x1696.png) +![](/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/dece55108fc5c399e5466b8dc5d73e8e9509cab0-1480x1696.png) As a strong believer in Cloudflare as a technology provider, we're thrilled to share that you can now use Prisma ORM inside Cloudflare Workers (and Pages) to access a D1 database. @@ -76,7 +80,7 @@ This will bring up a CLI wizard. Select all the _default_ options by hitting **R At the end of the wizard, you should have a deployed Cloudflare Worker at the domain `https://prisma-d1-example.USERNAME.workers.dev` which simply renders "Hello World" in the browser: -![](/blog/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/0464e1fee8099d997e95b6aaa24a13ef5d40cbb8-1950x1392.png) +![](/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/0464e1fee8099d997e95b6aaa24a13ef5d40cbb8-1950x1392.png) ### 2. Initialize Prisma ORM @@ -300,7 +304,7 @@ npm run deploy As before, your deployed Worker is accessible via `https://prisma-d1-example.USERNAME.workers.dev`. If you navigate your browser to that URL, you should see the following data that's queried from your remote D1 database: -![](/blog/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/a695edcc461f4bc01a9eac9d3a103d8ef2ab9dfd-1960x1386.png) +![](/build-applications-at-the-edge-with-prisma-orm-and-cloudflare-d1-preview/imgs/a695edcc461f4bc01a9eac9d3a103d8ef2ab9dfd-1960x1386.png) Congratulations, you just deployed a Cloudflare Worker using D1 as a database and querying it via Prisma ORM 🎉 diff --git a/apps/blog/content/blog/caching-database-queries-with-prisma-accelerate/index.mdx b/apps/blog/content/blog/caching-database-queries-with-prisma-accelerate/index.mdx index a438c41fff..eeb80187a3 100644 --- a/apps/blog/content/blog/caching-database-queries-with-prisma-accelerate/index.mdx +++ b/apps/blog/content/blog/caching-database-queries-with-prisma-accelerate/index.mdx @@ -6,8 +6,8 @@ authors: - "Jon Harrell" metaTitle: "Cache your database queries with Prisma Accelerate" metaDescription: "Achieve faster performance and cost savings with Prisma Accelerate's easy per-query caching, eliminating the need for maintaining caching infrastructure. Experience faster queries, without the hassle!" -metaImagePath: "/blog/caching-database-queries-with-prisma-accelerate/imgs/meta-959743e064c1771e65e078aa6ebee2b402c28578-1266x711.png" -heroImagePath: "/blog/caching-database-queries-with-prisma-accelerate/imgs/hero-69cd8d277e2307eb14396450817be41bb1e7c305-844x474.svg" +metaImagePath: "/caching-database-queries-with-prisma-accelerate/imgs/meta-959743e064c1771e65e078aa6ebee2b402c28578-1266x711.png" +heroImagePath: "/caching-database-queries-with-prisma-accelerate/imgs/hero-69cd8d277e2307eb14396450817be41bb1e7c305-844x474.svg" heroImageAlt: "The word \"caching\" with a starburst behind it, showing that it is important." excerpt: | Dive into the benefits of per-query caching, showcasing how it can make queries faster, handle traffic surges, minimize infrastructure costs, and keep your users satisfied. Learn how to easily implement Prisma Accelerate and achieve improved app performance and cost savings. @@ -25,9 +25,9 @@ While your team was capable, fire drills and all-nighters are the last thing you As you saw in the above example, caching is great when you need to reduce database or application load. By caching, you can remove expensive operations from the time it takes to load your application, also known as the “critical path”. Following requests can then use this cached data to avoid spending app or database time computing the result. If improved stability due to reduced app load wasn’t enough, less time spent computing also means your infrastructure can support a higher workload, or your app can run on reduced hardware, saving you money! -![An image showing a large number of connections going from clients, to a server, to a database. The database is overloaded and stuck at 100% CPU. There is an X's for eyes emoji next to the database.](/blog/caching-database-queries-with-prisma-accelerate/imgs/8b295baeeaf620323649d054718900fb542b6042-2888x1110.png) +![An image showing a large number of connections going from clients, to a server, to a database. The database is overloaded and stuck at 100% CPU. There is an X's for eyes emoji next to the database.](/caching-database-queries-with-prisma-accelerate/imgs/8b295baeeaf620323649d054718900fb542b6042-2888x1110.png) -![An image showing a large number of connections going from clients, to a server, through a cache, to a database. Thanks to the cache, the database is not overloaded. There is an emoji with sunglasses next to the database.](/blog/caching-database-queries-with-prisma-accelerate/imgs/09cee9fb07d0f6190228e118596eed223a1ea99e-2888x1110.png) +![An image showing a large number of connections going from clients, to a server, through a cache, to a database. Thanks to the cache, the database is not overloaded. There is an emoji with sunglasses next to the database.](/caching-database-queries-with-prisma-accelerate/imgs/09cee9fb07d0f6190228e118596eed223a1ea99e-2888x1110.png) Another reason to cache would be to reduce egress costs. Many cloud providers charge egress costs for data leaving their services. This could be rows being served from your database, static images, even responses to or from other services. @@ -62,7 +62,7 @@ As you saw above, adding caching with Prisma Accelerate is as easy as adding a ` In addition to being able to quickly and easily implement caching, using Prisma Accelerate also means no need to set up additional caching infrastructure. While cloud providers have managed key-value stores, in the best case, you still need to manually insert data, manage indexes and replication, and be sure to invalidate when things change. With Prisma Accelerate, this is all handled for you! Add a cache strategy for the query you would like to cache and move on to building more great things. -![An image with two emoji. On the left is an emoji that looks dizzy and overwhelmed. Surrounding it are a lot of things that you have to think of when managing caching infrastructure: Redis, memcached, indexes, invalidation, in-memory, sharding, AWS, GCP. The emoji on the right is winking, clearly happy. It has two steps above it: 1. find a query to cache. 2. Use the Prisma Accelerate extension's `cacheStrategy` feature.](/blog/caching-database-queries-with-prisma-accelerate/imgs/ff3f792f22982a08e1ebad1e81b0cc0d43c30b06-2888x1110.png) +![An image with two emoji. On the left is an emoji that looks dizzy and overwhelmed. Surrounding it are a lot of things that you have to think of when managing caching infrastructure: Redis, memcached, indexes, invalidation, in-memory, sharding, AWS, GCP. The emoji on the right is winking, clearly happy. It has two steps above it: 1. find a query to cache. 2. Use the Prisma Accelerate extension's `cacheStrategy` feature.](/caching-database-queries-with-prisma-accelerate/imgs/ff3f792f22982a08e1ebad1e81b0cc0d43c30b06-2888x1110.png) ### Is Prisma Accelerate right for me? diff --git a/apps/blog/content/blog/client-extensions-ga-4g4yiu8eosbb/index.mdx b/apps/blog/content/blog/client-extensions-ga-4g4yiu8eosbb/index.mdx index b6af2d132d..d852e03af5 100644 --- a/apps/blog/content/blog/client-extensions-ga-4g4yiu8eosbb/index.mdx +++ b/apps/blog/content/blog/client-extensions-ga-4g4yiu8eosbb/index.mdx @@ -6,9 +6,13 @@ authors: - "Jon Harrell" metaTitle: "Prisma Client Extensions Are Now Production Ready (4.16.0)" metaDescription: "Make Prisma Client do even more with Client extensions, now Generally Available. Extend your client, models, queries, and results to tailor Prisma Client to your use case." -metaImagePath: "/blog/client-extensions-ga-4g4yiu8eosbb/imgs/meta-50e7e57ea5967ad67ce89e682aca57f5e19fd65a-1266x712.png" -heroImagePath: "/blog/client-extensions-ga-4g4yiu8eosbb/imgs/hero-b404c12ca7de2f9288368dacbce578b790bfd66d-844x474.svg" +metaImagePath: "/client-extensions-ga-4g4yiu8eosbb/imgs/meta-50e7e57ea5967ad67ce89e682aca57f5e19fd65a-1266x712.png" +heroImagePath: "/client-extensions-ga-4g4yiu8eosbb/imgs/hero-b404c12ca7de2f9288368dacbce578b790bfd66d-844x474.svg" heroImageAlt: "Prisma Client Extensions" +tags: + - "orm" + - "announcement" + - "newrelease-feature" excerpt: | With the release of version [4.16.0](https://github.com/prisma/prisma/releases/tag/4.16.0) of the Prisma ORM, [Client extensions](https://www.prisma.io/docs/orm/prisma-client/client-extensions) are now Generally Available! This new feature allows users to extend and customize Prisma Client to meet their individual use cases. diff --git a/apps/blog/content/blog/client-extensions-preview-8t3w27xkrxxn/index.mdx b/apps/blog/content/blog/client-extensions-preview-8t3w27xkrxxn/index.mdx index 608250b737..513706d4fa 100644 --- a/apps/blog/content/blog/client-extensions-preview-8t3w27xkrxxn/index.mdx +++ b/apps/blog/content/blog/client-extensions-preview-8t3w27xkrxxn/index.mdx @@ -6,9 +6,12 @@ authors: - "Stephen King" metaTitle: "Prisma Client Just Became a Lot More Flexible: Prisma Client Extensions (Preview)" metaDescription: "Learn how Prisma Client extensions (Preview) enable a variety of new use cases for the Prisma ORM." -metaImagePath: "/blog/client-extensions-preview-8t3w27xkrxxn/imgs/meta-5ca8711a05c2f835cfce511739e46b5f6df982cd-1266x712.png" -heroImagePath: "/blog/client-extensions-preview-8t3w27xkrxxn/imgs/hero-1b0474b02ed0759af1c6e3f3bcba5d4ebb1d970b-844x474.svg" +metaImagePath: "/client-extensions-preview-8t3w27xkrxxn/imgs/meta-5ca8711a05c2f835cfce511739e46b5f6df982cd-1266x712.png" +heroImagePath: "/client-extensions-preview-8t3w27xkrxxn/imgs/hero-1b0474b02ed0759af1c6e3f3bcba5d4ebb1d970b-844x474.svg" heroImageAlt: "Prisma Client Just Became a Lot More Flexible: Prisma Client Extensions (Preview)" +tags: + - "newrelease-feature" + - "orm" excerpt: | [Prisma Client extensions](https://www.prisma.io/docs/concepts/components/prisma-client/client-extensions) (in Preview) enable many new use cases. This article will explore various ways you can use extensions to add custom functionality to Prisma Client. diff --git a/apps/blog/content/blog/cloud-connectivity-report-2024/index.mdx b/apps/blog/content/blog/cloud-connectivity-report-2024/index.mdx index 1f992619b8..1e1041a051 100644 --- a/apps/blog/content/blog/cloud-connectivity-report-2024/index.mdx +++ b/apps/blog/content/blog/cloud-connectivity-report-2024/index.mdx @@ -6,8 +6,8 @@ authors: - "Søren Bramer Schmidt" metaTitle: "Prisma's Cloud Connectivity Report 2024" metaDescription: "The Prisma Cloud Connectivity Report 2024 analyzes AWS and Cloudflare latency, highlighting regions with the fastest and slowest connectivity." -metaImagePath: "/blog/cloud-connectivity-report-2024/imgs/meta-4081c40e88b18cc130df73ce6102d5154c7ad39c-1200x630.png" -heroImagePath: "/blog/cloud-connectivity-report-2024/imgs/hero-cb3b5906c2776d8457722f79222e915cd08aa6a3-844x474.svg" +metaImagePath: "/cloud-connectivity-report-2024/imgs/meta-4081c40e88b18cc130df73ce6102d5154c7ad39c-1200x630.png" +heroImagePath: "/cloud-connectivity-report-2024/imgs/hero-cb3b5906c2776d8457722f79222e915cd08aa6a3-844x474.svg" excerpt: | The Prisma Cloud Connectivity Report 2024 analyzes network latency between AWS regions and Cloudflare PoPs, identifying regions with the fastest and slowest connectivity. It highlights the impact of physical infrastructure and geographical distance on latency, providing insights for optimizing cloud connectivity and data exchange efficiency. --- @@ -21,29 +21,29 @@ We collect p50, p90, p95, p99 and p999 latency metrics for the intersection of 1 ## AWS regions with the fastest connectivity to Cloudflare The three AWS regions with the lowest latency to a nearby Cloudflare PoP are all in Asia Pacific: -![](/blog/cloud-connectivity-report-2024/imgs/8eb86e862d6739302c7bc6209ef01b2f157146f3-1480x302.png) +![](/cloud-connectivity-report-2024/imgs/8eb86e862d6739302c7bc6209ef01b2f157146f3-1480x302.png) Fastest of all, ap-south-1 (Mumbai) [opened in 2016](https://aws.amazon.com/about-aws/whats-new/2016/06/announcing-the-aws-asia-pacific-mumbai-region/) and has a p50 latency to the nearby Cloudflare [BOM PoP](https://where.durableobjects.live/colo/BOM) of 10.9ms. Second, ap-southeast-1 (Singapore) [opened in 2010](https://aws.amazon.com/about-aws/whats-new/2010/04/29/announcing-asia-pacific-singapore-region/) and has a p50-latency to the nearby [SIN PoP](https://where.durableobjects.live/colo/SIN) of 12.3 ms. Finally, the ap-southeast-2 (Sydney) region [opened in 2012](https://aws.amazon.com/about-aws/whats-new/2012/11/12/announcing-the-aws-asia-pacific-sydney-region/) and has a p50 latency of 15.8ms to the nearby [SYD PoP](https://where.durableobjects.live/colo/SYD). To understand why some AWS regions have really low latency access to a Cloudflare PoP, all you need to do is follow the wire. At the end of the day, these are physical networks with fiber optics connecting them at an Interconnection Facility. As an example, the [ap-south-1 (Mumbai) AWS region](https://www.peeringdb.com/net/1418) is peering at three facilities: -![](/blog/cloud-connectivity-report-2024/imgs/2c4d00720394b5b0182ffa107c8facdf644c45c2-1484x508.png) +![](/cloud-connectivity-report-2024/imgs/2c4d00720394b5b0182ffa107c8facdf644c45c2-1484x508.png) The [Cloudflare BOM (Mumbai)](https://www.peeringdb.com/net/4224) PoP is also peering the Equinix MB1 facility, so the network distance between the Cloudflare and AWS facilities in Mumbai is very short: -![](/blog/cloud-connectivity-report-2024/imgs/2bf416687abd9defbaac092404b907ed69507e3e-1484x406.png) +![](/cloud-connectivity-report-2024/imgs/2bf416687abd9defbaac092404b907ed69507e3e-1484x406.png) Contrast this with the us-east-2 AWS region in Columbus, Ohio which has a p50 that is almost three times as high to the nearest [Cloudflare PoP CMH](https://where.durableobjects.live/colo/CMH), which is also in Columbus: -![](/blog/cloud-connectivity-report-2024/imgs/9c4d4c5ad6bf475c30cc2b06dff9e6c0f484b7f1-1480x302.png) +![](/cloud-connectivity-report-2024/imgs/9c4d4c5ad6bf475c30cc2b06dff9e6c0f484b7f1-1480x302.png) us-east-2 is peering at just a single interconnection facility: -![](/blog/cloud-connectivity-report-2024/imgs/08374161212a38430c333ecc3e64874e450f36db-1484x304.png) +![](/cloud-connectivity-report-2024/imgs/08374161212a38430c333ecc3e64874e450f36db-1484x304.png) Cloudflare also has a PoP in Columbus, but it is peering at a different Cologix facility, resulting in additional network hops: -![](/blog/cloud-connectivity-report-2024/imgs/db7937e7875b49f2e6e4c5369db024db349c0fd6-1484x304.png) +![](/cloud-connectivity-report-2024/imgs/db7937e7875b49f2e6e4c5369db024db349c0fd6-1484x304.png) ## Latency maps for popular AWS regions @@ -51,17 +51,17 @@ A benefit of the Cloudflare edge network is that they have PoPs in many cities. ### us-east-1 -![](/blog/cloud-connectivity-report-2024/imgs/5851e5907dea7d40565cba4e2b38ab42dbd74c28-1200x630.png) +![](/cloud-connectivity-report-2024/imgs/5851e5907dea7d40565cba4e2b38ab42dbd74c28-1200x630.png) ### eu-central-1 -![](/blog/cloud-connectivity-report-2024/imgs/76f8721b44540468af6c2c2d7335bf9691c8bedb-1200x630.png) +![](/cloud-connectivity-report-2024/imgs/76f8721b44540468af6c2c2d7335bf9691c8bedb-1200x630.png) ## High latency connections [Prisma Accelerate](http://prisma.io/accelerate) is a global database cache, increasing the performance of websites that are deployed in multiple regions and communicating with a central database. As such, we see traffic from almost all Cloudflare PoPs to any given AWS region. These are the AWS region and Cloudflare PoP pairs where we observe the highest latency: -![](/blog/cloud-connectivity-report-2024/imgs/647674d0cfd58e8d406c45cdc75172dfc013cdc7-1480x778.png) +![](/cloud-connectivity-report-2024/imgs/647674d0cfd58e8d406c45cdc75172dfc013cdc7-1480x778.png) It’s no surprise that these are connections over a very long distance. Buenos Aires to Ireland, Hong Kong to Sweden, and Johannesburg to Sydney. diff --git a/apps/blog/content/blog/cloudflare-partnership-qerefgvwirjq/index.mdx b/apps/blog/content/blog/cloudflare-partnership-qerefgvwirjq/index.mdx index 9e93f75a0c..68545aaf3b 100644 --- a/apps/blog/content/blog/cloudflare-partnership-qerefgvwirjq/index.mdx +++ b/apps/blog/content/blog/cloudflare-partnership-qerefgvwirjq/index.mdx @@ -6,9 +6,11 @@ authors: - "Nitin Gupta" metaTitle: "Developer Experience Redefined: Prisma & Cloudflare Lead the Way to Data DX" metaDescription: "Prisma introduces Data DX and announces a partnership with Cloudflare" -metaImagePath: "/blog/cloudflare-partnership-qerefgvwirjq/imgs/meta-c3dfb4dc0d8bc7d99b379b6e68668c6135aca53c-1266x711.png" -heroImagePath: "/blog/cloudflare-partnership-qerefgvwirjq/imgs/hero-726190b9f3c5c097cc8cfa5dc08581458138758f-844x474.svg" +metaImagePath: "/cloudflare-partnership-qerefgvwirjq/imgs/meta-c3dfb4dc0d8bc7d99b379b6e68668c6135aca53c-1266x711.png" +heroImagePath: "/cloudflare-partnership-qerefgvwirjq/imgs/hero-726190b9f3c5c097cc8cfa5dc08581458138758f-844x474.svg" heroImageAlt: "hero image prisma" +tags: + - "announcement" excerpt: | Prisma and Cloudflare join forces to introduce Data Developer Experience (Data DX), revolutionizing data-driven applications. The partnership offers innovative tools and cloud infrastructure, reducing setup time and accelerating time-to-market for users. diff --git a/apps/blog/content/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/index.mdx b/apps/blog/content/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/index.mdx index fa5aeafc80..2312056483 100644 --- a/apps/blog/content/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/index.mdx +++ b/apps/blog/content/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/index.mdx @@ -6,8 +6,8 @@ authors: - "Nikolas Burk" metaTitle: "Cloudflare, Unikernels & Bare Metal: Life of a Prisma Postgres Query" metaDescription: "Take a look under the hood of the most innovative PostgreSQL database on the market and learn how a query travels through Cloudflare, unikernels and bare metal." -metaImagePath: "/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/meta-b078a6114c23eb0c00322a230a463628f4799fb4-1266x711.png" -heroImagePath: "/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/hero-e23d2415c9dce256ee6090919392141e9da30678-844x474.svg" +metaImagePath: "/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/meta-b078a6114c23eb0c00322a230a463628f4799fb4-1266x711.png" +heroImagePath: "/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/hero-e23d2415c9dce256ee6090919392141e9da30678-844x474.svg" excerpt: | [Prisma Postgres](https://www.prisma.io/postgres) is the most innovative PostgreSQL database on the market. In this article, we dive deep into its technology stack, which enables lightning-fast queries, global caching, connection pooling, and more. --- @@ -42,7 +42,7 @@ Here's what developers get when using Prisma Postgres as their serverless databa With our short recap out of the way, let's dive into the tech stack Prisma Postgres uses to enable these benefits. Spoiler: Here's the full overview of all components involved in the lifecycle of a Prisma Postgres query: -![Future architecture diagram of Prisma Postgres](/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/e6d5ed34c551a50fe047743347f2d0165d62f214-714x859.png) +![Future architecture diagram of Prisma Postgres](/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/e6d5ed34c551a50fe047743347f2d0165d62f214-714x859.png) In the next sections, we'll take a closer look at each stage and explain what's going on under the covers. @@ -123,7 +123,7 @@ The auth layer is implemented using Cloudflare Workers, and therefore in close p After authentication, the HTTP request is going to hit the next layer of the Prisma Postgres infrastructure which is implemented via Cloudflare Workers as well: -![](/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/7cef11dd00cbe3b8940b3be286ce9080129e5d05-2960x1822.png) +![](/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/7cef11dd00cbe3b8940b3be286ce9080129e5d05-2960x1822.png) The main purpose of this routing layer is to determine whether the Prisma Postgres cache needs to be activated: @@ -138,7 +138,7 @@ As a cache key, it uses a hash that's computed based on the _entire_ Prisma ORM You can see the statistics of your caching behavior in the Prisma Postgres dashboard: -![](/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/06d5ac72c9f8596e6765f72475d6811a57c61947-4064x2334.png) +![](/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/06d5ac72c9f8596e6765f72475d6811a57c61947-4064x2334.png) Let's now assume our query from before continues to travel down the Prisma Postgres stack and is not served by the cache. What happens next? @@ -160,7 +160,7 @@ Prisma Postgres is based on _unikernels_ (think: "hyper-specialized operating s Here's an overview of the Unikraft Cloud's [core components](https://unikraft.cloud/how-it-works/) that enables the lightning-fast startup times of Prisma Postgres instances: -![](/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/8cf5361a40fdc079b0db4b848483b59f2e99d50b-1740x232.png) +![](/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/8cf5361a40fdc079b0db4b848483b59f2e99d50b-1740x232.png) And this is how these components work together: @@ -187,7 +187,7 @@ While we've seen a lot of excitement about the current technology stack and the There are a number of additional optimizations that we see possible in future iterations of Prisma Postgres, most notably: We are going to move the connection pool onto the _same machines_ that are running the Prisma Postgres instances: -![Prisma Postgres components](/blog/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/b38aa9235dab3c4bbef178b0944da6f97a9c2c2f-660x852.png) +![Prisma Postgres components](/cloudflare-unikernels-and-bare-metal-life-of-a-prisma-postgres-query/imgs/b38aa9235dab3c4bbef178b0944da6f97a9c2c2f-660x852.png) The TCP connection is the most expensive part in the entire stack, due to the three-way handshake that needs to be done every time a connection is established. By reducing this TCP connection to a merely local one happening between two processes on the same machine, the latency caused by the physical distance between the connection pool and database instance would become entirely negligible. diff --git a/apps/blog/content/blog/cockroach-ga-5jrd9xvwqdyl/index.mdx b/apps/blog/content/blog/cockroach-ga-5jrd9xvwqdyl/index.mdx index b0c46656b1..a24f850325 100644 --- a/apps/blog/content/blog/cockroach-ga-5jrd9xvwqdyl/index.mdx +++ b/apps/blog/content/blog/cockroach-ga-5jrd9xvwqdyl/index.mdx @@ -6,9 +6,13 @@ authors: - "Sabin Adams" metaTitle: "Prisma support for CockroachDB is now in GA" metaDescription: "Prisma's support for CockroachDB is now in production ready! Read this article to learn about the features and benefits of Prisma with CockroachDb." -metaImagePath: "/blog/cockroach-ga-5jrd9xvwqdyl/imgs/meta-77148d314c74789939fb2b2af2bf3f82378cebc0-1920x1080.png" -heroImagePath: "/blog/cockroach-ga-5jrd9xvwqdyl/imgs/hero-ebf53ec190dab44f271d4f0dd1ad658507f55b66-844x474.svg" +metaImagePath: "/cockroach-ga-5jrd9xvwqdyl/imgs/meta-77148d314c74789939fb2b2af2bf3f82378cebc0-1920x1080.png" +heroImagePath: "/cockroach-ga-5jrd9xvwqdyl/imgs/hero-ebf53ec190dab44f271d4f0dd1ad658507f55b66-844x474.svg" heroImageAlt: "Prisma Support for CockroachDB Is Production Ready" +tags: + - "announcement" + - "newrelease-feature" + - "orm" excerpt: | On May 10th, we were thrilled to release version [3.14.0](https://github.com/prisma/prisma/releases/tag/3.14.0) of Prisma ORM, which brought [CockroachDB](https://www.cockroachlabs.com/product/) support to GA! This production-ready @@ -22,7 +26,7 @@ Back in February, as part of the [3.9.0](https://github.com/prisma/prisma/releas Thanks to the amazing community feedback and testing, along with collaboration from the amazing [Cockroach Labs](https://www.cockroachlabs.com/) team, this feature is now production-ready! -![](/blog/cockroach-ga-5jrd9xvwqdyl/imgs/release-notes.png) +![](/cockroach-ga-5jrd9xvwqdyl/imgs/release-notes.png) ## The power of serverless with a familiar interface @@ -37,7 +41,7 @@ Using Prisma with CockroachDB is, for the most part, the same as using Prisma wi The magic behind Prisma _with_ CockroachDB is that developers now have access to the scalable infrastructure of a distributed SQL database without having to be an expert in hosting and scaling databases. CockroachDB handles that piece of things so developers can focus on building their product rather than spending time on operational overhead. -![](/blog/cockroach-ga-5jrd9xvwqdyl/imgs/cockroach-diagram.png) +![](/cockroach-ga-5jrd9xvwqdyl/imgs/cockroach-diagram.png) The developer's experience when interacting with their CockroachDB database (or database cluster) is made super smooth as Prisma helps maintain advanced developer confidence and productivity via its type-safe client and migration tools while CockroachDB handles the complicated operational tasks such as: @@ -68,7 +72,7 @@ Then create a new migration to account for that change. ```shell npx prisma migrate dev --name add-age ``` -![](/blog/cockroach-ga-5jrd9xvwqdyl/imgs/migration.png) +![](/cockroach-ga-5jrd9xvwqdyl/imgs/migration.png) Finally, ideally during a CI/CD step, the changes can be deployed to the database and CockroachDB will apply these across all of the databases in the cluster without downtime. @@ -83,7 +87,7 @@ Prisma Schema Language (PSL) supports configuring [indexes](https://www.prisma.i This, along with CockroachDB's [statement monitoring page](https://www.cockroachlabs.com/docs/stable/ui-statements-page.html) provide a super useful set of tools that empower developers to have clear insights into their queries' performance and pathways to optimizing them. -![](/blog/cockroach-ga-5jrd9xvwqdyl/imgs/statements.png) +![](/cockroach-ga-5jrd9xvwqdyl/imgs/statements.png) ## Get started with CockroachDB and Prisma diff --git a/apps/blog/content/blog/compliance-reqs-complete/index.mdx b/apps/blog/content/blog/compliance-reqs-complete/index.mdx index d12ae06f12..14e7c713d0 100644 --- a/apps/blog/content/blog/compliance-reqs-complete/index.mdx +++ b/apps/blog/content/blog/compliance-reqs-complete/index.mdx @@ -7,9 +7,11 @@ authors: - "Josh McLeod" metaTitle: "Prisma completes HIPAA, GDPR, ISO27001, SOC2 compliance requirements." metaDescription: "Prisma completes the compliance requirements for GDPR, HIPAA, ISO27001 and SOC2-TypeII certifications" -metaImagePath: "/blog/compliance-reqs-complete/imgs/meta-457925aa50c548e3c000c94e5dab3874b4272046-1266x711.png" -heroImagePath: "/blog/compliance-reqs-complete/imgs/hero-d21f1c5e95d54f9016987dc7885b6b032c1bc140-844x474.svg" +metaImagePath: "/compliance-reqs-complete/imgs/meta-457925aa50c548e3c000c94e5dab3874b4272046-1266x711.png" +heroImagePath: "/compliance-reqs-complete/imgs/hero-d21f1c5e95d54f9016987dc7885b6b032c1bc140-844x474.svg" heroImageAlt: "Prisma completes compliance requirements for GDPR, HIPAA, ISO27001 and SOC2-TypeII certifications." +tags: + - "announcement" excerpt: | Prisma has successfully implemented processes and controls required for SOC2 Type II, HIPAA, GDPR, and ISO 27001:2022 certifications. These accomplishments demonstrate our commitment to providing secure and reliable software solutions for developers working with databases. --- diff --git a/apps/blog/content/blog/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/index.mdx b/apps/blog/content/blog/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/index.mdx index e199f1ac7a..eafa309fac 100644 --- a/apps/blog/content/blog/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/index.mdx +++ b/apps/blog/content/blog/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/index.mdx @@ -6,8 +6,10 @@ authors: - "Nikolas Burk" metaTitle: "Announcing: Prisma Postgres Integration for Vercel Marketplace" metaDescription: "We’re thrilled to announce that you can now create and manage Prisma Postgres instances without leaving your Vercel Dashboard." -metaImagePath: "/blog/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/imgs/meta-1e5148009a4294ebba377f758ce1139e3c46bcef-1266x711.png" -heroImagePath: "/blog/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/imgs/hero-b06562c14b921f9c72bd78bcd5b04717f20cf9e4-844x474.svg" +metaImagePath: "/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/imgs/meta-1e5148009a4294ebba377f758ce1139e3c46bcef-1266x711.png" +heroImagePath: "/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/imgs/hero-b06562c14b921f9c72bd78bcd5b04717f20cf9e4-844x474.svg" +tags: + - "announcement" excerpt: | Prisma Postgres is the first serverless database without cold starts—and we’re thrilled to announce that you can now create and manage Prisma Postgres instances without leaving your Vercel Dashboard via our new [Vercel Marketplace integration](http://vercel.com/marketplace/prisma). --- @@ -34,7 +36,7 @@ With the new Prisma Postgres integration, you can: To get you started, we have built a [starter template](https://vercel.com/templates/next.js/prisma-postgres) for you that can deploy with a single-click. -![](/blog/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/imgs/37841e4d757e5ec1c09e6285933fc7ec16ad1902-3248x2112.png) +![](/connect-your-apps-to-prisma-postgres-via-vercel-marketplace-integration/imgs/37841e4d757e5ec1c09e6285933fc7ec16ad1902-3248x2112.png) The template uses the new Prisma Postgres integration, so that you can simply create a free Prisma Postgres instance during the deployment flow and your application immediately connects to a database once it's live! diff --git a/apps/blog/content/blog/connections-edges-nodes-in-relay-758d358aa4c7/index.mdx b/apps/blog/content/blog/connections-edges-nodes-in-relay-758d358aa4c7/index.mdx index fe8d27f139..79ec69a1a0 100644 --- a/apps/blog/content/blog/connections-edges-nodes-in-relay-758d358aa4c7/index.mdx +++ b/apps/blog/content/blog/connections-edges-nodes-in-relay-758d358aa4c7/index.mdx @@ -6,8 +6,8 @@ authors: - "Johannes Schickling" - "Søren Bramer Schmidt" metaTitle: "Learn more about Connections, Edges & Nodes in Relay | Prisma" -metaImagePath: "/blog/connections-edges-nodes-in-relay-758d358aa4c7/imgs/meta-cc730c78d87244cb877764a6a4a850b2c9223871-1200x775.png" -heroImagePath: "/blog/connections-edges-nodes-in-relay-758d358aa4c7/imgs/hero-a86c8de527177e03b9e08b9f1f1522dc1debbc6d-559x361.png" +metaImagePath: "/connections-edges-nodes-in-relay-758d358aa4c7/imgs/meta-cc730c78d87244cb877764a6a4a850b2c9223871-1200x775.png" +heroImagePath: "/connections-edges-nodes-in-relay-758d358aa4c7/imgs/hero-a86c8de527177e03b9e08b9f1f1522dc1debbc6d-559x361.png" excerpt: | The terminology of Relay can be quite overwhelming in the beginning. Relay introduces a handful of new concepts on top of GraphQL, mainly in order to manage relationships between models.. @@ -51,7 +51,7 @@ Okay, let’s see what’s going on here. The `actors` connection now has a more Don’t worry. In order to use Relay, you don’t have to understand the reasons why the structure is designed this way but rest assured that [it makes a lot of sense](https://relay.dev/graphql/connections.htm). -![](/blog/connections-edges-nodes-in-relay-758d358aa4c7/imgs/0*sPafc6eXHJvRSJhZ.png) +![](/connections-edges-nodes-in-relay-758d358aa4c7/imgs/0*sPafc6eXHJvRSJhZ.png) Lastly, we also notice the first: 10 parameter on the actors field. This gives us a way to [paginate](https://en.wikipedia.org/wiki/Pagination) over the entire list of related actors. In this case we’re taking the first 10 actors (nodes). In the same way we could additionally specify the after parameter which allows us to skip a certain amount of nodes. diff --git a/apps/blog/content/blog/convergence/index.mdx b/apps/blog/content/blog/convergence/index.mdx index 5866af2429..ddbbbd1663 100644 --- a/apps/blog/content/blog/convergence/index.mdx +++ b/apps/blog/content/blog/convergence/index.mdx @@ -6,8 +6,8 @@ authors: - "Nitin Gupta" metaTitle: "The ORM Convergence: Convergence through experience" metaDescription: "Why Drizzle's relational API v2 mirrors Prisma: production database problems at scale lead to similar patterns. A look at ORM convergence." -metaImagePath: "/blog/convergence/imgs/meta-3963296cdd515c9ae5cb17379fcff0da144c7b35-1266x711.png" -heroImagePath: "/blog/convergence/imgs/hero-532d75ec739a13ee528e8b2a085d47fc962a3ca7-840x472.png" +metaImagePath: "/convergence/imgs/meta-3963296cdd515c9ae5cb17379fcff0da144c7b35-1266x711.png" +heroImagePath: "/convergence/imgs/hero-532d75ec739a13ee528e8b2a085d47fc962a3ca7-840x472.png" heroImageAlt: "ORM Convergence" excerpt: | Drizzle's relational API v2 adds migrations, object-based queries, and abstractions mirroring Prisma's architecture. Plot twist: this isn't copying, it's convergence. Production database problems at scale demand similar solutions. Seeing another team reach the same conclusions we did in 2020? Pretty validating. diff --git a/apps/blog/content/blog/coo-announcement-aer1fgviirjb/index.mdx b/apps/blog/content/blog/coo-announcement-aer1fgviirjb/index.mdx index 48c5b01a4a..fe98d6a174 100644 --- a/apps/blog/content/blog/coo-announcement-aer1fgviirjb/index.mdx +++ b/apps/blog/content/blog/coo-announcement-aer1fgviirjb/index.mdx @@ -6,9 +6,11 @@ authors: - "Søren Bramer Schmidt" metaTitle: "Prisma Is Expanding Its Executive Team" metaDescription: "Announcement about new COO joining Prisma" -metaImagePath: "/blog/coo-announcement-aer1fgviirjb/imgs/hero-c79e2c7b7f4cd64f5be9677d4fab38140809b0f9-1267x711.png" -heroImagePath: "/blog/coo-announcement-aer1fgviirjb/imgs/hero-c79e2c7b7f4cd64f5be9677d4fab38140809b0f9-1267x711.png" +metaImagePath: "/coo-announcement-aer1fgviirjb/imgs/hero-c79e2c7b7f4cd64f5be9677d4fab38140809b0f9-1267x711.png" +heroImagePath: "/coo-announcement-aer1fgviirjb/imgs/hero-c79e2c7b7f4cd64f5be9677d4fab38140809b0f9-1267x711.png" heroImageAlt: "Prisma Is Expanding Its Executive Team" +tags: + - "announcement" excerpt: | We are expanding our executive leadership team and are very excited to announce that Nitin Gupta joins us as COO. diff --git a/apps/blog/content/blog/data-platform-static-ips/index.mdx b/apps/blog/content/blog/data-platform-static-ips/index.mdx index 2475a85ce2..062b4e3976 100644 --- a/apps/blog/content/blog/data-platform-static-ips/index.mdx +++ b/apps/blog/content/blog/data-platform-static-ips/index.mdx @@ -6,9 +6,12 @@ authors: - "Daniel Norman" metaTitle: "Enabling static egress IPs in the Prisma Data Platform" metaDescription: "Static egress IP support ensures that the Prisma Data Platform connects to your databases through public static IP addresses helping you keep your database secure." -metaImagePath: "/blog/data-platform-static-ips/imgs/meta-725058cd14e118302aa8e56bbaf31e46436bfc91-1269x640.png" -heroImagePath: "/blog/data-platform-static-ips/imgs/hero-f9991a96b6b8ce0fa61dead528141fa1e8b911be-844x474.svg" +metaImagePath: "/data-platform-static-ips/imgs/meta-725058cd14e118302aa8e56bbaf31e46436bfc91-1269x640.png" +heroImagePath: "/data-platform-static-ips/imgs/hero-f9991a96b6b8ce0fa61dead528141fa1e8b911be-844x474.svg" heroImageAlt: "Enabling static egress IPs in the Prisma Data Platform" +tags: + - "announcement" + - "data-platform" excerpt: | We're launching Early Access support for static egress IPs. Keep your databases secure by ensuring that the Prisma Data Platform only connects to your database from specific IPs. [Try it out](https://cloud.prisma.io/) and share your @@ -76,13 +79,13 @@ You can enable static egress IPs per environment in both new and existing projec You will be prompted with an option to enable static IPs when configuring an environment in the project creation flow: -![Enabling static egress IPs in a new project](/blog/data-platform-static-ips/imgs/pdp-static-egress-project.gif) +![Enabling static egress IPs in a new project](/data-platform-static-ips/imgs/pdp-static-egress-project.gif) #### For an existing environment To enable static egress IPs, choose a project in the Data Platform, go to the environment settings, and enable static IPs: -![Enabling static egress IPs for an environment](/blog/data-platform-static-ips/imgs/pdp-static-egress-demo.gif) +![Enabling static egress IPs for an environment](/data-platform-static-ips/imgs/pdp-static-egress-demo.gif)
[Learn more about the feature in the docs](https://www.prisma.io/docs/data-platform/static-ips) diff --git a/apps/blog/content/blog/database-access-in-react-server-components-r2xgk9aztgdf/index.mdx b/apps/blog/content/blog/database-access-in-react-server-components-r2xgk9aztgdf/index.mdx index e7d9b804c9..5f821a79c7 100644 --- a/apps/blog/content/blog/database-access-in-react-server-components-r2xgk9aztgdf/index.mdx +++ b/apps/blog/content/blog/database-access-in-react-server-components-r2xgk9aztgdf/index.mdx @@ -5,9 +5,11 @@ date: "2021-02-24" authors: - "Mahmoud Abdelwahab" metaTitle: "Send Database Queries in a React App Using Server Components" -metaImagePath: "/blog/database-access-in-react-server-components-r2xgk9aztgdf/imgs/meta-8befd7df92cc32135332ef9c28b41e076e2c8998-1251x630.png" -heroImagePath: "/blog/database-access-in-react-server-components-r2xgk9aztgdf/imgs/hero-f388984fa1fe34f5d79d884f6f599c22a4107fa1-846x426.png" +metaImagePath: "/database-access-in-react-server-components-r2xgk9aztgdf/imgs/meta-8befd7df92cc32135332ef9c28b41e076e2c8998-1251x630.png" +heroImagePath: "/database-access-in-react-server-components-r2xgk9aztgdf/imgs/hero-f388984fa1fe34f5d79d884f6f599c22a4107fa1-846x426.png" heroImageAlt: "Database Access in React Server Components" +tags: + - "education" excerpt: | React Server Components were previewed near the end of 2020. In this article, we'll explore what they are, the problems they solve, and how we can use them for direct database access. @@ -79,7 +81,7 @@ Which two do we pick? Let's take a look at three different examples. Say we're building an app like Spotify, here's the mockup of what it should look like: -![Spotify user interface](/blog/database-access-in-react-server-components-r2xgk9aztgdf/imgs/spotify-artist-details.png) +![Spotify user interface](/database-access-in-react-server-components-r2xgk9aztgdf/imgs/spotify-artist-details.png) This page contains information about a single artist, such as their top tracks, discography, and details. If we were to build this UI using React, we'd break it down into multiple components. @@ -153,7 +155,7 @@ This approach is not fast because our parent component's children only start fet So we end up having a waterfall of network requests, where network requests start one after the other, instead of all at once: -![Diagram of a network waterfall](/blog/database-access-in-react-server-components-r2xgk9aztgdf/imgs/network-waterfall.png) +![Diagram of a network waterfall](/database-access-in-react-server-components-r2xgk9aztgdf/imgs/network-waterfall.png) ### Prioritizing speed and ease of maintenance @@ -200,7 +202,7 @@ Also, since we now have access to the database, we can send queries directly fro After being rendered on the server, Server Components are sent to the browser in a JSON like format, which can the be merged with the client's component tree without losing state. ([More details about the response format](https://github.com/josephsavona/rfcs/blob/server-components/text/0000-server-components.md#what-is-the-response-format)). -![Traditional React components vs. Server Components](/blog/database-access-in-react-server-components-r2xgk9aztgdf/imgs/traditional-and-server-components-comparison.png) +![Traditional React components vs. Server Components](/database-access-in-react-server-components-r2xgk9aztgdf/imgs/traditional-and-server-components-comparison.png) How is this different than server-side rendering (e.g. using Next.js)? @@ -232,7 +234,7 @@ npm start ``` The app will be running at [http://localhost:4000](http://localhost:4000) and this is what you'll see: -![Server Components demo screenshot](/blog/database-access-in-react-server-components-r2xgk9aztgdf/imgs/server-components-demo.png) +![Server Components demo screenshot](/database-access-in-react-server-components-r2xgk9aztgdf/imgs/server-components-demo.png) ### Project structure diff --git a/apps/blog/content/blog/database-vs-application-demystifying-join-strategies/index.mdx b/apps/blog/content/blog/database-vs-application-demystifying-join-strategies/index.mdx index a1bca032ee..c5c07fb693 100644 --- a/apps/blog/content/blog/database-vs-application-demystifying-join-strategies/index.mdx +++ b/apps/blog/content/blog/database-vs-application-demystifying-join-strategies/index.mdx @@ -5,8 +5,10 @@ date: "2025-01-15" authors: - "Nikolas Burk" metaDescription: "Joining data from multiple tables is a complicated topic. There are two main strategies: database-level and application-level joins. Prisma ORM offers both options. In this article you’ll learn the tradeoffs between the two so you can pick the best strategy." -metaImagePath: "/blog/database-vs-application-demystifying-join-strategies/imgs/meta-3dd1f6419862f57459fa70702fabf854946e6e13-1266x711.png" -heroImagePath: "/blog/database-vs-application-demystifying-join-strategies/imgs/hero-5fa4fcf8d00bbf21e0b169f955a09f79332fb75b-844x474.svg" +metaImagePath: "/database-vs-application-demystifying-join-strategies/imgs/meta-3dd1f6419862f57459fa70702fabf854946e6e13-1266x711.png" +heroImagePath: "/database-vs-application-demystifying-join-strategies/imgs/hero-5fa4fcf8d00bbf21e0b169f955a09f79332fb75b-844x474.svg" +tags: + - "education" excerpt: | Joining data from multiple tables is a complicated topic. There are two main strategies: database-level and application-level joins. [Prisma ORM offers both options](https://www.prisma.io/blog/prisma-orm-now-lets-you-choose-the-best-join-strategy-preview). In this article you’ll learn the tradeoffs between the two so you can pick the best strategy for your use case. --- @@ -57,7 +59,7 @@ However, if you've worked with a SQL database before, you're probably aware that Here's a visual representation of the two approaches: -![](/blog/database-vs-application-demystifying-join-strategies/imgs/47ca5a5f744cde64f8caaa359a2870df758d3c91-3200x1256.png) +![](/database-vs-application-demystifying-join-strategies/imgs/47ca5a5f744cde64f8caaa359a2870df758d3c91-3200x1256.png) This is a huge difference, not only in the way data is _physically_ laid out on disk and in memory, but also when it comes to the _mental model_ and to reasoning about the data. @@ -154,7 +156,7 @@ ORDER BY ``` The results returned by the database may look similar to this: -![](/blog/database-vs-application-demystifying-join-strategies/imgs/aecb797ff9a4fec41786e1acfd8ea81be54ba073-404x571.png) +![](/database-vs-application-demystifying-join-strategies/imgs/aecb797ff9a4fec41786e1acfd8ea81be54ba073-404x571.png) Do you notice something? There's _a lot_ of repetition in the data on the `user_name` column. @@ -179,7 +181,7 @@ ORDER BY ``` Now that's even worse! Not only `user_name` repeats, but `post_title` does so as well: -![](/blog/database-vs-application-demystifying-join-strategies/imgs/14d97834abcc4a48970178b9357c95b7c69773e1-1242x1694.png) +![](/database-vs-application-demystifying-join-strategies/imgs/14d97834abcc4a48970178b9357c95b7c69773e1-1242x1694.png) The redundancy of the data has several negative implications: @@ -306,7 +308,7 @@ GROUP BY ``` Such a query produces the following results: -![](/blog/database-vs-application-demystifying-join-strategies/imgs/ee53bcfbca9834771ff6856d9fcd6e77aef7bf04-1228x1708.png) +![](/database-vs-application-demystifying-join-strategies/imgs/ee53bcfbca9834771ff6856d9fcd6e77aef7bf04-1228x1708.png) This data is similar to the one from the section about naive DB-level joins, except that: diff --git a/apps/blog/content/blog/datadx-event-recap-z5pcp6hzbz5m/index.mdx b/apps/blog/content/blog/datadx-event-recap-z5pcp6hzbz5m/index.mdx index e9d7754cb0..d84d55c2b5 100644 --- a/apps/blog/content/blog/datadx-event-recap-z5pcp6hzbz5m/index.mdx +++ b/apps/blog/content/blog/datadx-event-recap-z5pcp6hzbz5m/index.mdx @@ -6,9 +6,11 @@ authors: - "Petra Donka" metaTitle: "Key takeaways from the Discover Data DX virtual event" metaDescription: "Highlights from the Discover Data DX virtual event hosted by Prisma on December 7th, 2023, where industry leaders discussed the significance and principles of Data DX." -metaImagePath: "/blog/datadx-event-recap-z5pcp6hzbz5m/imgs/meta-3155f43f9648d3e4eedd05759f69d6876b72d313-1265x711.png" -heroImagePath: "/blog/datadx-event-recap-z5pcp6hzbz5m/imgs/hero-23097a272172cd3791887b9664ecd25e4dc65cff-843x474.svg" +metaImagePath: "/datadx-event-recap-z5pcp6hzbz5m/imgs/meta-3155f43f9648d3e4eedd05759f69d6876b72d313-1265x711.png" +heroImagePath: "/datadx-event-recap-z5pcp6hzbz5m/imgs/hero-23097a272172cd3791887b9664ecd25e4dc65cff-843x474.svg" heroImageAlt: "Key takeaways from the Discover Data DX virtual event" +tags: + - "announcement" excerpt: | Explore the insights from the [Discover Data DX virtual event](https://www.datadx.io/event) held on December 7th, 2023. The event brought together industry leaders to discuss the significance and principles of the emerging Data DX category. diff --git a/apps/blog/content/blog/datadx-manifesto-ikgyqj170k8h/index.mdx b/apps/blog/content/blog/datadx-manifesto-ikgyqj170k8h/index.mdx index 5f4d576d83..6a762d658e 100644 --- a/apps/blog/content/blog/datadx-manifesto-ikgyqj170k8h/index.mdx +++ b/apps/blog/content/blog/datadx-manifesto-ikgyqj170k8h/index.mdx @@ -6,9 +6,11 @@ authors: - "Nitin Gupta" metaTitle: "Data DX Manifesto: a new era in data-driven app development" metaDescription: "Prisma introduces Data DX (Data Developer Experience) as a fresh approach for effortlessly building data-driven applications." -metaImagePath: "/blog/datadx-manifesto-ikgyqj170k8h/imgs/meta-96de5fd29833ae651da6ecc88c021bb9d84eba1b-1266x711.png" -heroImagePath: "/blog/datadx-manifesto-ikgyqj170k8h/imgs/hero-2e402be560690da1dd594236284a8efa71a8f82f-844x474.svg" +metaImagePath: "/datadx-manifesto-ikgyqj170k8h/imgs/meta-96de5fd29833ae651da6ecc88c021bb9d84eba1b-1266x711.png" +heroImagePath: "/datadx-manifesto-ikgyqj170k8h/imgs/hero-2e402be560690da1dd594236284a8efa71a8f82f-844x474.svg" heroImageAlt: "Data DX" +tags: + - "announcement" excerpt: | Prisma presents the [Data DX manifesto](https://datadx.io), a transformative approach to data-driven app development. More than a document, it is a call to action. The manifesto highlights the benefits of Data DX for developers and offers insights for innovative product creation. diff --git a/apps/blog/content/blog/datadx-name-for-prismas-philosophy/index.mdx b/apps/blog/content/blog/datadx-name-for-prismas-philosophy/index.mdx index f4c3a33c0c..eee834e2a1 100644 --- a/apps/blog/content/blog/datadx-name-for-prismas-philosophy/index.mdx +++ b/apps/blog/content/blog/datadx-name-for-prismas-philosophy/index.mdx @@ -6,8 +6,8 @@ authors: - "Dave Feldman" metaTitle: "Data DX: The name for Prisma’s developer experience philosophy" metaDescription: "Explore the evolution of Data DX at Prisma, from its inception before naming to the launch of a new category." -metaImagePath: "/blog/datadx-name-for-prismas-philosophy/imgs/meta-20adaa4799629b59c11ad00ea86bdc7cfbbd0ed5-1266x711.png" -heroImagePath: "/blog/datadx-name-for-prismas-philosophy/imgs/hero-6b87cc279c810d8c9af92e0bfc3e4a4b21dd9bf0-844x474.svg" +metaImagePath: "/datadx-name-for-prismas-philosophy/imgs/meta-20adaa4799629b59c11ad00ea86bdc7cfbbd0ed5-1266x711.png" +heroImagePath: "/datadx-name-for-prismas-philosophy/imgs/hero-6b87cc279c810d8c9af92e0bfc3e4a4b21dd9bf0-844x474.svg" excerpt: | Explore the evolution of [Data DX](https://www.datadx.io/) at Prisma, from its inception before naming to the launch of a new category. Learn more about our founder’s vision and how Data DX is integrated into Prisma's products, and join the industry-wide shift towards a new era in developer experience. --- diff --git a/apps/blog/content/blog/datamodel-v11-lrzqy1f56c90/index.mdx b/apps/blog/content/blog/datamodel-v11-lrzqy1f56c90/index.mdx index 3c53ad7247..18ed2fe9bb 100644 --- a/apps/blog/content/blog/datamodel-v11-lrzqy1f56c90/index.mdx +++ b/apps/blog/content/blog/datamodel-v11-lrzqy1f56c90/index.mdx @@ -5,8 +5,8 @@ date: "2019-04-17" authors: - "Nikolas Burk" metaTitle: "New Datamodel Syntax: Improved Schema Control & Simpler Migrations" -metaImagePath: "/blog/datamodel-v11-lrzqy1f56c90/imgs/hero-99f1530d6ebe62110fd2839ba4f0185795ee5db4-1200x630.png" -heroImagePath: "/blog/datamodel-v11-lrzqy1f56c90/imgs/hero-99f1530d6ebe62110fd2839ba4f0185795ee5db4-1200x630.png" +metaImagePath: "/datamodel-v11-lrzqy1f56c90/imgs/hero-99f1530d6ebe62110fd2839ba4f0185795ee5db4-1200x630.png" +heroImagePath: "/datamodel-v11-lrzqy1f56c90/imgs/hero-99f1530d6ebe62110fd2839ba4f0185795ee5db4-1200x630.png" heroImageAlt: "New Datamodel Syntax: More Schema Control & Simpler Migration" excerpt: | Prisma's latest release features an improved datamodel syntax. It removes many of the opinionated decisions Prisma used to make about the database layout and enables more control for developers. @@ -578,7 +578,7 @@ From here on, you can use the [Prisma client](https://v1.prisma.io/docs/1.31/pri To access your data in [Prisma Admin](https://v1.prisma.io/docs/1.31/prisma-admin), you need to navigate to the Admin endpoint of your Prisma project: `http://localhost:4466/_admin` -![Access your data in Prisma Admin](/blog/datamodel-v11-lrzqy1f56c90/imgs/wJCyxVy.png) +![Access your data in Prisma Admin](/datamodel-v11-lrzqy1f56c90/imgs/wJCyxVy.png) --- diff --git a/apps/blog/content/blog/documenting-apis-mjjpz7e7nkvp/index.mdx b/apps/blog/content/blog/documenting-apis-mjjpz7e7nkvp/index.mdx index fdc89f8d62..5c38f297e9 100644 --- a/apps/blog/content/blog/documenting-apis-mjjpz7e7nkvp/index.mdx +++ b/apps/blog/content/blog/documenting-apis-mjjpz7e7nkvp/index.mdx @@ -5,9 +5,11 @@ date: "2021-05-06" authors: - "Alex Ruheni" metaTitle: "Learn 5 Tools for Documenting Web APIs" -metaImagePath: "/blog/documenting-apis-mjjpz7e7nkvp/imgs/hero-2982f7850de70f0c52daa613dae904b463342823-1692x852.png" -heroImagePath: "/blog/documenting-apis-mjjpz7e7nkvp/imgs/hero-2982f7850de70f0c52daa613dae904b463342823-1692x852.png" +metaImagePath: "/documenting-apis-mjjpz7e7nkvp/imgs/hero-2982f7850de70f0c52daa613dae904b463342823-1692x852.png" +heroImagePath: "/documenting-apis-mjjpz7e7nkvp/imgs/hero-2982f7850de70f0c52daa613dae904b463342823-1692x852.png" heroImageAlt: "5 Tools for Documenting Your Web API" +tags: + - "education" excerpt: | Learn the importance of documenting web APIs, the different approaches available, and the tools you can leverage to document web APIs. @@ -141,7 +143,7 @@ npm run dev ``` When the application is running, open your browser and navigate to http://localhost:3000/api, and you should see the following: -![Swagger Documentation](/blog/documenting-apis-mjjpz7e7nkvp/imgs/115109659-bfa72f80-9f7f-11eb-9fde-f995c6f51262.png) +![Swagger Documentation](/documenting-apis-mjjpz7e7nkvp/imgs/115109659-bfa72f80-9f7f-11eb-9fde-f995c6f51262.png) The `@nestjs/swagger` module makes use of the decorators that define API requests to generate the Swagger documentation. @@ -156,7 +158,7 @@ Once you hit publish, Postman generates documentation based on the collection. For this example, you can refer to [this collection](https://documenter.getpostman.com/view/6036481/TzJpifja) containing the requests for the REST API-based Prisma examples. You can import the collection on Postman and try it out for yourself from [here](https://raw.githubusercontent.com/prisma/prisma-examples/latest/.github/tests/postman_collections/rest.json). -![Postman Collection](/blog/documenting-apis-mjjpz7e7nkvp/imgs/115104730-06d2f780-9f63-11eb-9f82-f7bd75d58558.png) +![Postman Collection](/documenting-apis-mjjpz7e7nkvp/imgs/115104730-06d2f780-9f63-11eb-9f82-f7bd75d58558.png) You can enforce type-safety in this workflow by converting the JSON-formatted responses into TypeScript interfaces for the front-end applications using a tool like [JSON2Ts](http://www.json2ts.com//). @@ -215,7 +217,7 @@ npm run dev When the application is running, open your browser and navigate to http://localhost:4000 to explore the API. Expand the **Docs** section on the GraphQL Playground. The generated schema would contain the comment under the Post field: -![](/blog/documenting-apis-mjjpz7e7nkvp/imgs/115110406-ef583680-9f83-11eb-9155-753600312788.png) +![](/documenting-apis-mjjpz7e7nkvp/imgs/115110406-ef583680-9f83-11eb-9155-753600312788.png) ### Protocol buffers diff --git a/apps/blog/content/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/index.mdx b/apps/blog/content/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/index.mdx index 6b8ee61bbd..a3cdd1d35b 100644 --- a/apps/blog/content/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/index.mdx +++ b/apps/blog/content/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/index.mdx @@ -6,13 +6,14 @@ authors: - "Sabin Adams" metaTitle: "End-To-End Type-Safety with GraphQL, Prisma & React: Frontend" metaDescription: "Learn how to build a fully type-safe application with GraphQL, Prisma, and React. This article walks you through building a type-safe React app that accesses a GraphQL API." -metaImagePath: "/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/meta-dc0f147b1428391e4b3d0374523d45639d1318a6-1269x715.png" -heroImagePath: "/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/hero-2f58c7e9701e7f9a0250db211bdf5284da11d2d8-844x474.svg" +metaImagePath: "/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/meta-dc0f147b1428391e4b3d0374523d45639d1318a6-1269x715.png" +heroImagePath: "/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/hero-2f58c7e9701e7f9a0250db211bdf5284da11d2d8-844x474.svg" heroImageAlt: "hero image prisma" series: title: "Build a Fully Type-Safe Application with GraphQL, Prisma & React" - slug: "e2e-typesafety-graphql-react-yiw81oBkun" seriesIndex: 1 +tags: + - "education" excerpt: |
13 min read @@ -103,11 +104,11 @@ npm run dev ``` Once your development server is up and running you should see some output that looks similar to this: -![](/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/localhost.png) +![](/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/localhost.png) If you pop open the link from that output you will be presented with Vite's React and TypeScript template landing template page: -![](/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/vite-starter.png) +![](/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/vite-starter.png) ## Clean up the template @@ -188,7 +189,7 @@ TailwindCSS is now configured and ready to go! Replace the existing `

` tag i ``` If your webpage looks like this, congrats! You've successfully set up TailwindCSS! -![](/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/tailwind-complete.png) +![](/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/tailwind-complete.png) > **Note**: If not, try restarting your development server and ensure the steps above were followed correctly. @@ -363,7 +364,7 @@ export default App ``` If you head back to your browser you should see a nice box displaying your user's name! The only thing missing at this point is the user's messages. -![](/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/user-displayed.png) +![](/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/user-displayed.png) ## Display each user's messages @@ -434,7 +435,7 @@ function UserDisplay({ user }: Props) { ``` Over in your browser, you should now see each user's messages to their right! -![](/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/messages-displayed.png) +![](/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/messages-displayed.png) That looks great, however there is one last thing to add. You are building a tree view, so the final piece is to render "branches" that connect each message to its user. @@ -498,7 +499,7 @@ export default MessageDisplay ``` Back over in your browser, you will now see branches for each message! Hover over a message to highlight the branch ✨ -![](/blog/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/finished-ui.png) +![](/e2e-type-safety-graphql-react-1-i2gxifxksz/imgs/finished-ui.png) ## Summary & What's next diff --git a/apps/blog/content/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/index.mdx b/apps/blog/content/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/index.mdx index e394db7e6d..e59fdb59bd 100644 --- a/apps/blog/content/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/index.mdx +++ b/apps/blog/content/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/index.mdx @@ -6,13 +6,14 @@ authors: - "Sabin Adams" metaTitle: "End-To-End Type-Safety with GraphQL, Prisma & React: API Prep" metaDescription: "Learn how to build a fully type-safe application with GraphQL, Prisma, and React. This article walks you through setting up a TypeScript project, a PostgreSQL database, and Prisma." -metaImagePath: "/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/meta-06962f83ac8be93c511d0ef6cbc29e2cff49e387-1269x715.png" -heroImagePath: "/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/hero-838c88ca3817165045cc051d8845880e5a313baf-844x474.svg" +metaImagePath: "/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/meta-06962f83ac8be93c511d0ef6cbc29e2cff49e387-1269x715.png" +heroImagePath: "/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/hero-838c88ca3817165045cc051d8845880e5a313baf-844x474.svg" heroImageAlt: "hero image prisma" series: title: "Build a Fully Type-Safe Application with GraphQL, Prisma & React" - slug: "e2e-typesafety-graphql-react-yiw81oBkun" seriesIndex: 2 +tags: + - "education" excerpt: |
10 min read @@ -53,7 +54,7 @@ In the process, you will set up an important piece of the end-to-end type-safety -If you missed the [first part](/blog/e2e-type-safety-graphql-react-1-I2GxIfxkSZ) of this series, here is a quick overview of the technologies you will be using in this application, as well as a few prerequisites. +If you missed the [first part](/e2e-type-safety-graphql-react-1-I2GxIfxkSZ) of this series, here is a quick overview of the technologies you will be using in this application, as well as a few prerequisites. ### Technologies you will use @@ -160,7 +161,7 @@ You can now use the following command to run your code: ```shell npm run dev ``` -![](/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/run-dev.png) +![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/run-dev.png) ## Set up the database @@ -171,21 +172,21 @@ Head over to [https://railway.app](https://railway.app) and, if you don't alread After creating an account and logging in, you should see a page like this: -![](/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-home.png) +![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-home.png) Hit the **New Project** button, or simply click the **Create a New Project** area. You will be presented with a search box and a few common options. Select the **Provision PostgreSQL** option. -![](/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-postgres-option.png) +![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-postgres-option.png) The option selected above creates a new PostgreSQL database and deploys it. Once the server is ready, you should see your provisioned database on the screen. Click the **PostgreSQL** instance. -![](/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-new-db.png) +![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-new-db.png) That will open up a menu with a few different tabs. On the **Connect** tab, you will find your database's connection string. Take note of where to find this string as you will need them in just a little while. -![](/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-connect.png) +![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-connect.png) ## Set up Prisma @@ -311,7 +312,7 @@ The above command will create a new migration file named `init`, apply that migr If you head back over to the Railway UI, in the **Data** tab you should see your tables listed. If so, the migration worked and your database is ready to be put to work! -![](/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-tables.png) +![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-tables.png) ### Seed the database 🌱 @@ -408,7 +409,7 @@ npx prisma db seed ``` After running the script, if you head back to the Railway UI and into the **Data** tab, you should be able to navigate through the newly added data. -![](/blog/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-data.png) +![](/e2e-type-safety-graphql-react-2-j9meyhy0ej/imgs/railway-data.png) ## Summary & What's next diff --git a/apps/blog/content/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/index.mdx b/apps/blog/content/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/index.mdx index 502da215ea..34a3057611 100644 --- a/apps/blog/content/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/index.mdx +++ b/apps/blog/content/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/index.mdx @@ -6,13 +6,14 @@ authors: - "Sabin Adams" metaTitle: "End-To-End Type-Safety with GraphQL, Prisma & React: GraphQL API" metaDescription: "Learn how to build a fully type-safe application with GraphQL, Prisma, and React. This article walks you through building a type-safe GraphQL API" -metaImagePath: "/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/meta-c8b654f7165277e7cf2cfde5311381d601463251-1269x715.png" -heroImagePath: "/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/hero-78bb7b87f2bf7e691114b2768df5ddfe12e00934-844x474.svg" +metaImagePath: "/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/meta-c8b654f7165277e7cf2cfde5311381d601463251-1269x715.png" +heroImagePath: "/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/hero-78bb7b87f2bf7e691114b2768df5ddfe12e00934-844x474.svg" heroImageAlt: "hero image prisma" series: title: "Build a Fully Type-Safe Application with GraphQL, Prisma & React" - slug: "e2e-typesafety-graphql-react-yiw81oBkun" seriesIndex: 3 +tags: + - "education" excerpt: |
14 min read @@ -47,7 +48,7 @@ While building this API, you will focus on ensuring your interactions with the d -If you missed the [first part](/blog/e2e-type-safety-graphql-react-1-I2GxIfxkSZ) of this series, here is a quick overview of the technologies you will be using in this application, as well as a few prerequisites. +If you missed the [first part](/e2e-type-safety-graphql-react-1-I2GxIfxkSZ) of this series, here is a quick overview of the technologies you will be using in this application, as well as a few prerequisites. ### Technologies you will use @@ -121,7 +122,7 @@ If you start up your server, you will have access to a running _(empty)_ GraphQL ```shell npm run dev ``` -![](/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/yoga-start.png) +![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/yoga-start.png) > **Note**: The GraphQL server is up and running, however it is not usable because you have not yet defined any queries or mutations. @@ -266,7 +267,7 @@ npm run build ``` When you run the command above, you should see that Prisma Client and the Pothos integration were both generated. -![](/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/generate.png) +![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/generate.png) Now that those types are generated, head over to `src/builder.ts`. Here you will import the `PrismaPlugin` and the generated Pothos types and apply them to your builder: @@ -289,7 +290,7 @@ builder.addScalarType("Date", DateResolver, {}); ``` As soon as you add the generated types, you will notice a TypeScript error occur within the instantiation of the `SchemaBuilder`. -![](/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/prisma-type-required.png) +![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/prisma-type-required.png) Pothos is smart enough to know that, because you are using the Prisma plugin, you need to provide a `prisma` instance to the builder. This is used by Pothos to infer information about the types in your Prisma Client. In the next step you will create and add that instance to the builder. @@ -313,7 +314,7 @@ export const builder = new SchemaBuilder<{ ``` You will, again, see a TypeScript error at this point. This is because the `builder` now expects an instance of Prisma Client to be provided to the function. -![](/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/prisma-client-required.png) +![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/prisma-client-required.png) In the next step, you will instantiate Prisma Client and provide it here in the `builder`. @@ -402,7 +403,7 @@ import { builder } from "../builder"; +builder.prismaObject("User", {}) ``` > **Note**: If you press Ctrl + Space within an empty set of quotes before typing in the `name` field, you should get some nice auto-completion with a list of available models from your Prisma schema thanks to the Prisma plugin. -> ![](/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/model-auto.png) +> ![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/model-auto.png) Within the `options` object, add a `fields` key that defines the `id`, `name` and `messages` fields using Pothos's ["expose"](https://pothos-graphql.dev/docs/guide/fields#exposing-fields-from-the-underlying-data) functions: @@ -847,17 +848,17 @@ npm run dev ``` After running the above command, open up [http://localhost:4000/graphql](http://localhost:4000/graphql) in your browser to access the GraphQL playground. You should be presented with a page that looks like this: -![](/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/playground.png) +![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/playground.png) In the top-left corner of the screen, hit the **Explorer** button to see your API's available queries and mutations: -![](/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/explorer.png) +![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/explorer.png) If you click on the **users** query type, the right side of the screen will be automatically populated with a query for your user data. Run that query by hitting the "execute query" button to see the API in action: -![](/blog/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/data.png) +![](/e2e-type-safety-graphql-react-3-fbv2zvigwg/imgs/data.png) Feel free to play around with the different options to choose which fields you would like to query for and which data from the "messages" relation you would like to include. diff --git a/apps/blog/content/blog/e2e-type-safety-graphql-react-4-jaha8gbker/index.mdx b/apps/blog/content/blog/e2e-type-safety-graphql-react-4-jaha8gbker/index.mdx index a74a6f9912..e3086caea3 100644 --- a/apps/blog/content/blog/e2e-type-safety-graphql-react-4-jaha8gbker/index.mdx +++ b/apps/blog/content/blog/e2e-type-safety-graphql-react-4-jaha8gbker/index.mdx @@ -6,13 +6,14 @@ authors: - "Sabin Adams" metaTitle: "End-To-End Type-Safety with GraphQL, Prisma & React: Codegen & Deployment" metaDescription: "Learn how to build a fully type-safe application with GraphQL, Prisma, and React. This article walks you through setting up code generation to allow you to keep your TypeScript types in sync across your frontend and API. You will also deploy your completed project." -metaImagePath: "/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/meta-42c1cab53d152b8e3e634d75bc70b9d624431cf7-1269x715.png" -heroImagePath: "/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/hero-b277fdcfbb2267b2f5a9b5d2bd7f06e053febf0f-844x474.svg" +metaImagePath: "/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/meta-42c1cab53d152b8e3e634d75bc70b9d624431cf7-1269x715.png" +heroImagePath: "/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/hero-b277fdcfbb2267b2f5a9b5d2bd7f06e053febf0f-844x474.svg" heroImageAlt: "hero image prisma" series: title: "Build a Fully Type-Safe Application with GraphQL, Prisma & React" - slug: "e2e-typesafety-graphql-react-yiw81oBkun" seriesIndex: 4 +tags: + - "education" excerpt: |
16 min read @@ -46,7 +47,7 @@ In this final section of the series, you will set up the final piece of the end- -If you missed the [first part](/blog/e2e-type-safety-graphql-react-1-I2GxIfxkSZ) of this series, here is a quick overview of the technologies you will be using in this application, as well as a few prerequisites. +If you missed the [first part](/e2e-type-safety-graphql-react-1-I2GxIfxkSZ) of this series, here is a quick overview of the technologies you will be using in this application, as well as a few prerequisites. ### Technologies you will use @@ -85,17 +86,17 @@ To follow along with the examples provided, you will be expected to have: Currently, Prisma generates a set of TypeScript types based off of your database schema. Pothos uses those types to help build GraphQL type definitions. The result of those two pieces is a GraphQL schema: -![GraphQL API Type Flow](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/2.png) +![GraphQL API Type Flow](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/2.png) Your frontend project currently has a set of manually defined types, which were built in the first section of this series. These are "compatible with" the types in your API, but not directly related: -![React Application Types](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/3.png) +![React Application Types](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/3.png) Until now, this worked fine. But what happens if a new field is introduced, updated, or removed form the API? Your frontend application would have no idea a change occurred in the API and the type definitions in the two projects would become out of sync. How can you be sure a `user` object you retrieve over the network, for example, will contain all of the fields your React application is expecting? This is where [GraphQL Codegen](https://www.graphql-code-generator.com/) comes in: -![Fullstack Type Flow](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/1.png) +![Fullstack Type Flow](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/1.png) GraphQL Codegen will generate TypeScript types and query helpers in your React project based off of your GraphQL schema and the queries you write in your frontend application. @@ -217,7 +218,7 @@ npm run codegen ``` You should see output similar to this: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/codegen.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/codegen.png) As configured in your `codegen.yml` file, you will find a new file in `src/graphql` named `generated.ts`. @@ -339,7 +340,7 @@ export type User = GetUsersQuery["users"][0]; ``` If you head over to `src/components/UserDisplay.tsx` and inspect the type being used for the `user` prop, you will now see it uses the type generated from your GraphQL query and API: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/generated-types.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/generated-types.png) You now have almost every piece of the end-to-end type-safety puzzle put in place. Your types are in sync from your database all the way to your frontend application. @@ -467,7 +468,7 @@ export default App ``` Notice your API request results are properly typed based off of the types within the API itself! If both your API and Client are running, head over to the browser. You should now see all of your data! -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/finished.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/finished.png) Congrats! 🎉 At this point, you have implemented a completely end-to-end type safe application with two separate pieces: an API and the client. @@ -481,15 +482,15 @@ You will be using [Render](https://render.com/) to deploy both of your codebases In the top left corner of the home page, hit the **New** button to create a new repository: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-new.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-new.png) Give your repository a name and then hit **Create repository**: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-create.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-create.png) You will need to retrieve the SSH url for this repository to use later on. Grab that from the location shown below: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/url-github.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/url-github.png) Now within your React application, run the follwing command to initialize and push a local repository, replacing `` with the SSH url: @@ -516,15 +517,15 @@ git push -u origin main Next, you will repeat these steps for your API's codebase. Create another new repository from your Github dashboard: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-new.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-new.png) Title the repository and hit **Create repository**: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-api.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-api.png) You should again see a page with some setup instructions. Grab the SSH url from the same location as before: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-api-url.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/github-api-url.png) Finally, navigate via the terminal into your GraphQL API's codebase and run the following set of commands. Again, replace `` with your SSH url: @@ -556,11 +557,11 @@ Head over to [Render](https://render.com) and create a free account if you do no The first thing you will deploy is your GraphQL API. On your dashboard, hit the **New Web Service** button, which will allow you to deploy a Node.js application: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-web-service.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-web-service.png) On this page, if you haven't already, click **+ Connect account** under the **Github** header to give Render access to list your Github repositories: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-connect.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-connect.png) After connecting your account, you should see your repositories available under the **Connect a repository** header. Choose your GraphQL API repository. @@ -575,24 +576,24 @@ You will be prompted for a few different options: Beneath those options, choose the **Free** plan: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-free.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-free.png) Expand the **Advanced** section near the bottom of the page. Here you will define an environment variable that will hold your database URL. Click the **Add Environment Variable** button and add a variable named `DATABASE_URL` whose value is the connection string to your Postgres database: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-api-connection.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-api-connection.png) Finally, at the bottom of the page, hit the **Create Web Service** button: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-deploy-service.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-deploy-service.png) This will trigger the deployment process! Once that finishes deploying, you will be able to access the URL Render provides to see your GraphQL API. Copy the URL from the location shown below and navigate to it in a new browser window at the `/graphql` route: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/api-url.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/api-url.png) ## Deploy the React application @@ -600,7 +601,7 @@ Now that your API is deployed, you will deploy your React application. Head back over to the Render dashboard and hit the **New** button at the top of the page. Choose the **Static Site** option: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-new.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-new.png) Connect this static site to your React application's Github repostory. @@ -613,13 +614,13 @@ You will be prompted again to fill out some details for deploying this applicati Under the **Advanced** section, add an environment variable named `VITE_API_URL` whose value is the URL of your deployed GraphQL API at the `/graphql` route. For example: -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-api-url.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/render-api-url.png) Finally, hit the **Create Static Site** button at the bottom of the page to deploy the application. When that finishes deploying, head over to the URL available at the top of the page. If all went well, you should see your application is live! -![](/blog/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/app-complete.png) +![](/e2e-type-safety-graphql-react-4-jaha8gbker/imgs/app-complete.png) ## Summary & Final thoughts diff --git a/apps/blog/content/blog/elsevier-customer-story-ssaaskagmhtn/index.mdx b/apps/blog/content/blog/elsevier-customer-story-ssaaskagmhtn/index.mdx index 0201aaebd5..53b860dc96 100644 --- a/apps/blog/content/blog/elsevier-customer-story-ssaaskagmhtn/index.mdx +++ b/apps/blog/content/blog/elsevier-customer-story-ssaaskagmhtn/index.mdx @@ -6,9 +6,11 @@ authors: - "Alex Emerich" metaTitle: "How Elsevier piloted an innovative publication process with Prisma" metaDescription: "Elsevier is a global leader in information and analytics in scientific publishing. Learn how they modernized the publication process efficiently and flexibly with Prisma." -metaImagePath: "/blog/elsevier-customer-story-ssaaskagmhtn/imgs/hero-4eaa561121a703742d0016b7a60b69e0cc262dc8-1692x852.png" -heroImagePath: "/blog/elsevier-customer-story-ssaaskagmhtn/imgs/hero-4eaa561121a703742d0016b7a60b69e0cc262dc8-1692x852.png" +metaImagePath: "/elsevier-customer-story-ssaaskagmhtn/imgs/hero-4eaa561121a703742d0016b7a60b69e0cc262dc8-1692x852.png" +heroImagePath: "/elsevier-customer-story-ssaaskagmhtn/imgs/hero-4eaa561121a703742d0016b7a60b69e0cc262dc8-1692x852.png" heroImageAlt: "Elsevier" +tags: + - "usersuccessstory" excerpt: | Elsevier is a global leader in information and analytics in scientific publishing, and helps researchers and healthcare professionals advance science and improve health outcomes for the benefit of society. @@ -22,7 +24,7 @@ excerpt: | [Elsevier's](https://www.elsevier.com/) mission of helping researchers and healthcare professionals is rooted in publishing and has also evolved into a global leader in information and analytics. With so much health-related information being shared in real time, Elsevier decided it was time to modernize and speed up their existing manual peer review process. -![Peer Review Workflow](/blog/elsevier-customer-story-ssaaskagmhtn/imgs/peer-review-diagram-V3.png) +![Peer Review Workflow](/elsevier-customer-story-ssaaskagmhtn/imgs/peer-review-diagram-V3.png) Building an application to speed up the peer review process would help Elsevier remain a leader in healthcare research. They dedicated a small project team consisting of Serghei Ghidora (Tech Lead), Paul Foeckler (Product Owner), and a UX Designer to develop a minimum viable product (MVP) to make the peer review process faster and more efficient. @@ -116,7 +118,7 @@ The flexibility proved to be a major contributor to a single tech lead producing In addition to Prisma, Serghei utilized several other technologies to achieve their MVP. The project structure looks like the following, with Prisma serving types to multiple apps. -![Elsevier MVP Architecture](/blog/elsevier-customer-story-ssaaskagmhtn/imgs/elsevier-architecture-diagram.png) +![Elsevier MVP Architecture](/elsevier-customer-story-ssaaskagmhtn/imgs/elsevier-architecture-diagram.png) The **Prisma & Nexus** package includes the Prisma schema, migrations and all the generated types that are used across all apps and services. The lambdas import the Prisma client and update resources directly. This arrangement keeps the database and frontend types in sync because of Prisma Client's type-safe database access. diff --git a/apps/blog/content/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/index.mdx b/apps/blog/content/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/index.mdx index 743e957546..0153733f8f 100644 --- a/apps/blog/content/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/index.mdx +++ b/apps/blog/content/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/index.mdx @@ -5,8 +5,8 @@ date: "2017-11-22" authors: - "Nikolas Burk" metaTitle: "Enabling CORS for Express-GraphQL & Apollo Server | Prisma" -metaImagePath: "/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/hero-88be8d72c611e06bf0170f1e0416f589d50262dd-720x481.jpg" -heroImagePath: "/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/hero-88be8d72c611e06bf0170f1e0416f589d50262dd-720x481.jpg" +metaImagePath: "/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/hero-88be8d72c611e06bf0170f1e0416f589d50262dd-720x481.jpg" +heroImagePath: "/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/hero-88be8d72c611e06bf0170f1e0416f589d50262dd-720x481.jpg" heroImageAlt: "Enabling CORS for Express-GraphQL & Apollo Server" excerpt: | Learn how to configure cross-origin resource sharing on your express-based GraphQL servers. @@ -126,21 +126,21 @@ export default graphql( In your local development setup, where the React app is loaded from [`http://localhost:3000`](http://localhost:3000) and the GraphQL server is serving at [`http://localhost:4000`](http://localhost:4000)/graphql, you’ll now get an access control error if you’re trying to run the app: -![](/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*ZbsVGATAeIp5iU2504VP2A.png) +![](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*ZbsVGATAeIp5iU2504VP2A.png) What exactly is the issue when CORS is not enabled? Well, CORS is in fact a _specification_ for a communication flow between client (a browser) and server. In some situations, this flow requires the server to process HTTP [OPTIONS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS) requests as can be seen from this flowchart: -![The CORS flow might required additional HTTP requests with the [OPTIONS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS) method ([source](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#/media/File:Flowchart_showing_Simple_and_Preflight_XHR.svg))](/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*m6QGz5tXtLt7uVapNCpBEw.png)_The CORS flow might required additional HTTP requests with the [OPTIONS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS.png) method ([source](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#/media/File:Flowchart_showing_Simple_and_Preflight_XHR.svg))_ +![The CORS flow might required additional HTTP requests with the [OPTIONS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS) method ([source](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#/media/File:Flowchart_showing_Simple_and_Preflight_XHR.svg))](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*m6QGz5tXtLt7uVapNCpBEw.png)_The CORS flow might required additional HTTP requests with the [OPTIONS](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS.png) method ([source](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#/media/File:Flowchart_showing_Simple_and_Preflight_XHR.svg))_ The problem is that neither `express-graphql` nor `apollo-server` accept HTTP requests other than GET and POST — which is why the request fails in our scenario. This is also indicated by the error message we saw in the console: `OPTIONS [http://localhost:4000](http://localhost:4000) 405 (Method not allowed)`. > [Here](https://github.com/graphql/express-graphql/issues/14) is the GitHub discussion on `express-graphql` where this issue first came up**.** -Luckily, the solution is very simple. As `express-graphql` and `apollo-server` are both based on [express.js](https://github.com/expressjs), you can simply use its standard [cors](/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/cors#configuration-options) middleware to fix the issue. +Luckily, the solution is very simple. As `express-graphql` and `apollo-server` are both based on [express.js](https://github.com/expressjs), you can simply use its standard [cors](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/cors#configuration-options) middleware to fix the issue. Uncommenting [line 23](https://github.com/nikolasburk/graphql-cors-example/blob/master/server/index.js#L23) in `server.js` will enable the cors middleware for your express server: `app.use(cors())`. Having the middleware enabled ensures your express server sets the proper HTTP header, enabling your React app to load data from it: -![Using the [cors](/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/cors) middleware, the server sets the correct HTTP header enabling cross-origin resource sharing](/blog/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*LnVsDQuQtSl-Wt-m6DfO5g.png)_Using the [cors](https://github.com/expressjs/cors) middleware, the server sets the correct HTTP header enabling cross-origin resource sharing_ +![Using the [cors](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/cors) middleware, the server sets the correct HTTP header enabling cross-origin resource sharing](/enabling-cors-for-express-graphql-apollo-server-1ef999bfb38d/imgs/1*LnVsDQuQtSl-Wt-m6DfO5g.png)_Using the [cors](https://github.com/expressjs/cors) middleware, the server sets the correct HTTP header enabling cross-origin resource sharing_ ## Summary diff --git a/apps/blog/content/blog/esop-exercise-windows/index.mdx b/apps/blog/content/blog/esop-exercise-windows/index.mdx index 6983bb0eb3..848f75efd8 100644 --- a/apps/blog/content/blog/esop-exercise-windows/index.mdx +++ b/apps/blog/content/blog/esop-exercise-windows/index.mdx @@ -6,8 +6,8 @@ authors: - "Martin Janse van Rensburg" metaTitle: "Prisma | A Business Case for Extended ESOP Exercise Windows" metaDescription: "Explore extending ESOPs to 10 years, considering fairness, economics, benefits, challenges with Prisma's example, and startup compensation." -metaImagePath: "/blog/esop-exercise-windows/imgs/meta-da1df6bc6f7afc4cf8f1620698c60d0c2a6cd768-1200x630.png" -heroImagePath: "/blog/esop-exercise-windows/imgs/hero-187cb6c0e9ac7a4c48892a3e196329e955984278-844x474.svg" +metaImagePath: "/esop-exercise-windows/imgs/meta-da1df6bc6f7afc4cf8f1620698c60d0c2a6cd768-1200x630.png" +heroImagePath: "/esop-exercise-windows/imgs/hero-187cb6c0e9ac7a4c48892a3e196329e955984278-844x474.svg" heroImageAlt: "Extended ESOP Exercise Windows" excerpt: | As a progressive OSS SaaS company, we are expanding our commitment to transparency by sharing insights into our operational practices, starting with our approach to stock options. diff --git a/apps/blog/content/blog/formbricks-and-prisma-accelerate-solving-scalability-together/index.mdx b/apps/blog/content/blog/formbricks-and-prisma-accelerate-solving-scalability-together/index.mdx index 1bee04093f..60a3a3f154 100644 --- a/apps/blog/content/blog/formbricks-and-prisma-accelerate-solving-scalability-together/index.mdx +++ b/apps/blog/content/blog/formbricks-and-prisma-accelerate-solving-scalability-together/index.mdx @@ -6,9 +6,12 @@ authors: - "Marc Hess" metaTitle: "Formbricks' success story: Enhancing scalability with Prisma Accelerate" metaDescription: "Learn how Formbricks tackled performance bottlenecks and enhanced server performance and user experience with Prisma Accelerate." -metaImagePath: "/blog/formbricks-and-prisma-accelerate-solving-scalability-together/imgs/meta-e5f44f24630fabc28fd03092a220f9ad09fccc84-1800x945.png" -heroImagePath: "/blog/formbricks-and-prisma-accelerate-solving-scalability-together/imgs/hero-2dedf610e6c3e1bfd7d7d262e086c9ced48412fa-804x474.svg" +metaImagePath: "/formbricks-and-prisma-accelerate-solving-scalability-together/imgs/meta-e5f44f24630fabc28fd03092a220f9ad09fccc84-1800x945.png" +heroImagePath: "/formbricks-and-prisma-accelerate-solving-scalability-together/imgs/hero-2dedf610e6c3e1bfd7d7d262e086c9ced48412fa-804x474.svg" heroImageAlt: "Prisma Accelerate Logo and Formbricks Logo" +tags: + - "data-platform" + - "usersuccessstory" excerpt: | Explore Formbricks' journey, an open-source survey platform, as they effectively tackled scalability challenges with [Prisma Accelerate](https://www.prisma.io/data-platform/accelerate?utm_source=blog&utm_medium=customer-story-formbricks). Learn how they strategically integrated it to manage growing user demands and maintained high performance. --- @@ -17,7 +20,7 @@ excerpt: | Formbricks began with a clear vision: to provide a free, open-source surveying platform that empowers businesses to gather feedback seamlessly at every point in the user journey. From in-app and website surveys to link and email questionnaires, Formbricks offers a comprehensive suite of tools designed for beautiful, effective user engagement. -![Formbricks User Interface Image](/blog/formbricks-and-prisma-accelerate-solving-scalability-together/imgs/c4d6d20630e17f115e3b5740d6b5aba945e6b007-2000x1337.png) +![Formbricks User Interface Image](/formbricks-and-prisma-accelerate-solving-scalability-together/imgs/c4d6d20630e17f115e3b5740d6b5aba945e6b007-2000x1337.png) Formbricks isn't just about collecting data; it's about crafting exceptional user experiences. With its privacy-first approach, Formbricks stands as both a survey platform and an experience management powerhouse. Users can leverage the Formbricks Insight Platform for prebuilt data analysis capabilities or build upon it to create tailored solutions. diff --git a/apps/blog/content/blog/from-rust-to-typescript-a-new-chapter-for-prisma-orm/index.mdx b/apps/blog/content/blog/from-rust-to-typescript-a-new-chapter-for-prisma-orm/index.mdx index 0a84d4dbe3..fb45af9b99 100644 --- a/apps/blog/content/blog/from-rust-to-typescript-a-new-chapter-for-prisma-orm/index.mdx +++ b/apps/blog/content/blog/from-rust-to-typescript-a-new-chapter-for-prisma-orm/index.mdx @@ -6,12 +6,11 @@ authors: - "Jon Harrell" metaTitle: "Prisma ORM Architecture Shift: Why We Moved from Rust to TypeScript" metaDescription: "Why is Prisma ORM switching from Rust to TypeScript? Read the full architectural rationale and what the new Query Compiler means for your app's speed" -metaImagePath: "/blog/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/meta-ded124ddfa8412b0d678ab94a9804127188fde00-1266x711.png" -heroImagePath: "/blog/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/hero-0f2a3395d4395fe407ce7fb6b603bb7c5ff3e460-844x474.svg" +metaImagePath: "/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/meta-ded124ddfa8412b0d678ab94a9804127188fde00-1266x711.png" +heroImagePath: "/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/hero-0f2a3395d4395fe407ce7fb6b603bb7c5ff3e460-844x474.svg" heroImageAlt: "Prisma ORM Architecture Shift: Why We Moved from Rust to TypeScript" series: title: "Prisma ORM: The Complete Rust-to-TypeScript Migration Journey" - slug: "prisma-orm-the-complete-rust-to-typescript-migration-journey" seriesIndex: 1 excerpt: | The Prisma query engine, written in Rust, has always been a core part of Prisma ORM. It was developed for the future, but is no longer compatible with Prisma ORM’s current direction. Read on to learn more about our rewrite from Rust to TypeScript. @@ -77,13 +76,13 @@ Today, there are two ways that you can query a database with Prisma ORM: In the first approach, Prisma ORM queries are passed to the query engine, written in Rust. This engine manages everything from building the query plan to executing queries and returning results to the JavaScript client: -![Prisma ORM communicating with a database](/blog/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/598f7a3ad7506e4515a5b40eead655dcf35c0551-1280x600.png) +![Prisma ORM communicating with a database](/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/598f7a3ad7506e4515a5b40eead655dcf35c0551-1280x600.png) However, this architecture cannot support databases that only provide JavaScript drivers, such as D1 and Turso. To address this limitation, we introduced driver adapters. When using a driver adapter, the query engine still develops the query plan and generates SQL statements. The execution, however, is delegated through the driver adapter to the database: -![Prisma ORM communicating with a database via a driver adapter.](/blog/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/c63df7c781f89520601e5a727a48e01b07475569-1280x889.png) +![Prisma ORM communicating with a database via a driver adapter.](/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/c63df7c781f89520601e5a727a48e01b07475569-1280x889.png) This approach enables compatibility with JavaScript drivers but introduces a tradeoff: data must be serialized from JavaScript to Rust and then back to JavaScript, reducing efficiency and negating some of the benefits of this method. @@ -91,7 +90,7 @@ This approach enables compatibility with JavaScript drivers but introduces a tra In the new architecture, driver adapters will remain in use. However, instead of relying on a Rust-based query engine, Prisma ORM will pass the query to a WASM compiler, which will return the query plan. This plan will then be **executed entirely in TypeScript**: -![Prisma ORM communicating with a database in the query compiler project](/blog/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/1a90825c7f7897d07fa9422a4c9a2415befb0a80-1480x695.png) +![Prisma ORM communicating with a database in the query compiler project](/from-rust-to-typescript-a-new-chapter-for-prisma-orm/imgs/1a90825c7f7897d07fa9422a4c9a2415befb0a80-1480x695.png) This simplified architecture delivers several immediate benefits: diff --git a/apps/blog/content/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/index.mdx b/apps/blog/content/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/index.mdx index 4ea1f90956..316596c9fd 100644 --- a/apps/blog/content/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/index.mdx +++ b/apps/blog/content/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/index.mdx @@ -5,9 +5,11 @@ date: "2021-01-19" authors: - "Ryan Chenkie" metaTitle: "Applying Full Stack Type Safety with Angular, Nest, Nx & Prisma" -metaImagePath: "/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/meta-6edf92a2f15ffb62ed50e0da3deed2b2908d0156-2398x1208.png" -heroImagePath: "/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/hero-2e21e72be724fc37acc24f269c8b6a0628ad5a18-870x438.jpg" +metaImagePath: "/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/meta-6edf92a2f15ffb62ed50e0da3deed2b2908d0156-2398x1208.png" +heroImagePath: "/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/hero-2e21e72be724fc37acc24f269c8b6a0628ad5a18-870x438.jpg" heroImageAlt: "Full Stack Type Safety with Angular, Nest, Nx, and Prisma" +tags: + - "education" excerpt: | TypeScript really shines when we can extend type safety to all parts of our stack. In this article, we'll look at how to apply type safety to every part of a full stack Angular and NestJS app, including database access. We'll see how to share types across the stack by using an Nx monorepo. @@ -27,7 +29,7 @@ In this article, we'll look at how we can use the types generated by Prisma to a Check out the [code for the project on GitHub](https://github.com/chenkie/shirt-shop). -![Products from ShirtShop](/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-10.png) +![Products from ShirtShop](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-10.png) ## Create an Nx Workspace @@ -46,7 +48,7 @@ npx create-nx-workspace --preset=angular An interactive prompt takes us through the setup process. Select a name for the workspace and application and then continue through the prompts. -![Interactive prompts for setting up an Nx workspace](/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-1.png) +![Interactive prompts for setting up an Nx workspace](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-1.png) Once Nx finishes wiring up the workspace, open it up and try running the Angular application. @@ -59,7 +61,7 @@ npm start This command will tell Nx to serve the Angular application that was created as the workspace initialized. After it compiles, open up `localhost:4200` to make sure everything is working. -![The Angular application running on localhost:4200](/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-2.png) +![The Angular application running on localhost:4200](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-2.png) ## Add a NestJS Application @@ -189,17 +191,17 @@ npx prisma studio Running this command will open Prisma Studio. In the browser, it opens at `localhost:5555`. -![Prisma Studio running at localhost:5555](/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-4.png) +![Prisma Studio running at localhost:5555](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-4.png) We can use Prisma Studio to add data to the database manually. This isn't a great approach if we have a lot of data to seed, but it's useful if we want to add a few records to test with. Add as many rows as you like and input data for them. If you would like to work with the data seen in this article, you can grab it in [this gist](https://gist.github.com/chenkie/9bd80bc2767e72f71582a02e05c7f853). -![New rows in Prisma Studio](/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-5.png) +![New rows in Prisma Studio](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-5.png) Next, save the changes. IDs for each row will automatically be generated. -![Saved data in Prisma Studio](/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-6.png) +![Saved data in Prisma Studio](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-6.png) We now have all the pieces of our stack in place! We're ready to start writing some code to surface the data from the API and call for it from the Angular app. @@ -299,11 +301,11 @@ export class AppModule {} Now head over to the browser and test it out by going to `http://localhost:3333/api/products`. -![Products data from the API](/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-7.png) +![Products data from the API](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-7.png) It may not be very apparent at this point, but our endpoint has a layer of type safety applied to it that can help us out if we need to manipulate and/or modify data before it is returned to the client. For example, if we need to map over our data and get access to its properties, we now have full autocompletion enabled when we do so. This occurs because we told the `getProducts` method in the `ProductsService` that the return type is a `Promise` that resolves with an array of type `Product`. -![Autocompletion on the Product type](/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-8.png) +![Autocompletion on the Product type](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-8.png) Now that we have the API working, let's wire up the Angular application to make a call for this data and display it! @@ -562,7 +564,7 @@ export class ProductsComponent implements OnInit { This is another spot where we're using our `Product` type from `@prisma/client` to give ourselves type safety. Applying this type directly to the `$products` observable means that we can get autocompletion in our Angular templates. -![Autocompletion in the Angular template](/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-9.png) +![Autocompletion in the Angular template](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-9.png) With our component in place, we're now ready to call it from the `shirt-shop` app and display the results! @@ -576,7 +578,7 @@ Open up `apps/shirt-shop/src/app/app.component.html` and include the `Products` ``` -![Products from ShirtShop](/blog/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-10.png) +![Products from ShirtShop](/full-stack-typesafety-with-angular-nest-nx-and-prisma-ccmk7fbqftwc/imgs/nx-prisma-10.png) ## Going Beyond Displaying Data diff --git a/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/index.mdx b/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/index.mdx index 8057ff5bd8..4e548b7a3c 100644 --- a/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/index.mdx +++ b/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/index.mdx @@ -7,15 +7,16 @@ authors: - "Alex Ruheni" metaTitle: "Fullstack app with TypeScript, Next.js, Prisma & GraphQL - GraphQL API" metaDescription: "Learn how to build a fullstack app using TypeScript, PostgreSQL, Next.js, GraphQL and Prisma. In this article you are going to create a GraphQL API'" -metaImagePath: "/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/hero-3c25e8ccea9b86c6d7a625f95cd6b42f76c8c5e7-1269x714.png" -heroImagePath: "/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/hero-3c25e8ccea9b86c6d7a625f95cd6b42f76c8c5e7-1269x714.png" +metaImagePath: "/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/hero-3c25e8ccea9b86c6d7a625f95cd6b42f76c8c5e7-1269x714.png" +heroImagePath: "/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/hero-3c25e8ccea9b86c6d7a625f95cd6b42f76c8c5e7-1269x714.png" heroImageAlt: "Fullstack App With TypeScript, PostgreSQL, Next.js, Prisma & GraphQL: GraphQL API" series: title: "Building a fullstack app using TypeScript, PostgreSQL, Next.js, GraphQL and Prisma" - slug: "fullstack-nextjs-and-graphql-md1tczpfz1" seriesIndex: 2 excerpt: This article is the second part of a course where you build a fullstack app with Next.js, GraphQL, TypeScript, Prisma, and PostgreSQL. In this article, you will create the GraphQL API and interact with it on the frontend. +tags: + - "education" --- ## Table of contents @@ -90,7 +91,7 @@ npm run dev ``` The app will be running at [`http://localhost:3000/`](http://localhost:3000/) and you will see four items. The data is hardcoded and comes from the `/data/links.ts` file. -![What the starter project looks like](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/awesome-links-starter-project.png) +![What the starter project looks like](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/awesome-links-starter-project.png) ## Seeding the database @@ -229,7 +230,7 @@ query { } } ``` -![Example of GraphQL query](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-example-query.png) +![Example of GraphQL query](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-example-query.png) The API only returns the `id` and `title`, even though a link has more fields. @@ -464,7 +465,7 @@ npm run dev ``` When you navigate to [`http://localhost:3000/api/graphql/`](http://localhost:3000/api/graphql/), you should see the following page: -![GraphiQL Playground for running queries](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-playground.png) +![GraphiQL Playground for running queries](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-playground.png) GraphQL Yoga provides an interactive playground called GraphiQL you could use to explore the GraphQL schema and interact with your API. @@ -479,13 +480,13 @@ query { } } ``` -![GraphiQL Playground with an example query](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-documentation-explorer.png) +![GraphiQL Playground with an example query](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-documentation-explorer.png) The responses should be visible on the left panel, similar to the screenshot above. The Documentation Explorer (top left button on the page) will allow you to explore each query/mutation individually, seeing the different needed arguments along with their types. -![GraphiQL documentation explorer](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-documentation-explorer.png) +![GraphiQL documentation explorer](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-documentation-explorer.png) ### Initialize Prisma Client @@ -682,7 +683,7 @@ export const config = { Make sure the server is running and navigate to `http://localhost:3000/api/graphql`. You will be able to send a query with an `ok` field, which will return `true` -![Query](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-pothos-ok-query.png) +![Query](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-pothos-ok-query.png) ### Defining the schema using Pothos @@ -782,7 +783,7 @@ The `query` argument in the resolver function adds a `select` or `include` to yo Now if you go back to the GraphiQL, you will be able to send a query that returns all links from the database. -![`link` query response on GraphiQL](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-query-db-data.png) +![`link` query response on GraphiQL](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/graphiql-query-db-data.png) ## Client-side GraphQL queries @@ -936,13 +937,13 @@ Now at the database level, there are two pagination techniques that you can use: For more information on why you may want to use off-set based pagination, check out the [documentation](https://www.prisma.io/docs/concepts/components/prisma-client/pagination#use-cases-for-offset-pagination). -![Offset-based pagination](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/offset-skip-take.png) +![Offset-based pagination](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/offset-skip-take.png) - Cursor-based pagination: you use a cursor to bookmark a location in a result set. On subsequent requests you can then jump straight to that saved location. Similar to how you can access an array by its index. The cursor must be a unique, sequential column - such as an ID or a timestamp. This approach is more efficient than offset-based pagination and will be the one you use in this tutorial. -![Cursor-based pagination](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/cursor-pagination.png) +![Cursor-based pagination](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/cursor-pagination.png) ### Pagination in GraphQL @@ -991,7 +992,7 @@ Alternatively, you can make this request as the user reaches the end of the page The way this works is that you fetch some data as the page first loads. Then after clicking a button, you send a second request to the API which includes how many items you want returned and a cursor. The data is then returned and displayed on the client. -![How Pagination works client-side](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/pagination-on-the-client-diagram.png) +![How Pagination works client-side](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/pagination-on-the-client-diagram.png) > **Note**: an example of two-way pagination is a chat app like Slack, where you can load messages by going forwards or backwards. @@ -1090,7 +1091,7 @@ builder.queryField('links', (t) => Here is a diagram that summarizes how pagination works on the server: -![How Pagination works on the server](/blog/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/pagination-on-the-server-diagram.png) +![How Pagination works on the server](/fullstack-nextjs-graphql-prisma-2-fwpc6ds155/imgs/pagination-on-the-server-diagram.png) ### Pagination on the client using `fetchMore()` diff --git a/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/index.mdx b/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/index.mdx index e2c051cea7..8915a2a7e7 100644 --- a/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/index.mdx +++ b/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/index.mdx @@ -7,13 +7,14 @@ authors: - "Alex Ruheni" metaTitle: "Fullstack app with TypeScript, Next.js, Prisma & GraphQL - Authentication" metaDescription: "Learn how to build a fullstack app using TypeScript, PostgreSQL, Next.js, GraphQL, and Prisma. In this article, you will learn how to add authentication and authorization to your application using Auth0" -metaImagePath: "/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/meta-91075c8f117cdbd825ecc504f44bf57d5916e0af-1269x714.png" -heroImagePath: "/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/hero-6e7a91ceafb378a17154ba9cb238ed0953434c64-844x474.svg" +metaImagePath: "/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/meta-91075c8f117cdbd825ecc504f44bf57d5916e0af-1269x714.png" +heroImagePath: "/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/hero-6e7a91ceafb378a17154ba9cb238ed0953434c64-844x474.svg" heroImageAlt: "Fullstack App With TypeScript, PostgreSQL, Next.js, Prisma & GraphQL: Authentication" series: title: "Building a fullstack app using TypeScript, PostgreSQL, Next.js, GraphQL and Prisma" - slug: "fullstack-nextjs-and-graphql-md1tczpfz1" seriesIndex: 3 +tags: + - "education" excerpt: | This article is the third part of the course where you build a fullstack app with Next.js, GraphQL, TypeScript, Prisma and PostgreSQL. In this article, you will learn how to add authentication to your app. @@ -154,11 +155,11 @@ To secure the app, you will use [Auth0](https://auth0.com) – an authentication After [creating an account](https://auth0.com/signup), navigate to the **Applications** dropdown located on the left sidebar and select **Applications** from the sub-menu. -![Auth0 Dashboard](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-home.png) +![Auth0 Dashboard](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-home.png) Next, create a new application by clicking the **+ Create application** button. Give your app a name, select **Regular Web Application** and finalize creating the app by selecting the **Create** button on the bottom right of the dialog. -![Creating a new Auth0 application](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-create-application.png) +![Creating a new Auth0 application](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-create-application.png) Once the application is successfully created, navigate to the **Settings** tab and copy the following information to the `.env` file of your project: @@ -166,7 +167,7 @@ Once the application is successfully created, navigate to the **Settings** tab a - Client ID - Client Secret -![Auth0 application settings](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-app-settings.png) +![Auth0 application settings](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-app-settings.png) ```shell # .env @@ -188,7 +189,7 @@ Save these configuration changes by clicking the **Save Changes** button at the When you're deploying your app to production, you can replace `localhost` with your deployed app's domain. Auth0 allows multiple URLs, so you can include both `localhost` and production URLs – separated by a comma. -![Auth0 app configuring URLs](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-app-settings-url.png) +![Auth0 app configuring URLs](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-app-settings-url.png) ### Add the Auth0 SDK @@ -379,7 +380,7 @@ The `useUser` hook from Auth0 checks whether a user is authenticated or not. Thi If you have done all the previous steps correctly, you should be able to sign up and login to the app! -![Auth0 Login/ Signup page](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/app-login-signup.png) +![Auth0 Login/ Signup page](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/app-login-signup.png) > Note: If you want to only allow authenticated requests to your GraphQL API, you can use the [`withApiAuthRequired`](https://github.com/auth0/nextjs-auth0/blob/main/EXAMPLES.md#protect-an-api-route) function from Auth0 to secure it. @@ -394,19 +395,19 @@ You will define an API route that will receive the information sent from the Aut To get started with Auth0 Actions, navigate to the **Actions** dropdown located in the left sidebar, select **Flows** and choose **Login**. -![Auth0 Actions choose flow](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-login.png) +![Auth0 Actions choose flow](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-login.png) Next, to create a new Action, click the **+** icon and choose **Build custom**. -![Create a custom Auth0 Action](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-ui.png) +![Create a custom Auth0 Action](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-ui.png) Pick a name for your custom Action, for example, "Create DB User" and complete the process by selecting **Create**. -![Create Action](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-create-new.png) +![Create Action](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-create-new.png) After completing the previous step, you will be able to manage your newly created Action. -![Auth0 Action management](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-define-action.png) +![Auth0 Action management](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-actions-define-action.png) Here is a breakdown of the Auth0 Actions UI: @@ -417,7 +418,7 @@ Here is a breakdown of the Auth0 Actions UI: The first step is to include the `node-fetch` module version `2.6.1`. You will use it in your Action to send a request to an API endpoint – you will create this later. This endpoint will handle the logic of creating a user record in the database. -![Include package in Auth0 Action](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-add-module.png) +![Include package in Auth0 Action](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-add-module.png) Next, define a secret that will be included in every request sent by the Action to your endpoint. This secret will ensure that the requests are coming from the Auth0 Action instead of another untrusted third party. @@ -428,14 +429,14 @@ openssl rand -hex 32 ``` First, store this secret in the Auth0 dashboard with the key `AUTH0_HOOK_SECRET`. -![Auth0 add environment variables](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-add-hook-secret.png) +![Auth0 add environment variables](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-add-hook-secret.png) Now, also store the secret in your `.env` file. ```shell AUTH0_HOOK_SECRET='' # same secret goes here ``` -![Auth0 add environment variables](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-add-hook-secret.png) +![Auth0 add environment variables](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-add-hook-secret.png) Finally, update the Action with the following code: @@ -493,7 +494,7 @@ npx ngrok http 3000 --authtoken "TOKEN" The output on your terminal will resemble the following – but with different **Forwarding** URLs: -![Ngrok exposing localhost:3000](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/ngrok.png) +![Ngrok exposing localhost:3000](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/ngrok.png) Copy the **Forwarding** URL, replace `localhost:3000` with your **Forwarding** URL in your Action and click **Deploy**. @@ -501,7 +502,7 @@ Now that the action is deployed, go back to the **Login** flow by pressing the * The final thing you need to do is add your newly created action to the **Login** flow. You will find the action underneath the **Custom** tab. To add the action to your flow, you can drag-and-drop it between **Start** and **Complete**. Then click **Apply** to save the changes. -![Customize the Loginflow](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-customize-login-flow.png) +![Customize the Loginflow](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/auth0-action-customize-login-flow.png) ### Define an API route for creating new users @@ -545,7 +546,7 @@ This endpoint does the following: Once a user signs up to your application, the user's information will be synced to your database. You can view the newly created user in your database through Prisma Studio. -![Prisma Studio – Created User](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/prisma-studio-created-user.png) +![Prisma Studio – Created User](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/prisma-studio-created-user.png) ### Create links – auth protected page @@ -896,7 +897,7 @@ You can change this by modifying the `role` field of the user in the database. T First start Prisma Studio by running `npx prisma studio` in the terminal. Then click the **User** model and find the record matching the current user. Now, go ahead and update your user role from `USER` to `ADMIN`. Save your changes by pressing the **Save 1 change** button. -![Prisma Studio – update user role](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/prisma-studio-role-update.png) +![Prisma Studio – update user role](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv/imgs/prisma-studio-role-update.png) Navigate to the `/admin` page of your application and voila! You can now create links again. diff --git a/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/index.mdx b/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/index.mdx index 2e77b3ad05..0d9e4a49f5 100644 --- a/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/index.mdx +++ b/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/index.mdx @@ -7,13 +7,14 @@ authors: - "Alex Ruheni" metaTitle: "Fullstack app with TypeScript, Next.js, Prisma & GraphQL - Image upload " metaDescription: "Learn how to build a fullstack app using TypeScript, PostgreSQL, Next.js, GraphQL and Prisma. In this article you are going to learn how to add image upload using AWS S3" -metaImagePath: "/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/meta-020d4caf40065aad2ab5d59cff56d2bec9470bd9-1269x714.png" -heroImagePath: "/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/hero-0672449d4925722e1d058122cf3ef071ca3235e4-844x474.svg" +metaImagePath: "/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/meta-020d4caf40065aad2ab5d59cff56d2bec9470bd9-1269x714.png" +heroImagePath: "/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/hero-0672449d4925722e1d058122cf3ef071ca3235e4-844x474.svg" heroImageAlt: "Fullstack App With TypeScript, PostgreSQL, Next.js, Prisma & GraphQL: Image upload" series: title: "Building a fullstack app using TypeScript, PostgreSQL, Next.js, GraphQL and Prisma" - slug: "fullstack-nextjs-and-graphql-md1tczpfz1" seriesIndex: 4 +tags: + - "education" excerpt: | This article is the fourth part of the course where you build a fullstack app with Next.js, GraphQL, TypeScript, Prisma and PostgreSQL. In this article, you will learn how to add image upload using AWS S3. @@ -38,7 +39,7 @@ excerpt: | In this course you will learn how to build "awesome-links", a fullstack app where users can browse through a list of curated links and bookmark their favorite ones. -In [part 3](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv), you added authentication to the app and created a page for adding new links using placeholder images. +In [part 3](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv), you added authentication to the app and created a page for adding new links using placeholder images. This guide will teach you how to add support for image upload using AWS S3. If you're following along from part 3, you can skip project setup and jump into the [using AWS S3 to add support for image upload](#using-aws-s3-to-add-suport-for-image-upload) section. @@ -79,11 +80,11 @@ If `prisma migrate dev` did not trigger the seed step, run the following command ```shell npx prisma db seed ``` -> Refer to [Part 1 – Add Prisma to your Project](/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw#add-prisma-to-your-project) for more details on the format of the connection string. +> Refer to [Part 1 – Add Prisma to your Project](/fullstack-nextjs-graphql-prisma-oklidw1rhw#add-prisma-to-your-project) for more details on the format of the connection string. This command will run the `seed.ts` file in the `/prisma` directory. `seed.ts` creates four links and one user in your database using Prisma Client. -> Note: Refer to [part 3](/blog/fullstack-nextjs-graphql-prisma-3-clxbrcqppv) for how to set up Auth0. +> Note: Refer to [part 3](/fullstack-nextjs-graphql-prisma-3-clxbrcqppv) for how to set up Auth0. ### Project structure and dependencies @@ -165,35 +166,35 @@ To interact with AWS resources, you have to create an [Identity Access Managemen To do that, select **Security Credentials** from the dropdown menu located in the top right corner of the page – where your username is. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-management-console.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-management-console.png) Next, select the **Users** option from the **Access Management** dropdown located in the left sidebar. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-users.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-users.png) Next, click the **Add users** button to create a new user. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-all-users.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-all-users.png) Provide a recognizable username for the newly created user and check the **Access key - programmatic access** checkbox. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-pick-username.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-pick-username.png) Next, you need to specify what the user can do with different AWS resources by setting permissions. Select the **Attach existing policies directly** option and type "S3" in the search filter. Select **AmazonS3FullAccess**. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-permissions.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-permissions.png) You can optionally define tags for newly created IAM users, but you do not need to do that for this project, so click **Next: Review**. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-optional-tags.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-optional-tags.png) After reviewing that the user has the correct permissions and username, click **Create user**. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-create-user-screen.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-create-user-screen.png) Finally, copy the "Access Key ID" and the "Secret Access Key" and store them in your `.env` file -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-user-credentials.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-iam-user-credentials.png) > Note: These credentials can only be viewed once, so in case you lose these credentials or want to change them, you will need to generate new ones. @@ -206,12 +207,12 @@ APP_AWS_SECRET_KEY = '' The next step is to create an AWS S3 bucket which will store the uploaded objects. You can find the S3 service by looking it up in the search bar or by going to [https://s3.console.aws.amazon.com/](https://s3.console.aws.amazon.com/). -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-select-s3.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-select-s3.png) > Note: there are different ways you can provison resources in AWS, you are using the AWS console for simplicity Next, click on **Create bucket** to create a new bucket. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3.png) Pick a name and a region for your bucket. Save these values in your `.env` file. @@ -225,16 +226,16 @@ NEXT_PUBLIC_AWS_S3_BUCKET_NAME = '' # Will be used on the client-side Go ahead and create the bucket by navigating to the bottom of the page and clicking the **Create bucket** button. You can stick with the defaults settings for now, but you'll update them in the following steps. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-create-bucket.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-create-bucket.png) Once S3 has provisioned the Bucket, navigate to it by selecting it in the table. Navigate to the **Permissions** tab and click on the **Edit** button in the **Block public access (bucket settings)** section. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-bucket-permissions.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-bucket-permissions.png) Uncheck **Block _all_ public access** and click on **Save changes**. You need to allow public access because your application needs to access the images uploaded on AWS S3. -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-access-settings.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-access-settings.png) Next, update the resource policy to grant the application access to the Bucket and its contents. In the **Permissions** of your S3 Bucket, navigate to the **Bucket policy** section. Select **Edit** and add the following while changing "name-of-your-bucket" placeholder to the name of your Bucket: @@ -255,7 +256,7 @@ Next, update the resource policy to grant the application access to the Bucket a ] } ``` -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-bucket-policy.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-bucket-policy.png) Next, you need to allow your application, which will be on a different domain, to access the stored images. In the **Permissions** tab of your bucket, scroll to the **Cross-origin Resource Sharing (CORS)** section at the bottom and add the following to it: @@ -269,7 +270,7 @@ Next, you need to allow your application, which will be on a different domain, t } ] ``` -![AWS S3](/blog/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-cors.png) +![AWS S3](/fullstack-nextjs-graphql-prisma-4-1k1kc83x3v/imgs/aws-s3-cors.png) > Note: Before deploying your application, ensure you update the "AllowedOrigins" array with the URL pointing to your application. @@ -503,5 +504,5 @@ When the form is submitted, the URL of the image is included as a variable in th ## Summary and next steps -You learned how to add support for image upload using AWS S3. In the [next part](/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c), you will deploy your app to Vercel and learn how you can use the Prisma Data Proxy to manage your database connection pool to ensure your application doesn't run out of connections. +You learned how to add support for image upload using AWS S3. In the [next part](/fullstack-nextjs-graphql-prisma-5-m2fna60h7c), you will deploy your app to Vercel and learn how you can use the Prisma Data Proxy to manage your database connection pool to ensure your application doesn't run out of connections. diff --git a/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/index.mdx b/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/index.mdx index f8d2855d75..38d4054abf 100644 --- a/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/index.mdx +++ b/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/index.mdx @@ -7,13 +7,14 @@ authors: - "Mahmoud Abdelwahab" metaTitle: "Fullstack app with TypeScript, Next.js, Prisma & GraphQL - Deployment" metaDescription: "Learn how to build a fullstack app using TypeScript, PostgreSQL, Next.js, GraphQL and Prisma. In this article you are going to deploy your app to Vercel" -metaImagePath: "/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/meta-6b91985fb8bb4d0d06e95090aab1d8b0ede0696b-1269x714.png" -heroImagePath: "/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/hero-487ed996090048a8225eec985d2ea001c5e1486b-844x474.svg" +metaImagePath: "/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/meta-6b91985fb8bb4d0d06e95090aab1d8b0ede0696b-1269x714.png" +heroImagePath: "/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/hero-487ed996090048a8225eec985d2ea001c5e1486b-844x474.svg" heroImageAlt: "Fullstack App With TypeScript, PostgreSQL, Next.js, Prisma & GraphQL: Deployment" series: title: "Building a fullstack app using TypeScript, PostgreSQL, Next.js, GraphQL and Prisma" - slug: "fullstack-nextjs-and-graphql-md1tczpfz1" seriesIndex: 5 +tags: + - "education" excerpt: | This article is the final part of the course where you build a fullstack app with Next.js, GraphQL, TypeScript, Prisma, and PostgreSQL. In this article, you will learn how to deploy your app to Vercel. @@ -56,7 +57,7 @@ When a serverless function needs to access a database, it establishes a connecti When there's a traffic spike, each serverless function will spawn a new database connection. -![](/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/9OuYJ08.png) +![](/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/9OuYJ08.png) Traditional databases such as PostgreSQL and MySQL typically have a _database connection limit_ that can be easily exhausted when there's a traffic spike to your application. When the connection limit is exhausted, the requests to your application would start failing. @@ -72,20 +73,20 @@ Go to [https://cloud.prisma.io/projects/create](https://cloud.prisma.io/projects In the "Create project" page, paste in your database's connection string to connect your project to the database. If your database is behind a Static IP, enable the feature in the "Static IP" section. Once you're done, click **Create project**. -![Connecting your project to your application database](/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/create-project.png) +![Connecting your project to your application database](/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/create-project.png) Once your project is created, you should be redirected to the "Get started" page. You can connect your project to your GitHub repository in the "Enable schema synchronization" section, however, it's completely optional. -![Connect your project to your GitHub repository](/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/schema-sync.png) +![Connect your project to your GitHub repository](/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/schema-sync.png) To create a Data Proxy connection string, click the **Create a new connection string** button in the "Create a Data Proxy new connection string" section. Give your connection string a name and click **Create** once you're ready. -![Connect your project to your GitHub repository](/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/create-a-data-proxy-connection-string.png) -![Connect your project to your GitHub repository](/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/data-proxy-connection-string-modal.png) +![Connect your project to your GitHub repository](/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/create-a-data-proxy-connection-string.png) +![Connect your project to your GitHub repository](/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/data-proxy-connection-string-modal.png) Copy the Prisma Data Proxy URL as you won't be able to see it again, but you can create more later. -![Connect your project to your GitHub repository](/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/data-proxy-connection-string.png) +![Connect your project to your GitHub repository](/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/data-proxy-connection-string.png) ## Update the application @@ -119,11 +120,11 @@ The `vercel-build` script will generate Prisma Client that uses the Prisma Data Log in to your Vercel account and create a new project by clicking **New Project**. -![Creating a new project on Vercel](/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/vercel-new-project.png) +![Creating a new project on Vercel](/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/vercel-new-project.png) Next, import the "awesome-links" repository. -![Importing a Git repository](/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/vercel-import-project.png) +![Importing a Git repository](/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/vercel-import-project.png) Finally, add your environment variables. @@ -134,7 +135,7 @@ Refer to the `.env.example` file in the repository for the environment variables Once you've added the environment variables, click **Deploy**. -![Configuring environment variables](/blog/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/vercel-environment-variables.png) +![Configuring environment variables](/fullstack-nextjs-graphql-prisma-5-m2fna60h7c/imgs/vercel-environment-variables.png) Once your application is successfully deployed, copy its URL and: - Update the **Allowed Callback URLs** and **Allowed Logout URLs** on the Auth0 Dashboard with the URL of your application diff --git a/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw/index.mdx b/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw/index.mdx index 42c1ef2c75..3fac04b8bd 100644 --- a/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw/index.mdx +++ b/apps/blog/content/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw/index.mdx @@ -6,13 +6,14 @@ authors: - "Mahmoud Abdelwahab" metaTitle: "Fullstack app with TypeScript, Next.js, Prisma & GraphQL" metaDescription: "Build a fullstack app using TypeScript, PostgreSQL, Next.js, GraphQL and Prisma. In this article we're going to create the app's data model" -metaImagePath: "/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/meta-1ec6d4e3035143375360a59242258c3c93609907-1269x714.png" -heroImagePath: "/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/hero-cf0efe94442ee755fc47d4c085a10f2b453c74a6-844x475.svg" +metaImagePath: "/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/meta-1ec6d4e3035143375360a59242258c3c93609907-1269x714.png" +heroImagePath: "/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/hero-cf0efe94442ee755fc47d4c085a10f2b453c74a6-844x475.svg" heroImageAlt: "Fullstack App With TypeScript, PostgreSQL, Next.js, Prisma & GraphQL: Data Modeling" series: title: "Building a fullstack app using TypeScript, PostgreSQL, Next.js, GraphQL and Prisma" - slug: "fullstack-nextjs-and-graphql-md1tczpfz1" seriesIndex: 1 +tags: + - "education" excerpt: | This article is the first part of a course where we build a fullstack app with Next.js, GraphQL, TypeScript,Prisma and PostgreSQL. In this article, we'll create the data model and explore the different components of Prisma. @@ -122,7 +123,7 @@ npm run dev ``` Here's what the starter project looks like: -![Current state of the application](/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/awesome-links-starter-project.png) +![Current state of the application](/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/awesome-links-starter-project.png) ### A look at the project structure and dependencies @@ -214,7 +215,7 @@ DATABASE_URL="" ``` The database URL you just added has the following structure: -![Database URL breakdown](/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/database-url-breakdown.png) +![Database URL breakdown](/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/database-url-breakdown.png) | Name | Placeholder | Description | | :------- | :---------- | :-------------------------------------------------------------------------------------------------------------- | @@ -599,7 +600,7 @@ npx prisma studio ``` If you've done all the steps correctly you should you have the `Link` and `User` models inside your database. Inside the `Link` model you'll find 4 records and for the `User` model you'll find 1 record. -![Prisma Studio](/blog/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/awesome-links-prisma-studio.png) +![Prisma Studio](/fullstack-nextjs-graphql-prisma-oklidw1rhw/imgs/awesome-links-prisma-studio.png) ## Summary and next steps diff --git a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/index.mdx b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/index.mdx index de17bad4d3..7b3655b7c4 100644 --- a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/index.mdx +++ b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/index.mdx @@ -6,20 +6,17 @@ authors: - "Sabin Adams" metaTitle: "Build A Fullstack App with Remix, Prisma & MongoDB - Project Setup" metaDescription: "Learn how to build and deploy a fullstack application using Remix, Prisma, and MongoDB. In this article, we will be setting up our project, the MongoDB instance, Prisma, and begin modeling out some of our data for the next section of this series." -metaImagePath: "/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/meta-f24cae902752ee69692b9010216f2d207af37321-1920x1080.png" -heroImagePath: "/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/hero-23f25185781fa115971071b951ef70832386640b-844x474.svg" +metaImagePath: "/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/meta-f24cae902752ee69692b9010216f2d207af37321-1920x1080.png" +heroImagePath: "/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/hero-23f25185781fa115971071b951ef70832386640b-844x474.svg" heroImageAlt: "Build A Fullstack App with Remix, Prisma & MongoDB: Project Setup" series: title: "Build A Fullstack App with Remix, Prisma & MongoDB" - slug: "fullstack-remix-prisma-mongodb-MaTVLuwpaICD" seriesIndex: 1 excerpt: Welcome to the first article in this series, where you will take a look at how to build a full-stack application from the ground up using MongoDB, Prisma, and Remix! In this article, you will be setting up your project, the MongoDB instance, Prisma, and begin modeling out some of our data for the next section of this series. - +tags: + - "education" --- -import { Youtube } from "@/components/Youtube"; -import { Accordion, Accordions } from "@prisma-docs/eclipse"; - ## Table Of Contents - [Introduction](#introduction) @@ -48,7 +45,7 @@ The goal of this series is to take an in-depth look at how to start, develop and By the end of this series, you will have built and deployed an application called "Kudos", a site where users can create an account, log in, and give kudos to other users of the site. It will end up looking something like this: -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/kudos-home-complete.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/kudos-home-complete.png) ### Technologies we will use @@ -153,7 +150,7 @@ This is one of the magical pieces of Remix that makes development so easy! Of co If you run this project with the command `npm run dev` and head over to [http://localhost:3000/](http://localhost:3000/), you should see the basic starter application. -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/remix-starter.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/remix-starter.png) Great! Your basic project is started up and Remix has already scaffolded out many of the pieces you would normally have had to set up manually, such as the routing and build process. Now you will move on to setting up TailwindCSS so you can make the application look nice! @@ -270,7 +267,7 @@ export default function Index() { ``` You should see a screen that looks something like this: -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/tailwind-css-checkpoint.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/tailwind-css-checkpoint.png) > **Note**: If you do not see Tailwind's styles being applied to your page, you may need to restart your development server. @@ -290,11 +287,11 @@ Head over to the Atlas home page linked above. If you don't already have an acco If you will be using an existing account, head to the dashboard. From there you will see a dropdown in the top left corner of the screen. If you pop that open you will see the option New Project. - ![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/new-project.png) + ![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/new-project.png) Once you click on that, hit the **Build a Database** button. - ![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/build-a-database.png) + ![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/build-a-database.png) From there you should be able to follow along with the rest of the steps below. @@ -302,21 +299,21 @@ If you will be using an existing account, head to the dashboard. From there you You should land on a screen with a few options. Choose the **Free** option for the purposes of this series. Then hit the **Create** button: -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-free-tier.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-free-tier.png) When you select that option, you will be brought to a page that allows you to configure the cluster that will be generated. For your application, you can use the default settings. Just click **Create Cluster** near the bottom right of the page. -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-default-settings.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-default-settings.png) This will kick off the provisioning and deployment of your MongoDB cluster! All you need now is a database user and a way to connect to the database. Fortunately, MongoDB will walk you through this setup during their quickstart process. You will see a few prompts that help you make these configurations. Follow the prompts to create a new user. -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-user-setup.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-user-setup.png) Then, in the **Where would you like to connect from?** section, hit **Add My Current IP Address** to whitelist your development machine's IP address, allowing it to connect to the database. -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-ip-setup.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-ip-setup.png) With those steps completed, your database should finish its provisioning process within a few minutes *(at most)* and be ready for you to play with! @@ -366,15 +363,15 @@ You will now give Prisma the correct connection string in your [environment vari To find your connection string on the Atlas dashboard hit the **Connect** button. -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-connection-button.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-connection-button.png) This will pop open a modal. Hit the **Connect your application** option. -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-connection-modal.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-connection-modal.png) This should reveal a few bits of information. The piece you care about is the connection string. -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-connection-string.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/mongodb-connection-string.png) In your `.env` file, replace the default connection string with your MongoDB connection string. This connection string should follow this format: @@ -456,7 +453,7 @@ Applying the following changes: ``` Because MongoDB is _schemaless_, there is no real concept of _migrations_. A schemaless database's data can fluidly change and evolve as the application's scope grows and changes. This command simply creates the defined collections and indexes. -![](/blog/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/user-collection.png) +![](/fullstack-remix-prisma-mongodb-1-7d0bftxbmb6r/imgs/user-collection.png) ## Summary & What's next diff --git a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/index.mdx b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/index.mdx index b4ec52ea6b..24fde2c4da 100644 --- a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/index.mdx +++ b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/index.mdx @@ -6,15 +6,16 @@ authors: - "Sabin Adams" metaTitle: "Build A Fullstack App with Remix, Prisma & MongoDB - Authentication" metaDescription: "Learn how to build and deploy a fullstack application using Remix, Prisma, and MongoDB. In this article, we will be setting up authentication for our Remix application using session-based authentication." -metaImagePath: "/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/meta-4b70ee51aee99eaddac2a48baa614189c5fa74c2-1920x1080.png" -heroImagePath: "/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/hero-29016ded5a59403f81349c8247116f8f084a0ae2-844x474.svg" +metaImagePath: "/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/meta-4b70ee51aee99eaddac2a48baa614189c5fa74c2-1920x1080.png" +heroImagePath: "/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/hero-29016ded5a59403f81349c8247116f8f084a0ae2-844x474.svg" heroImageAlt: "Build A Fullstack App with Remix, Prisma & MongoDB: Authentication" series: title: "Build A Fullstack App with Remix, Prisma & MongoDB" - slug: "fullstack-remix-prisma-mongodb-MaTVLuwpaICD" seriesIndex: 2 excerpt: Welcome to the second article of this series where you are learning how to build a full-stack application from the ground up using MongoDB, Prisma, and Remix! In this part, you will set up session-based authentication for your Remix application. +tags: + - "education" --- ## Table Of Contents @@ -84,7 +85,7 @@ The default export of a route file is the component Remix renders into the brows Start the development server using `npm run dev` and navigate to [`http://localhost:3000/login`](http://localhost:3000/login), and you should see the route rendered. -![](/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/initial-login.png) +![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/initial-login.png) This works, but doesn't look very nice yet... Next you will spruce it up a bit by adding an actual sign in form. @@ -191,7 +192,7 @@ export default function Login() { ) } ``` -![](/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/login-form.png) +![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/login-form.png) At this point, you don't need to worry about where the `
`'s action is pointing, just that it has a `method` value of `"post"`. Later on you will check out some cool Remix magic that sets up the action for us! @@ -371,7 +372,7 @@ This new button has a `name` and a `value` attribute. The value is set to whatev Depending on the form you have selected, you should now see updated messages. Give this a try by clicking the "Sign Up" and "Sign In" buttons a few times. -![](/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/form-toggle-incomplete.gif) +![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/form-toggle-incomplete.gif) ### Add toggleable fields @@ -433,7 +434,7 @@ Two changes were made here: Your sign in and sign up forms are now visually complete! It's time to move on to the next piece: making the form functional. -![](/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/form-toggle.gif) +![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/form-toggle.gif) ## The authentication flow @@ -450,7 +451,7 @@ Authentication will be session-based, following the same patterns used in the [a To better visualize what the flow of your app's authentication will look like, take a look at the graphic below. -![](/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/auth-flow.png) +![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/auth-flow.png) There will be a series of steps to take in order to authenticate a user, with two potential pathways (_sign in_ and _sign up_): @@ -631,7 +632,7 @@ This `createUser` function does a couple of things: > **Note**: You were able to fill in the details of the `profile` embedded document directly in this query by passing in a JSON object, and you will see some nice autocompletion because of the typings Prisma generates. -![](/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/embedded-doc-helpers.png) +![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/embedded-doc-helpers.png) This function will be used in your `register` function to handle the actual creation of a user. Over in `app/utils/auth.server.ts` import the new `createUser` function and invoke it within the `register` function. @@ -952,7 +953,7 @@ In order to actually trigger this action, the forms need to post to this route. If you try to log in or create an account, you should see you are sent to the main screen afterwards. Success! 🎉 -![](/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/signin-success.gif) +![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/signin-success.gif) ### Authorize users on private routes @@ -1222,7 +1223,7 @@ diff // app/routes/login.tsx ``` Now you should see error messages and form resets working properly on your sign up and sign in forms! -![](/blog/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/error-message.png) +![](/fullstack-remix-prisma-mongodb-2-ztmoy58p4re8/imgs/error-message.png) ## Summary & What's next diff --git a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/index.mdx b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/index.mdx index 07ea66d871..49fcfcc7ee 100644 --- a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/index.mdx +++ b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/index.mdx @@ -6,13 +6,14 @@ authors: - "Sabin Adams" metaTitle: "Build A Fullstack App with Remix, Prisma & MongoDB: CRUD, Filtering & Sorting" metaDescription: "Learn how to build and deploy a fullstack application using Remix, Prisma, and MongoDB. In this article, we will be building the functionality that allows users to send kudos to each other along with some searching and sorting options." -metaImagePath: "/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/meta-ec93dfa6d5929320447e9fa9610b276088e86dd8-1920x1080.png" -heroImagePath: "/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/hero-45f6a2c1b0de348ea063b18dba5fb66f7dbb7594-844x474.svg" +metaImagePath: "/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/meta-ec93dfa6d5929320447e9fa9610b276088e86dd8-1920x1080.png" +heroImagePath: "/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/hero-45f6a2c1b0de348ea063b18dba5fb66f7dbb7594-844x474.svg" heroImageAlt: "Build A Fullstack App with Remix, Prisma & MongoDB: CRUD, Filtering & Sorting" series: title: "Build A Fullstack App with Remix, Prisma & MongoDB" - slug: "fullstack-remix-prisma-mongodb-MaTVLuwpaICD" seriesIndex: 3 +tags: + - "education" excerpt: | Welcome to the third article of this series where you are learning how to build a full-stack application from the ground up using MongoDB, Prisma, and Remix! In this part, you will build out the main piece of the application which displays @@ -118,7 +119,7 @@ The `loader` above will first check if a user is logged in when they hit the `/` If there is a valid session, the `loader` returns a `redirect` to the `/home` page. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/home-initial.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/home-initial.png) ## Add the user list panel @@ -177,7 +178,7 @@ export default function Home() { ``` The code above imports the new component and the `Layout` component, then renders the new component within the layout. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/user-panel.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/user-panel.png) ### Query for all users and sort the results @@ -235,7 +236,7 @@ export const loader: LoaderFunction = async ({ request }) => { If you had any users in your database and outputted the `users` variable inside of the loader, you should see a list of all users _except yourself_. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/users-logged.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/users-logged.png) > **Note**: The entire `profile` embedded document was retrieved as a nested object without having to explicitly include it. @@ -332,7 +333,7 @@ export function UserPanel({ users }: { users: User[] }) { ``` Beautiful! Your users will now be rendered in a nice column on the left side of the home page. The only non-functional piece of the side panel at this point is the sign out button. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/user-list.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/user-list.png) ## Add the ability to log out @@ -469,11 +470,11 @@ To create the nested route, first add a new folder in `app/routes` named `home`. Within the new `app/routes/home` directory, create a new file named `kudo.$userId.tsx`. This will allow you to handle the modal component as if it were its own route. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/sub-routes.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/sub-routes.png) The `$userId` portion of this file name is a [route param](https://remix.run/docs/en/v1/guides/data-loading#route-params), which acts as a dynamic value you can provide your application via the URL. Remix will then translate that file name to the route: `/home/kudos/$userId` where `$userId` can be any value. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/dynamic-filename.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/dynamic-filename.png) In that new file export a `loader` function and a React component that renders some text to make sure the dynamic value is working: @@ -526,7 +527,7 @@ export default function Home() { ``` If you head over to [http://localhost:3000/home/kudo/123](http://localhost:3000/home/kudo/123), you should now see the text "User: 123" displayed at the very top of the page. If you change the value in the URL to something other than `123` you should see that change reflected on the screen. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/nested-route.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/nested-route.png) ### Fetch a user by their id @@ -598,7 +599,7 @@ export function UserPanel({ users }: props) { ``` Now when your users click on another user in that panel, they will be navigated to a sub-route with that user's information. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/nested-route-names.gif) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/nested-route-names.gif) If that all looks good, the next step is building the modal component that will display your form. @@ -606,7 +607,7 @@ If that all looks good, the next step is building the modal component that will To build this modal you will first need to build a helper component that creates a [portal](https://reactjs.org/docs/portals.html), which allows you to render a child component somewhere outside of the parent's document object model (DOM) branch while still allowing the parent component to manage it as if it were a direct child. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/portal-diagram.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/portal-diagram.png) > **Note**: This portal will be important because it will allow you to render the modal in a location that does not have any inherited styles or positioning from a parent that could affect the positioning of the modal. @@ -688,7 +689,7 @@ export default function KudoModal() { ``` If you navigate to your nested route, you will see a `div` with an `id` of `"kudo-modal"` is now rendered as a direct child of the `body` rather than where the nested route is being rendered in the DOM tree. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/portal.gif) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/portal.gif) ### Build the modal component @@ -769,7 +770,7 @@ export default function KudoModal() { ``` The modal should now open up when a user from the side panel is clicked. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/working-modal.gif) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/working-modal.gif) Your form will need the logged in user's information when it displays a preview of the message, so before building the form add that data to the response from the `loader` function: @@ -1045,7 +1046,7 @@ export default function KudoModal() { ``` The select boxes will now appear with all of the possible options. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/select-boxes.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/select-boxes.png) ## Add a kudo display component @@ -1117,7 +1118,7 @@ export default function KudoModal() { ``` The preview will now be rendered, displaying the currently logged in user's information and the styled message they are going to send. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/kudo-preview.gif) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/kudo-preview.gif) ### Build the action to send kudos @@ -1330,7 +1331,7 @@ The `Kudo` and `Profile` types generated by Prisma are combined to create a `Kud If you send a couple of kudos to an account and log in to that account, you should now see a rendered list of kudos on your feed. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/kudo-feed.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/kudo-feed.png) You may notice when `getFilteredKudos` invocation is providing empty objects for the sort and filter options. This is because there is not yet a way in the UI to filter or sort the feed. Next, you will create the search bar at the top of the feed to handle this. @@ -1421,7 +1422,7 @@ export default function Home() { ) } ``` -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/search-bar.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/search-bar.png) These changes will handle filtering the feed, however you also want to sort the feed by various columns. @@ -1478,7 +1479,7 @@ export function SearchBar() { ``` Now you should see a dropdown available in the search bar with your options. -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/search-bar-sort.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/search-bar-sort.png) ### Build the search bar action @@ -1551,7 +1552,7 @@ The code above: Now if you submit form you should see your results reflected on the feed! -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/sorting-functional.gif) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/sorting-functional.gif) ## Display the most recent kudos @@ -1665,7 +1666,7 @@ export default function Home() { ``` With that, your home page is complete and you should see a list of the three most recent kudos sent in your application! -![](/blog/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/recent-kudos.png) +![](/fullstack-remix-prisma-mongodb-3-by5pmn5nzo1v/imgs/recent-kudos.png) ## Summary & What's next diff --git a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/index.mdx b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/index.mdx index 22bc18af8f..595d84d63b 100644 --- a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/index.mdx +++ b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/index.mdx @@ -6,13 +6,14 @@ authors: - "Sabin Adams" metaTitle: "Build A Fullstack App with Remix, Prisma & MongoDB - Referential Integrity & Image Uploads" metaDescription: "Learn how to build and deploy a fullstack application using Remix, Prisma, and MongoDB. In this article, we will be building the profile settings section of the website and enhancing the data model to provide better referential integrity.'" -metaImagePath: "/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/meta-fa4a72549e81768cec73ac357b0dacc1a4985cb6-1920x1080.png" -heroImagePath: "/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/hero-a48a8ff2b7f60d0db82366f887ef868ba1ffe6ff-844x474.svg" +metaImagePath: "/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/meta-fa4a72549e81768cec73ac357b0dacc1a4985cb6-1920x1080.png" +heroImagePath: "/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/hero-a48a8ff2b7f60d0db82366f887ef868ba1ffe6ff-844x474.svg" heroImageAlt: "Build A Fullstack App with Remix, Prisma & MongoDB: Referential Integrity & Image Uploads" series: title: "Build A Fullstack App with Remix, Prisma & MongoDB" - slug: "fullstack-remix-prisma-mongodb-MaTVLuwpaICD" seriesIndex: 4 +tags: + - "education" excerpt: | Welcome to the fourth article of this series where you are learning how to build a full-stack application from the ground up using MongoDB, Prisma, and Remix! In this part, you will build the profile settings section of your application, including an image upload component, and configure your schema to provide referential integrity in your data. @@ -136,7 +137,7 @@ export default function Home() { ``` Your `SearchBar` will now have access to the `profile` data it needs. If you had previously recieved an error because of the absence of this data, a refresh of the page in your browser should reveal the profile button rendering successfully in the top right corner of the page. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/usercircle-header.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/usercircle-header.png) ### Create the modal @@ -190,7 +191,7 @@ To open this new modal, in `app/components/search-bar.tsx` add an `onClick` hand ``` If you now click on the profile settings button, you should see the new modal displayed on the screen. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/empty-profile-form.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/empty-profile-form.png) ### Build the form @@ -309,7 +310,7 @@ export default function ProfileSettings() { ``` At this point, your form should render the correct inputs and their options. It will default their values to the current values associated with the logged in user's profile. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/profile-form-fields.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/profile-form-fields.png) ### Allow users to submit the form @@ -435,26 +436,26 @@ Once you have an account, you will need an [Identity Access Management](https:// Head over to to the AWS console home page. On the top right corner of the page, click on the dropdown labeled with your user name and select Security Credentials. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/security-credentials.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/security-credentials.png) Once inside that section, hit the **Users** option in the left-hand menu under _Access Management_. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-user.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-user.png) On this page, click the **Add users** button on the top right of the page. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-add-user.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-add-user.png) This will bring you through a short wizard that allows you to configure your user. Follow through the steps below: -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-details.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-details.png) This first section asks for: 1. _Username_: Provide any user name. 2. _Select AWS access type_: Select the **Access key - Programmatic access** option, which enables the generation of an _access key ID_ and _secret key_. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-permissions.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-permissions.png) On the second step of the wizard, make the following selections: @@ -463,11 +464,11 @@ On the second step of the wizard, make the following selections: 3. Hit the checkmark next to an option labeled **AmazonS3FullAccess**. 4. Hit next at the bottom of the form. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-tags.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-tags.png) If you would like to add tags to your user help make it easier to manage and organize the users in your account, add those here on the third step of the wizard. Hit **Next** when you are finished on this page. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-overview.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-overview.png) If the summary on this page looks good, hit the **Create user** button at the bottom of the page. @@ -479,7 +480,7 @@ Now that you have a user and access keys, head over to the [AWS S3](https://s3.c On the top right of this page, hit the **Create bucket** button. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-s3.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-s3.png) You will be asked for a name and region for your bucket. Fill those details out and save the values you choose with the _access key ID_ and _secret key_ you previously saved. You will need these later as well. @@ -487,11 +488,11 @@ After filling those out, hit **Create bucket** at the very bottom of the form. When the bucket is done being created, you will be sent to the bucket's dashboard page on the _Objects_ tab. Navigate to the **Permissions** tab. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-bucket-permissions.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-bucket-permissions.png) In this tab, hit the **Edit** button under the **Block public access** section. In this form, uncheck the **Block _all_ public access** box and hit **Save changes**. This sets your bucket as _public_, which will allow your application to access the images. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-bucket-access.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-bucket-access.png) Below that section you will see a **Bucket policy** section. Paste in the following policy, and be sure to replace `` with your bucket's name. This policy will allow your images to be publicly read: @@ -512,7 +513,7 @@ Below that section you will see a **Bucket policy** section. Paste in the follow ] } ``` -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-bucket-policy.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/aws-bucket-policy.png) You now have your AWS user and S3 bucket set up. Next you need to save the keys and bucket configurations into your `.env` file so they can be used later on. @@ -812,13 +813,13 @@ Now if you go to that form and attempt to upload a file the data should save cor - ![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/image-upload.gif) + ![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/image-upload.gif) - ![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/upload-result-page.png) + ![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/upload-result-page.png) - ![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/upload-result-database.png) + ![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/upload-result-database.png) - ![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/upload-result-s3.png) + ![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/upload-result-s3.png) @@ -860,7 +861,7 @@ export function UserCircle({ profile, onClick, className }: props) { ``` If you now give a couple of your users a profile picture, you should see those displayed throughout the site! -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/user-images.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/user-images.png) ## Add a delete account function @@ -985,7 +986,7 @@ export const action: ActionFunction = async ({ request }) => { ``` Your users can now delete their account! -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/delete-user.gif) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/delete-user.gif) ### Update the data model to add referential integrity @@ -1011,7 +1012,7 @@ Run `npx prisma db push` to propagate those changes and generate Prisma Client. Now if you delete an account, any `Kudos` authored by that account will be deleted along with it! -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/referrential-delete.gif) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/referrential-delete.gif) ## Add form validation @@ -1115,7 +1116,7 @@ The following changes were made in the snippet above: After making the changes above, you will see any form and validation errors are displayed on the form. -![](/blog/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/form-error.png) +![](/fullstack-remix-prisma-mongodb-4-l3mwep4zlim2/imgs/form-error.png) ## Summary & What's next diff --git a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/index.mdx b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/index.mdx index 1aef5266e3..68c8cc1be4 100644 --- a/apps/blog/content/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/index.mdx +++ b/apps/blog/content/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/index.mdx @@ -6,13 +6,14 @@ authors: - "Sabin Adams" metaTitle: "Build A Fullstack App with Remix, Prisma & MongoDB - Deployment" metaDescription: "Learn how to build and deploy a fullstack application using Remix, Prisma, and MongoDB. In this article, we will be deploying the application we have built throughout this series." -metaImagePath: "/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/meta-0c44161122fc6096b266ce2463146d441aef52f4-1920x1080.png" -heroImagePath: "/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/hero-a00a8da49b238e170ebeea1caa4d9a67fec1db3d-844x474.svg" +metaImagePath: "/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/meta-0c44161122fc6096b266ce2463146d441aef52f4-1920x1080.png" +heroImagePath: "/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/hero-a00a8da49b238e170ebeea1caa4d9a67fec1db3d-844x474.svg" heroImageAlt: "Build A Fullstack App with Remix, Prisma & MongoDB: Deployment" series: title: "Build A Fullstack App with Remix, Prisma & MongoDB" - slug: "fullstack-remix-prisma-mongodb-MaTVLuwpaICD" seriesIndex: 5 +tags: + - "education" excerpt: | Welcome to the last article of this series where you are learning how to build a full-stack application from the ground up using MongoDB, Prisma, and Remix! In this part, you will deploy the application you've been building using Vercel. @@ -58,15 +59,15 @@ The first step in this process is making sure your project is hosted on GitHub. If you do need to set up your codebase in a repository, you will first need to sign in to [GitHub](https://github.com/). Once on GitHub's home page, click the green **New** button at the top left of the screen to create a new repository. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/new-repo.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/new-repo.png) That will take you a page where you are asked for some details and options to configure about the repository. Fill those out however you would like and hit the **Create repository** button at the bottom. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/create-repo.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/create-repo.png) After creating the repository, you will land in the repository page with a _Quick setup_ section at the top of the view. This section will have a connection string which you will use to push your codebase to the repository. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/repo-url.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/repo-url.png) In a terminal, navigate to the kudos project in your file system and run the following commands, providing the URL for your repository: @@ -80,7 +81,7 @@ git push -u origin main ``` Once that finishes, head over to the repository page on GitHub. You should see your codebase has been pushed up and made available on GitHub. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/repo-pushed.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/repo-pushed.png) ## Set up your project in Vercel @@ -88,13 +89,13 @@ Next, log in to your account on [Vercel](https://vercel.com/login?). If you don' Once you have signed in, on your dashboard you will see a **New Project** button. Hit that button to start configuring your project. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-new.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-new.png) On this page you will be asked to import a GitHub repository or choose a pre-made template. If you haven't already linked your GitHub account to your Vercel account you will do so here as will. Select your project's repository from the list of repos under _Import Git Repository_. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-repos.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-repos.png) After you click **Import** on your repository you will be brought to a page where you can configure the project and deploy it. @@ -106,7 +107,7 @@ Inside of the **Environment Variables** block you have the ability to add your e These will correlate to the variables you've set up in your project's `.env` file. Add all of your environment variables here. As an example, in the image below the information is filled out the for the `DATABASE_URL` variable. Hit **Add** after filling out the form for each variable. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-env.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-env.png) ## Deploy @@ -114,11 +115,11 @@ Once all of your environment variables are configured, go ahead and click the ** Clicking this button will kick off the application's build process, run any checks that need to be made, and deploy the application with a URL provisioned by Vercel. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-deploying.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-deploying.png) When the deployment is finished, if you head back over to the dashboard you should see your kudos project available and accessible at the provisioned domain. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-deployed-dash.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/vercel-deployed-dash.png) If you click the **Visit** button on this page, you should be navigated to the live version of your site! Congrats! @@ -126,7 +127,7 @@ If you click the **Visit** button on this page, you should be navigated to the l You aren't quite done yet, however. You may notice if you attempt to sign in or sign up on your live site, you receive a nasty error. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/kudos-error.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/kudos-error.png) This is due to the fact that your MongoDB database is still configured to only be accessible from _your development machine's IP address_. @@ -136,11 +137,11 @@ That will need to be opened up to allow _any_ IP address connections since Verce Open up the MongoDB dashboard and navigate to the **Network Access** tab on the left-hand menu. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/mongodb-network.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/mongodb-network.png) Here you will find a green button labeled **ADD IP ADDRESS**. Click that and you will be shown the modal below. -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/ip-modal.png) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/ip-modal.png) In this modal, hit the **ALLOW ACCESS FROM ANYWHERE** button and then hit the green **Confirm** button at the bottom. @@ -148,13 +149,13 @@ This will open up your database to connections from any IP address, allowing you Now if you head back to your deployed application and attempt a sign in or sign up, you should now be able to complete the action successfully! -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/success.gif) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/success.gif) ## Summary & Final remarks Congratulations! 🎉 -![](/blog/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/congrats.gif) +![](/fullstack-remix-prisma-mongodb-5-gohqsnfupxsx/imgs/congrats.gif) Throughout this series you: diff --git a/apps/blog/content/blog/getting-started-with-relay-modern-46f8de6bd6ec/index.mdx b/apps/blog/content/blog/getting-started-with-relay-modern-46f8de6bd6ec/index.mdx index 79ce8a7dda..d98671ecf9 100644 --- a/apps/blog/content/blog/getting-started-with-relay-modern-46f8de6bd6ec/index.mdx +++ b/apps/blog/content/blog/getting-started-with-relay-modern-46f8de6bd6ec/index.mdx @@ -5,8 +5,8 @@ date: "2017-06-18" authors: - "Nikolas Burk" metaTitle: "Getting Started with Relay Modern | Prisma" -metaImagePath: "/blog/getting-started-with-relay-modern-46f8de6bd6ec/imgs/hero-703a89ee445ad7c79ca9de6acc53c27a8e49204f-900x482.png" -heroImagePath: "/blog/getting-started-with-relay-modern-46f8de6bd6ec/imgs/hero-703a89ee445ad7c79ca9de6acc53c27a8e49204f-900x482.png" +metaImagePath: "/getting-started-with-relay-modern-46f8de6bd6ec/imgs/hero-703a89ee445ad7c79ca9de6acc53c27a8e49204f-900x482.png" +heroImagePath: "/getting-started-with-relay-modern-46f8de6bd6ec/imgs/hero-703a89ee445ad7c79ca9de6acc53c27a8e49204f-900x482.png" heroImageAlt: "Getting Started with Relay Modern" excerpt: | This post is a step-by-step tutorial with the goal of building a simple Instagram application from scratch using @@ -74,7 +74,7 @@ type Post { ``` This is what it should look like in your terminal: -![](/blog/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*t5Y1tsH07bEQHbrB.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*t5Y1tsH07bEQHbrB.png) Note that you can now manage this project in the Graphcool Console. If you want to manage it locally, you can use the project file `project.graphcool` to make local changes to the schema and then apply them by calling `graphcool push`. @@ -219,7 +219,7 @@ Awesome, you’re now ready to use Relay in your app 🚀 > **Note**: If you lose the endpoint for your GraphQL API, you can always find it in the Graphcool Console (by clicking in _ENDPOINTS_-button on the bottom-left) or use the graphcool endpoints command in the same directory where the project file project.graphcool is located: -![](/blog/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*KQLRnImerQRjALS5.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*KQLRnImerQRjALS5.png) ## 3. Displaying all Posts @@ -332,7 +332,7 @@ yarn start ``` This will open up a browser and load the app from `http://localhost:3000` where you'll now see two lovely pigs: -![](/blog/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*QelKIjXtM12d3kAe.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*QelKIjXtM12d3kAe.png) ### Load Data from Server @@ -615,7 +615,7 @@ Notice that you’ll have to switch the Playground mode from **Simple** to **Rel Then click the _Play_-button and select each of these mutations exactly once: -![](/blog/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*iPceJCV7B-ri4upn.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*iPceJCV7B-ri4upn.png) > **Note**: You can also use the Data Browser to add some post items. @@ -625,7 +625,7 @@ Go ahead and run `yarn start` to see what the app currently looks like - you sho By the way, if you’re curios to see what the actual query looked like that the `QueryRenderer` composed for you and that was sent over to the server, you can inspect the _Networking_-tab of your browser's dev tools: -![](/blog/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*A92lc0WjBQD120DC.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*A92lc0WjBQD120DC.png) ## 4. Adding and Deleting Posts @@ -733,7 +733,7 @@ import { Link } from 'react-router' ``` Pressing the `Link` element in the app will now trigger the `CreatePage` to appear on the screen. You can run the app again and you should see everything as before, plus the **+ New Post**-button on the top right. Press it to convince yourself that it actually displays the `CreatePage` component: -![](/blog/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*h_JXfmCfcMYpbO__.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*h_JXfmCfcMYpbO__.png) ### Creating new Posts @@ -847,7 +847,7 @@ So, in `optimisticUpdater`, you're simply creating the `newPost` yourself based For the `updater` you can make use of the actual server response to update the cache. With `getRootField` and `getLinkedRecord` you get access to the payload of the mutation that you specified on top of the file: -![](/blog/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*lWBTpLYdMBLe7BvS.png) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*lWBTpLYdMBLe7BvS.png) Next you need to actually use this mutation in `CreatePage.js`. The only problem left right now is that in `CreatePage`, you don't have access to the `viewerId` at the moment - but it's a required argument for the mutation. At this point, you _could_ use `react-router` and simply pass the `viewerId` from the `ListPage` on to the `CreatePage` component. However, we want to make proper use of Relay and each component should be responsible for its own data dependencies. @@ -937,7 +937,7 @@ relay-compiler --src ./src --schema ./schema.graphql ``` That’s it, you can now go ahead and add a new post through the UI of your app! How about these musical fellahs right here? -![](/blog/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*p_mSrJU2L90IXDSi.jpg) +![](/getting-started-with-relay-modern-46f8de6bd6ec/imgs/0*p_mSrJU2L90IXDSi.jpg) ### Deleting Posts diff --git a/apps/blog/content/blog/graphql-directive-permissions-authorization-made-easy-54c076b5368e/index.mdx b/apps/blog/content/blog/graphql-directive-permissions-authorization-made-easy-54c076b5368e/index.mdx index 5b8e28f2ab..9bf59ff912 100644 --- a/apps/blog/content/blog/graphql-directive-permissions-authorization-made-easy-54c076b5368e/index.mdx +++ b/apps/blog/content/blog/graphql-directive-permissions-authorization-made-easy-54c076b5368e/index.mdx @@ -5,8 +5,8 @@ date: "2018-03-01" authors: - "Dennis Walsh" metaTitle: "GraphQL Directive Permissions — Authorization Made Easy | Prisma" -metaImagePath: "/blog/graphql-directive-permissions-authorization-made-easy-54c076b5368e/imgs/hero-210b2d6ae4e602480f1fee9860018b83891660ee-900x482.png" -heroImagePath: "/blog/graphql-directive-permissions-authorization-made-easy-54c076b5368e/imgs/hero-210b2d6ae4e602480f1fee9860018b83891660ee-900x482.png" +metaImagePath: "/graphql-directive-permissions-authorization-made-easy-54c076b5368e/imgs/hero-210b2d6ae4e602480f1fee9860018b83891660ee-900x482.png" +heroImagePath: "/graphql-directive-permissions-authorization-made-easy-54c076b5368e/imgs/hero-210b2d6ae4e602480f1fee9860018b83891660ee-900x482.png" heroImageAlt: "GraphQL Directive Permissions — Authorization Made Easy" excerpt: | Directive permissions are a declarative way of implementing authorization rules in GraphQL servers. In this article, diff --git a/apps/blog/content/blog/graphql-eu-18-eiw8bishe2di/index.mdx b/apps/blog/content/blog/graphql-eu-18-eiw8bishe2di/index.mdx index 5adfcde788..0c6ab24dfb 100644 --- a/apps/blog/content/blog/graphql-eu-18-eiw8bishe2di/index.mdx +++ b/apps/blog/content/blog/graphql-eu-18-eiw8bishe2di/index.mdx @@ -5,8 +5,8 @@ date: "2018-06-04" authors: - "Nikolas Burk" metaTitle: "GraphQL Europe 2018: the community comes together in Berlin" -metaImagePath: "/blog/graphql-eu-18-eiw8bishe2di/imgs/hero-aa07614217b24348635532e5f06f7be6230c9077-1200x630.png" -heroImagePath: "/blog/graphql-eu-18-eiw8bishe2di/imgs/hero-aa07614217b24348635532e5f06f7be6230c9077-1200x630.png" +metaImagePath: "/graphql-eu-18-eiw8bishe2di/imgs/hero-aa07614217b24348635532e5f06f7be6230c9077-1200x630.png" +heroImagePath: "/graphql-eu-18-eiw8bishe2di/imgs/hero-aa07614217b24348635532e5f06f7be6230c9077-1200x630.png" heroImageAlt: "GraphQL Europe 2018: The GraphQL community comes together in Berlin" excerpt: | GraphQL Europe is happening in less than two weeks! This article reviews the highlights from our past GraphQL @@ -31,7 +31,7 @@ In the past 12 months, we have organized two major GraphQL conferences: GraphQL At last year's GraphQL Europe conference, 300 GraphQL enthusiasts came together to discuss the latest topics of the GraphQL ecosystem and share their own experiences with other attendees. We were especially excited to welcome many community members that flew over to Europe from the US and from Australia. -![](/blog/graphql-eu-18-eiw8bishe2di/imgs/1*f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg) +![](/graphql-eu-18-eiw8bishe2di/imgs/1*f3CIuLP_Lr3Q0UYNsP5lvQ.jpeg) Next to fruitful discussions with other developers, the conference offered a broad range of talks from various GraphQL experts. @@ -67,7 +67,7 @@ The range of topics to be presented at the conference will be extremely diverse. Here's a quick selection of a few talks to be presented at the conference, you can find the entire schedule on the [website](https://www.graphql-europe.org#schedule). -![](/blog/graphql-eu-18-eiw8bishe2di/imgs/1*-iELVZWzvAgEaKZlkNU6ZA.png) +![](/graphql-eu-18-eiw8bishe2di/imgs/1*-iELVZWzvAgEaKZlkNU6ZA.png) ### Transpiling GraphQL instead of writing customized server code @@ -75,7 +75,7 @@ by **[Mike Solomon](https://twitter.com/msol)** (Software Engineer @ Twitter) GraphQL specifies what data and response shape we need and not how to get and reshape that data. At Twitter, we automatically translate GraphQL queries into code that efficiently specifies the how as well! See how we keep our API uniform and extend it without writing or deploying new code. -![Supercharge Your GraphQL Development](/blog/graphql-eu-18-eiw8bishe2di/imgs/Dc2NATAXcAE-sxs.webp) +![Supercharge Your GraphQL Development](/graphql-eu-18-eiw8bishe2di/imgs/Dc2NATAXcAE-sxs.webp) ### Supercharge your GraphQL Development @@ -83,7 +83,7 @@ by **[Jon Wong](https://twitter.com/jnwng)** (Frontend Infrastructure Engineer @ Supercharge your GraphQL development with the linting, formatting, and static analysis tools you need to write cleaner and more reliable GraphQL. -![](/blog/graphql-eu-18-eiw8bishe2di/imgs/1*AN2VR8MNLpLeNzUOEGbCJA.png) +![](/graphql-eu-18-eiw8bishe2di/imgs/1*AN2VR8MNLpLeNzUOEGbCJA.png) ### Fundamental Properties of the GraphQL Language @@ -91,7 +91,7 @@ by **[Olaf Hartig](https://twitter.com/olafhartig)** (Assistant Professor for CS This talk presents a formal study of the GraphQL language. After a gentle introduction to the typical problems considered in such studies, I highlight our findings regarding these problems for the case of GraphQL. As a bonus, I present a solution to avoid producing overly large query results. -![](/blog/graphql-eu-18-eiw8bishe2di/imgs/1*_QMKg1HIi96OtzMMOtoajQ@2x.png) +![](/graphql-eu-18-eiw8bishe2di/imgs/1*_QMKg1HIi96OtzMMOtoajQ@2x.png) ### 2 Fast 2 Furious: migrating Medium’s codebase without slowing down @@ -99,7 +99,7 @@ by **[Sasha Solomon](https://twitter.com/sachee)** (Tech Lead @ Medium) After 5 years, we’re building the next generation infrastructure at Medium with GraphQL and we’re doing it without slowing product development and we’re incrementally gaining benefits from the new system. See how we take advantage of GraphQL to enable widespread yet gradual architectural change! -![](/blog/graphql-eu-18-eiw8bishe2di/imgs/1*kKq-QXjiDhsDi82ZK8OX8w.png) +![](/graphql-eu-18-eiw8bishe2di/imgs/1*kKq-QXjiDhsDi82ZK8OX8w.png) ### Teaching GraphQL @@ -107,7 +107,7 @@ by **[Daniel Woelfel](https://twitter.com/danielwoelfel)** (Software Engineer @ GraphQL is designed to be easy to use, but newcomers to GraphQL are often tripped up by common problems and misconceptions. I’ll cover how to teach GraphQL in a way that gets newbies excited ands helps them overcome the mental hurdles that prevent them from being productive with GraphQL. -![Supercharged SDL](/blog/graphql-eu-18-eiw8bishe2di/imgs/Dd5F0cmU8AI0DKJ.webp) +![Supercharged SDL](/graphql-eu-18-eiw8bishe2di/imgs/Dd5F0cmU8AI0DKJ.webp) ### Supercharged SDL diff --git a/apps/blog/content/blog/graphql-middleware-zie3iphithxy/index.mdx b/apps/blog/content/blog/graphql-middleware-zie3iphithxy/index.mdx index 2e1ac22c53..4a75862609 100644 --- a/apps/blog/content/blog/graphql-middleware-zie3iphithxy/index.mdx +++ b/apps/blog/content/blog/graphql-middleware-zie3iphithxy/index.mdx @@ -5,8 +5,8 @@ date: "2018-08-07" authors: - "Nikolas Burk" metaTitle: "GraphQL Middleware is Open Source - Library to Simplify Your Resolvers" -metaImagePath: "/blog/graphql-middleware-zie3iphithxy/imgs/hero-00450644ec19cc8a354555367848ee135f88561c-1200x630.png" -heroImagePath: "/blog/graphql-middleware-zie3iphithxy/imgs/hero-00450644ec19cc8a354555367848ee135f88561c-1200x630.png" +metaImagePath: "/graphql-middleware-zie3iphithxy/imgs/hero-00450644ec19cc8a354555367848ee135f88561c-1200x630.png" +heroImagePath: "/graphql-middleware-zie3iphithxy/imgs/hero-00450644ec19cc8a354555367848ee135f88561c-1200x630.png" heroImageAlt: "Open Sourcing GraphQL Middleware - Library to Simplify Your Resolvers" excerpt: | [GraphQL Middleware](https://github.com/prismagraphql/graphql-middleware) lets you run arbitrary code before or after @@ -133,7 +133,7 @@ Here is what will be printed to the console: ``` Execution of the middleware and resolver functions follow the "onion"-principle, meaning each middleware function adds a layer _before_ and _after_ the actual resolver invocation. -![Example of the onion principle](/blog/graphql-middleware-zie3iphithxy/imgs/ygKiXlA.png) +![Example of the onion principle](/graphql-middleware-zie3iphithxy/imgs/ygKiXlA.png) The order of the middleware functions in the `middlewares` array is important. The first resolver is the "most-outer" layer, so it gets executed first and last. The second resolver is the "second-outer" layer, so it gets executed second and second to last... And so forth. @@ -179,7 +179,7 @@ Processing the same `hello` query from above, this would produce the following c ``` Here is an illustration of the execution flow: -![Middleware execution flow](/blog/graphql-middleware-zie3iphithxy/imgs/mbm2Syg.png) +![Middleware execution flow](/graphql-middleware-zie3iphithxy/imgs/mbm2Syg.png) #### Input arguments of middleware functions diff --git a/apps/blog/content/blog/graphql-schema-stitching-explained-schema-delegation-4c6caf468405/index.mdx b/apps/blog/content/blog/graphql-schema-stitching-explained-schema-delegation-4c6caf468405/index.mdx index 7ef9e9a70e..5d378e4510 100644 --- a/apps/blog/content/blog/graphql-schema-stitching-explained-schema-delegation-4c6caf468405/index.mdx +++ b/apps/blog/content/blog/graphql-schema-stitching-explained-schema-delegation-4c6caf468405/index.mdx @@ -5,8 +5,8 @@ date: "2017-12-12" authors: - "Nikolas Burk" metaTitle: "GraphQL Schema Stitching explained: Schema Delegation | Prisma" -metaImagePath: "/blog/graphql-schema-stitching-explained-schema-delegation-4c6caf468405/imgs/hero-b01f755cd26e943970fb26c0395027a491baa9a0-720x480.jpg" -heroImagePath: "/blog/graphql-schema-stitching-explained-schema-delegation-4c6caf468405/imgs/hero-b01f755cd26e943970fb26c0395027a491baa9a0-720x480.jpg" +metaImagePath: "/graphql-schema-stitching-explained-schema-delegation-4c6caf468405/imgs/hero-b01f755cd26e943970fb26c0395027a491baa9a0-720x480.jpg" +heroImagePath: "/graphql-schema-stitching-explained-schema-delegation-4c6caf468405/imgs/hero-b01f755cd26e943970fb26c0395027a491baa9a0-720x480.jpg" heroImageAlt: "GraphQL Schema Stitching explained" excerpt: | Understanding GraphQL schema stitching (Part II) diff --git a/apps/blog/content/blog/graphql-sdl-schema-definition-language-6755bcb9ce51/index.mdx b/apps/blog/content/blog/graphql-sdl-schema-definition-language-6755bcb9ce51/index.mdx index 4b20d248a5..9f9967419d 100644 --- a/apps/blog/content/blog/graphql-sdl-schema-definition-language-6755bcb9ce51/index.mdx +++ b/apps/blog/content/blog/graphql-sdl-schema-definition-language-6755bcb9ce51/index.mdx @@ -5,8 +5,8 @@ date: "2017-05-01" authors: - "Nikolas Burk" metaTitle: "Learn more about the GraphQL SDL — Schema Definition Language" -metaImagePath: "/blog/graphql-sdl-schema-definition-language-6755bcb9ce51/imgs/hero-5d02853f87e521b189e585083a6fa90709310007-900x482.png" -heroImagePath: "/blog/graphql-sdl-schema-definition-language-6755bcb9ce51/imgs/hero-5d02853f87e521b189e585083a6fa90709310007-900x482.png" +metaImagePath: "/graphql-sdl-schema-definition-language-6755bcb9ce51/imgs/hero-5d02853f87e521b189e585083a6fa90709310007-900x482.png" +heroImagePath: "/graphql-sdl-schema-definition-language-6755bcb9ce51/imgs/hero-5d02853f87e521b189e585083a6fa90709310007-900x482.png" heroImageAlt: "GraphQL SDL " excerpt: | GraphQL has its own language to write GraphQL Schemas: The GraphQL Schema Definition Language (SDL). SDL is simple and diff --git a/apps/blog/content/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/index.mdx b/apps/blog/content/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/index.mdx index cb79eaa608..fc9618abd7 100644 --- a/apps/blog/content/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/index.mdx +++ b/apps/blog/content/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/index.mdx @@ -5,8 +5,8 @@ date: "2018-02-06" authors: - "Nikolas Burk" metaTitle: "GraphQL Server Basics: Demystifying the `info` Argument in Resolvers" -metaImagePath: "/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/hero-53626cca942e63310e547d4bc3575d78fad23c84-720x479.png" -heroImagePath: "/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/hero-53626cca942e63310e547d4bc3575d78fad23c84-720x479.png" +metaImagePath: "/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/hero-53626cca942e63310e547d4bc3575d78fad23c84-720x479.png" +heroImagePath: "/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/hero-53626cca942e63310e547d4bc3575d78fad23c84-720x479.png" heroImageAlt: "GraphQL Basics" excerpt: | Structure and Implementation of GraphQL Servers (Part III) @@ -38,7 +38,7 @@ A resolver function takes four arguments (in that order): Here is an overview of the execution process of a simple GraphQL query and the invocations of the belonging resolvers. Because the resolution of the _2nd resolver level_ is trivial, there is no need to actually implement these resolvers — their return values are automatically inferred by GraphQL.js: -![](/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/1*2UStyS7v3NIZKl2cLsBtYA.png) +![](/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a/imgs/1*2UStyS7v3NIZKl2cLsBtYA.png) _Overview of the `parent` and `args` argument in the GraphQL resolver chain_ diff --git a/apps/blog/content/blog/graphql-server-basics-the-network-layer-51d97d21861/index.mdx b/apps/blog/content/blog/graphql-server-basics-the-network-layer-51d97d21861/index.mdx index 871fb65353..0239b152a7 100644 --- a/apps/blog/content/blog/graphql-server-basics-the-network-layer-51d97d21861/index.mdx +++ b/apps/blog/content/blog/graphql-server-basics-the-network-layer-51d97d21861/index.mdx @@ -5,8 +5,8 @@ date: "2017-11-28" authors: - "Nikolas Burk" metaTitle: "GraphQL Server Basics: The Network Layer | Prisma" -metaImagePath: "/blog/graphql-server-basics-the-network-layer-51d97d21861/imgs/hero-244004bc5e6c3eb9d27aacabfb68d51510ea275e-900x429.png" -heroImagePath: "/blog/graphql-server-basics-the-network-layer-51d97d21861/imgs/hero-244004bc5e6c3eb9d27aacabfb68d51510ea275e-900x429.png" +metaImagePath: "/graphql-server-basics-the-network-layer-51d97d21861/imgs/hero-244004bc5e6c3eb9d27aacabfb68d51510ea275e-900x429.png" +heroImagePath: "/graphql-server-basics-the-network-layer-51d97d21861/imgs/hero-244004bc5e6c3eb9d27aacabfb68d51510ea275e-900x429.png" heroImageAlt: "GraphQL Server Basics" excerpt: | Structure and Implementation of GraphQL Servers (Part II). @@ -29,7 +29,7 @@ A key thing to understand about GraphQL is that it’s actually agnostic to the > The following section is mainly about Express.js and its concept of middleware that’s used for GraphQL libraries like `express-graphql` and `apollo-server`. **If you’re already familiar with Express, you can skip ahead to the next section.** -![Comparison of [express](https://expressjs.com), [hapi](https://hapijs.com/), [koa](http://koajs.com/) and [sail](https://sailsjs.com/) on [npm trends](http://www.npmtrends.com/)](/blog/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*6ERw4Znf6UYou_epNUutRA.png)_Comparison of [express](https://expressjs.com), [hapi](https://hapijs.com/), [koa](http://koajs.com/) and [sail](https://sailsjs.com/) on [npm trends](http://www.npmtrends.com/)_ +![Comparison of [express](https://expressjs.com), [hapi](https://hapijs.com/), [koa](http://koajs.com/) and [sail](https://sailsjs.com/) on [npm trends](http://www.npmtrends.com/)](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*6ERw4Znf6UYou_epNUutRA.png)_Comparison of [express](https://expressjs.com), [hapi](https://hapijs.com/), [koa](http://koajs.com/) and [sail](https://sailsjs.com/) on [npm trends](http://www.npmtrends.com/)_ [Express.js](https://expressjs.com/) is by far the [most popular](http://www.npmtrends.com/express-vs-hapi-vs-koa-vs-sails) JavaScript web framework. It shines thanks to its simplicity, flexibility and performance. @@ -47,7 +47,7 @@ app.listen(3000) ``` After executing this script with [Node.js](https://nodejs.org/en/), you can access the website on `http://localhost:3000` in your browser: -![](/blog/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*0ZgAAtT0Zm-Kc63SNeT5Ew.png) +![](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*0ZgAAtT0Zm-Kc63SNeT5Ew.png) You can easily add more _endpoints_ (also called [_routes_](https://expressjs.com/en/guide/routing.html)) to your server’s API: @@ -184,7 +184,7 @@ app.listen(4000) ``` ## `graphql-yoga`: The easiest way to build a GraphQL server -![](/blog/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*yIYI_iNabiNS_7uuzFVJDQ.png) +![](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*yIYI_iNabiNS_7uuzFVJDQ.png) ### Removing friction when building GraphQL servers @@ -222,7 +222,7 @@ Note that a `GraphQLServer` can either be instantiated using a ready instance of Note that `graphql-yoga` also has built-in support for [`graphql-playground`](https://github.com/graphcool/graphql-playground). With the code above you can open the Playground at `http://localhost:4000`: -![](/blog/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*dMyX0jnoKvhYAa0cgSqenQ.png) +![](/graphql-server-basics-the-network-layer-51d97d21861/imgs/1*dMyX0jnoKvhYAa0cgSqenQ.png) `graphql-yoga` also features a simple API for GraphQL subscriptions out-of-the-box, built on top of the [`graphql-subscriptions`](https://github.com/apollographql/graphql-subscriptions) and [`ws-subscriptions-transport`](https://github.com/apollographql/subscriptions-transport-ws) package. You can check out how it works in this [straightforward example](https://github.com/graphcool/graphql-yoga/tree/master/examples/subscriptions). diff --git a/apps/blog/content/blog/graphql-server-basics-the-schema-ac5e2950214e/index.mdx b/apps/blog/content/blog/graphql-server-basics-the-schema-ac5e2950214e/index.mdx index 6cf9f21900..37e8c42984 100644 --- a/apps/blog/content/blog/graphql-server-basics-the-schema-ac5e2950214e/index.mdx +++ b/apps/blog/content/blog/graphql-server-basics-the-schema-ac5e2950214e/index.mdx @@ -5,8 +5,8 @@ date: "2017-11-14" authors: - "Nikolas Burk" metaTitle: "GraphQL Server Basics: GraphQL Schemas, TypeDefs & Resolvers | Prisma" -metaImagePath: "/blog/graphql-server-basics-the-schema-ac5e2950214e/imgs/hero-4b7f2edb1e23c9afd77908b058e6904ada648cc2-900x519.png" -heroImagePath: "/blog/graphql-server-basics-the-schema-ac5e2950214e/imgs/hero-4b7f2edb1e23c9afd77908b058e6904ada648cc2-900x519.png" +metaImagePath: "/graphql-server-basics-the-schema-ac5e2950214e/imgs/hero-4b7f2edb1e23c9afd77908b058e6904ada648cc2-900x519.png" +heroImagePath: "/graphql-server-basics-the-schema-ac5e2950214e/imgs/hero-4b7f2edb1e23c9afd77908b058e6904ada648cc2-900x519.png" heroImageAlt: "GraphQL Server Basics" excerpt: | Structure and implementation of GraphQL servers (Part I) @@ -154,7 +154,7 @@ const UserType = new GraphQLObjectType({ Considering our query from above, let’s understand how it’s executed and data is collected. The query in total contains three fields: `user` (the _root field_), `id` and `name`. This means that when the query arrives at the server, the server needs to call three resolver functions — one per field. Let’s walk through the execution flow: -![](/blog/graphql-server-basics-the-schema-ac5e2950214e/imgs/1*_fQh0zWBlDG1OJ-FbMnWcw.png) +![](/graphql-server-basics-the-schema-ac5e2950214e/imgs/1*_fQh0zWBlDG1OJ-FbMnWcw.png) 1. The query arrives at the server. 1. The server invokes the resolver for the root field `user` — let’s assume `fetchUserById` returns this object: `{ "id": "abc", "name": "Sarah" }` diff --git a/apps/blog/content/blog/graphql-vs-firebase-496498546142/index.mdx b/apps/blog/content/blog/graphql-vs-firebase-496498546142/index.mdx index 219f29a144..bfbc61d671 100644 --- a/apps/blog/content/blog/graphql-vs-firebase-496498546142/index.mdx +++ b/apps/blog/content/blog/graphql-vs-firebase-496498546142/index.mdx @@ -5,8 +5,8 @@ date: "2017-05-05" authors: - "Nikolas Burk" metaTitle: "Comparing GraphQL and Firebase | Prisma" -metaImagePath: "/blog/graphql-vs-firebase-496498546142/imgs/hero-c257f8c747d9610f835954d2fe2601bda2b0bff3-720x385.png" -heroImagePath: "/blog/graphql-vs-firebase-496498546142/imgs/hero-c257f8c747d9610f835954d2fe2601bda2b0bff3-720x385.png" +metaImagePath: "/graphql-vs-firebase-496498546142/imgs/hero-c257f8c747d9610f835954d2fe2601bda2b0bff3-720x385.png" +heroImagePath: "/graphql-vs-firebase-496498546142/imgs/hero-c257f8c747d9610f835954d2fe2601bda2b0bff3-720x385.png" heroImageAlt: "GraphQL vs Firebase" excerpt: | With the variety of server-side technologies today, developers have a lot of choices when it comes to deciding what diff --git a/apps/blog/content/blog/grover-customer-success-story-nxkwgcgnuvfd/index.mdx b/apps/blog/content/blog/grover-customer-success-story-nxkwgcgnuvfd/index.mdx index aed3c67d8b..b07eee436a 100644 --- a/apps/blog/content/blog/grover-customer-success-story-nxkwgcgnuvfd/index.mdx +++ b/apps/blog/content/blog/grover-customer-success-story-nxkwgcgnuvfd/index.mdx @@ -6,9 +6,11 @@ authors: - "Ryan Chenkie" metaTitle: "How Grover Moves Faster and is More Productive with Prisma" metaDescription: "Grover has many individual development teams that each work in slightly different stacks. Prisma is catching on as a way to help their teams move faster and be more confident in their code." -metaImagePath: "/blog/grover-customer-success-story-nxkwgcgnuvfd/imgs/meta-cb121051733205088c9beee9cc8b5b4553e3988a-1692x852.png" -heroImagePath: "/blog/grover-customer-success-story-nxkwgcgnuvfd/imgs/hero-3fcd833a161c68af69d2c13eafb3369f343e0856-844x474.svg" +metaImagePath: "/grover-customer-success-story-nxkwgcgnuvfd/imgs/meta-cb121051733205088c9beee9cc8b5b4553e3988a-1692x852.png" +heroImagePath: "/grover-customer-success-story-nxkwgcgnuvfd/imgs/hero-3fcd833a161c68af69d2c13eafb3369f343e0856-844x474.svg" heroImageAlt: "How Grover Moves Faster with Prisma" +tags: + - "usersuccessstory" excerpt: | Grover offers monthly tech product subscriptions and splits work on its services across many teams. Some teams have recently found huge productivity gains by adopting Prisma. Read on to find out how Prisma has benefited Grover and how you can benefit as well. @@ -34,7 +36,7 @@ Specifically for their Apollo Federation, Grover has 14 unique services develope Languages used across the teams include TypeScript, Ruby, and Python. Some teams use [TypeGraphQL](https://typegraphql.com/), while others use [Nexus](https://nexusjs.org/). -![Overview of Grover's Apollo federated GraphQL API](/blog/grover-customer-success-story-nxkwgcgnuvfd/imgs/KZX2GIV.png) +![Overview of Grover's Apollo federated GraphQL API](/grover-customer-success-story-nxkwgcgnuvfd/imgs/KZX2GIV.png) ## Experimentation Encouraged @@ -129,7 +131,7 @@ Prisma Migrate offers another powerful glimpse. With Migrate, a few commands wil Since Prisma is useful anywhere you can install a node module, it fits in perfectly with the various stacks in use at Grover. -![Grover has 14 different services using various tech stacks](/blog/grover-customer-success-story-nxkwgcgnuvfd/imgs/eSb3LiB.png) +![Grover has 14 different services using various tech stacks](/grover-customer-success-story-nxkwgcgnuvfd/imgs/eSb3LiB.png) ## Conclusion diff --git a/apps/blog/content/blog/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/index.mdx b/apps/blog/content/blog/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/index.mdx index 7d0248a68b..6247fad852 100644 --- a/apps/blog/content/blog/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/index.mdx +++ b/apps/blog/content/blog/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/index.mdx @@ -5,9 +5,11 @@ date: "2021-01-27" authors: - "Justin Ellingwood" metaTitle: "Learn how Prisma Helps Rapha Manage Their Mobile Application Data" -metaImagePath: "/blog/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/imgs/hero-b0f3d722a514f161e410fc12ccf0e00e562b5ecb-1692x852.jpg" -heroImagePath: "/blog/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/imgs/hero-b0f3d722a514f161e410fc12ccf0e00e562b5ecb-1692x852.jpg" +metaImagePath: "/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/imgs/hero-b0f3d722a514f161e410fc12ccf0e00e562b5ecb-1692x852.jpg" +heroImagePath: "/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/imgs/hero-b0f3d722a514f161e410fc12ccf0e00e562b5ecb-1692x852.jpg" heroImageAlt: "How Prisma Helps Rapha Manage Their Mobile Application Data" +tags: + - "usersuccessstory" excerpt: | Rapha is a company dedicated to redefining comfort, performance, and style for cyclists around the world, whether beginners or World Tour professionals. Learn how Prisma helps Rapha build consistent data APIs across various teams and platforms. @@ -31,7 +33,7 @@ Rapha's involvement with its community provides many unique opportunities and ch A side effect of interfacing with users in so many unique mediums is that a variety of systems are involved in managing user data. Their data infrastructure reflects this. -![Rapha's data architecture](/blog/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/imgs/rapha_architecture_diagram.png) +![Rapha's data architecture](/helping-rapha-access-data-across-platforms-n3jfhtyu6rgn/imgs/rapha_architecture_diagram.png) Rapha's web team addresses its data requirements primarily with: diff --git a/apps/blog/content/blog/how-bucket-uses-prisma-orm/index.mdx b/apps/blog/content/blog/how-bucket-uses-prisma-orm/index.mdx index 7b9c4552db..80df95e85e 100644 --- a/apps/blog/content/blog/how-bucket-uses-prisma-orm/index.mdx +++ b/apps/blog/content/blog/how-bucket-uses-prisma-orm/index.mdx @@ -6,9 +6,12 @@ authors: - "Aidan McAlister" metaTitle: "How Bucket Uses Prisma ORM to Make Shipping Feature Releases Faster" metaDescription: "Learn how Bucket uses Prisma" -metaImagePath: "/blog/how-bucket-uses-prisma-orm/imgs/meta-2912dd24525d0768088b7b6c6209b19bfba0d92f-1266x711.png" -heroImagePath: "/blog/how-bucket-uses-prisma-orm/imgs/hero-529b3d14590540555baed7e42696fe030fb8d435-855x480.png" +metaImagePath: "/how-bucket-uses-prisma-orm/imgs/meta-2912dd24525d0768088b7b6c6209b19bfba0d92f-1266x711.png" +heroImagePath: "/how-bucket-uses-prisma-orm/imgs/hero-529b3d14590540555baed7e42696fe030fb8d435-855x480.png" heroImageAlt: "Prisma Logo and Bucket Logo" +tags: + - "usersuccessstory" + - "orm" excerpt: | Discover how [Bucket](https://bucket.co/), a fast-growing feature management platform, uses Prisma ORM to simplify complex relational queries and accelerate feature releases. Learn how their lean team delivers high-quality features faster while managing evolving database needs with ease. --- diff --git a/apps/blog/content/blog/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/index.mdx b/apps/blog/content/blog/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/index.mdx index 2d795a233c..9996a2d701 100644 --- a/apps/blog/content/blog/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/index.mdx +++ b/apps/blog/content/blog/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/index.mdx @@ -6,8 +6,8 @@ authors: - "Marc Hess" metaTitle: "How Co.dev Uses Prisma Postgres to Power AI-Driven App Development for Non-Developers" metaDescription: "Discover why Co.dev chose Prisma Postgres: simple API & MCP integration, explicit schema support, and one-shot authentication in its AI-driven app creation flow." -metaImagePath: "/blog/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/imgs/meta-09f23372479a0a2b3a10304fc133043fa4d50948-1266x711.png" -heroImagePath: "/blog/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/imgs/hero-89282cc5e9c28bfbb3573c7bd396226f11b08089-844x474.svg" +metaImagePath: "/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/imgs/meta-09f23372479a0a2b3a10304fc133043fa4d50948-1266x711.png" +heroImagePath: "/how-co-dev-uses-prisma-postgres-to-power-ai-driven-app-development-for-non-developers/imgs/hero-89282cc5e9c28bfbb3573c7bd396226f11b08089-844x474.svg" heroImageAlt: "On a dark teal-green gradient background, the Co.dev and Prisma logos appear side by side with a plus sign. Below, large white text reads ‘AI-Driven App Development for Non-Developers,’ and a curved teal arrow points right. On the right, two overlapping dark code editor panels show a teal header labeled ‘Let’s make an Instagram clone’ above blurred lines of text, and a front panel titled ‘Generating Instagram UI…’ with additional blurred code lines." excerpt: | Co.dev (YC W23) lets non-developers build production-ready full-stack apps in minutes by combining AI-driven code generation with integrated tooling, all powered by a strategic partnership with **Prisma** via the **Prisma Postgres Partner API** and MCP server integration. diff --git a/apps/blog/content/blog/how-deno-and-prisma-partnered-to-power-per-branch-databases/index.mdx b/apps/blog/content/blog/how-deno-and-prisma-partnered-to-power-per-branch-databases/index.mdx index 5b16aea401..a67a12d9b0 100644 --- a/apps/blog/content/blog/how-deno-and-prisma-partnered-to-power-per-branch-databases/index.mdx +++ b/apps/blog/content/blog/how-deno-and-prisma-partnered-to-power-per-branch-databases/index.mdx @@ -6,9 +6,12 @@ authors: - "Marc Hess" metaTitle: "How Deno and Prisma Partnered to Power Per-Branch Databases" metaDescription: "Deno Deploy integrates Prisma Postgres for instant per-branch databases, enabling seamless full-stack deployment and modern developer workflows." -metaImagePath: "/blog/how-deno-and-prisma-partnered-to-power-per-branch-databases/imgs/meta-b375e2f9e09737edda70601ea1d7094878822700-1200x630.png" -heroImagePath: "/blog/how-deno-and-prisma-partnered-to-power-per-branch-databases/imgs/hero-45aa700bfa2da328ccb88b64d312672e25c2b263-844x474.svg" +metaImagePath: "/how-deno-and-prisma-partnered-to-power-per-branch-databases/imgs/meta-b375e2f9e09737edda70601ea1d7094878822700-1200x630.png" +heroImagePath: "/how-deno-and-prisma-partnered-to-power-per-branch-databases/imgs/hero-45aa700bfa2da328ccb88b64d312672e25c2b263-844x474.svg" heroImageAlt: "Deno and Prisma Partnership" +tags: + - "usersuccessstory" + - "prisma-postgres" excerpt: | Deno Deploy’s integration with Prisma Postgres enables seamless full-stack deployment. Each Git branch gets its own database via the Prisma Management API, allowing developers to preview, test, and ship changes faster without managing infrastructure. Built through the Prisma Partner Program. --- diff --git a/apps/blog/content/blog/how-do-graphql-remote-schemas-work-7118237c89d7/index.mdx b/apps/blog/content/blog/how-do-graphql-remote-schemas-work-7118237c89d7/index.mdx index 7f30254df0..1c99d79f5c 100644 --- a/apps/blog/content/blog/how-do-graphql-remote-schemas-work-7118237c89d7/index.mdx +++ b/apps/blog/content/blog/how-do-graphql-remote-schemas-work-7118237c89d7/index.mdx @@ -5,8 +5,8 @@ date: "2017-12-06" authors: - "Nikolas Burk" metaTitle: "Learn how GraphQL remote schemas work? | Prisma" -metaImagePath: "/blog/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/hero-da5c4b73a3fd5b55d0301343f2b5698eedc64f9e-900x545.jpg" -heroImagePath: "/blog/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/hero-da5c4b73a3fd5b55d0301343f2b5698eedc64f9e-900x545.jpg" +metaImagePath: "/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/hero-da5c4b73a3fd5b55d0301343f2b5698eedc64f9e-900x545.jpg" +heroImagePath: "/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/hero-da5c4b73a3fd5b55d0301343f2b5698eedc64f9e-900x545.jpg" heroImageAlt: "How do GraphQL remote schemas work?" excerpt: | Understanding GraphQL schema stitching (Part I) @@ -142,7 +142,7 @@ As you can see, the information in this JSON object is equivalent to our SDL-bas With the ability to introspect the schema of an existing GraphQL API, we can now simply create a new `GraphQLSchema` instance whose schema definition is identical to the existing one. That’s exactly the idea of [`makeRemoteExecutableSchema`](https://www.apollographql.com/docs/graphql-tools/remote-schemas.html#makeRemoteExecutableSchema) from `graphql-tools`. -![](/blog/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*nmcFbnUg7ooxjlZ8z-GLQA.png) +![](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*nmcFbnUg7ooxjlZ8z-GLQA.png) `makeRemoteExecutableSchema` receives two arguments: @@ -218,13 +218,13 @@ The first thing to note is that both of them are instances of `GraphQLSchema`. H Using the chrome debugger, we can reveal the databaseServiceSchemaDefinition is a JavaScript object looking as follows: -![A non-executable instance of GraphQLSchema](/blog/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*o57PeaoF5PVrON-FhR8QTA.png)_A non-executable instance of GraphQLSchema_ +![A non-executable instance of GraphQLSchema](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*o57PeaoF5PVrON-FhR8QTA.png)_A non-executable instance of GraphQLSchema_ The blue rectangle shows the [`Query`](https://github.com/nikolasburk/graphcool-remote-schema/blob/master/user-db/database.graphql#L29) type with its properties. As expected, it has a field called `allUsers` (among others). However, in this schema instance there are no resolvers attached to the `Query`'s fields— so it’s not executable. Let’s also take a look at the `databaseServiceExecutableSchema`: -![Executable Schema = Schema definition + Resolvers](/blog/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*KQ620d8vVrnl4vCYyqkWOA.png)_Executable Schema = Schema definition + Resolvers_ +![Executable Schema = Schema definition + Resolvers](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*KQ620d8vVrnl4vCYyqkWOA.png)_Executable Schema = Schema definition + Resolvers_ This screenshot looks very similar to the one we just saw — except that the `allUsers` field now has this `resolve` function attached to it. (This is also the case for the other fields on the [`Query`](https://github.com/nikolasburk/graphcool-remote-schema/blob/master/user-db/database.graphql#L29) type (`User`, `node`, `user` and `_allUsersMeta`), but not visible in the screenshot.) @@ -261,7 +261,7 @@ Line 12–16 is what’s interesting to us: a function called `fetcher` is invok In the same way that we explored the resolver function for the `allUsers` root field above, we can also investigate what the resolvers for the fields on the `User` type look like. We therefore need to navigate into the `_typeMaps` property of the `databaseServiceExecutableSchema` where we find the `User` type with its fields: -![The User type has two fields: id and name (both have an attached resolver function)](/blog/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*bz9k7dsElF5x_eqIfc_XWw.png)_The User type has two fields: id and name (both have an attached resolver function)_ +![The User type has two fields: id and name (both have an attached resolver function)](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*bz9k7dsElF5x_eqIfc_XWw.png)_The User type has two fields: id and name (both have an attached resolver function)_ Both fields (`id` and `name`) have a `resolve` function attached to them, here is their implementation that was generated by `makeRemoteExecutableSchema` (note that it’s identical for both fields): @@ -296,7 +296,7 @@ Interestingly, this time the generated resolver does not use a `fetcher` functio The [tracing](https://github.com/apollographql/apollo-tracing) data for resolvers of remote executable schemas also confirm this finding. In the following screenshot, we extended the previous schema definition with an `Article` and `Comment` type (each also connected to the `existingUser`) so we can send a more deeply nested query. -![[GraphQL Playgrounds](https://github.com/graphql/graphql-playground) support displaying [tracing](https://github.com/apollographql/apollo-tracing) data for resolvers out-of-the-box (bottom right)](/blog/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*SwVWiWOCRnyCCP80lKoXjw.png)_[GraphQL Playgrounds](https://github.com/graphql/graphql-playground) support displaying [tracing](https://github.com/apollographql/apollo-tracing) data for resolvers out-of-the-box (bottom right)_ +![[GraphQL Playgrounds](https://github.com/graphql/graphql-playground) support displaying [tracing](https://github.com/apollographql/apollo-tracing) data for resolvers out-of-the-box (bottom right)](/how-do-graphql-remote-schemas-work-7118237c89d7/imgs/1*SwVWiWOCRnyCCP80lKoXjw.png)_[GraphQL Playgrounds](https://github.com/graphql/graphql-playground) support displaying [tracing](https://github.com/apollographql/apollo-tracing) data for resolvers out-of-the-box (bottom right)_ It’s very apparent from the tracing data that only the root resolver (for the allUsers field) takes notable time (167 milliseconds). All remaining resolvers responsible for returning data for non-root fields only take a few microseconds to be executed. This can be explained with the observation we made earlier that root resolvers use the `fetcher` to forward the received query while all non-root resolvers simple return their data based on the incoming `parent` argument. diff --git a/apps/blog/content/blog/how-greatfrontend-supercharged-development-with-prisma-orm/index.mdx b/apps/blog/content/blog/how-greatfrontend-supercharged-development-with-prisma-orm/index.mdx index 61ace5793f..bb49dd40c9 100644 --- a/apps/blog/content/blog/how-greatfrontend-supercharged-development-with-prisma-orm/index.mdx +++ b/apps/blog/content/blog/how-greatfrontend-supercharged-development-with-prisma-orm/index.mdx @@ -6,8 +6,8 @@ authors: - "Ryan Chenkie" metaTitle: "How GreatFrontEnd Supercharged Development with Prisma ORM" metaDescription: "Discover how GreatFrontEnd revolutionized their database operations by integrating Prisma ORM—achieving type safety, streamlined schema management, and a more efficient development pipeline." -metaImagePath: "/blog/how-greatfrontend-supercharged-development-with-prisma-orm/imgs/meta-a323448cc92e5d106e51a671d0f1d07d8667e306-1266x711.png" -heroImagePath: "/blog/how-greatfrontend-supercharged-development-with-prisma-orm/imgs/hero-ca1f358db8d06f5017b9d07ffb9d2dee6dac1197-844x474.svg" +metaImagePath: "/how-greatfrontend-supercharged-development-with-prisma-orm/imgs/meta-a323448cc92e5d106e51a671d0f1d07d8667e306-1266x711.png" +heroImagePath: "/how-greatfrontend-supercharged-development-with-prisma-orm/imgs/hero-ca1f358db8d06f5017b9d07ffb9d2dee6dac1197-844x474.svg" excerpt: | Discover how GreatFrontEnd revolutionized their database operations by integrating Prisma ORM—achieving type safety, streamlined schema management, and a more efficient development pipeline. --- @@ -21,7 +21,7 @@ GreatFrontEnd is a cutting-edge development platform built to help front-end eng As their platform grew to support over 700,000 active users, their reliance on raw SQL queries started to hinder progress. They needed a smarter, more scalable solution to manage database interactions without compromising on type integrity. -![](/blog/how-greatfrontend-supercharged-development-with-prisma-orm/imgs/1fdd15008595dc681e51014a12b087c6a93b1aa5-3792x2436.png) +![](/how-greatfrontend-supercharged-development-with-prisma-orm/imgs/1fdd15008595dc681e51014a12b087c6a93b1aa5-3792x2436.png) ## Overcoming Database Challenges diff --git a/apps/blog/content/blog/how-masterboard-simplified-ci-cd-testing-with-prisma-postgres/index.mdx b/apps/blog/content/blog/how-masterboard-simplified-ci-cd-testing-with-prisma-postgres/index.mdx index b083a37851..5452fe124f 100644 --- a/apps/blog/content/blog/how-masterboard-simplified-ci-cd-testing-with-prisma-postgres/index.mdx +++ b/apps/blog/content/blog/how-masterboard-simplified-ci-cd-testing-with-prisma-postgres/index.mdx @@ -6,8 +6,8 @@ authors: - "Marc Hess" metaTitle: "How MasterBoard Simplified CI/CD Testing with Prisma Postgres" metaDescription: "MasterBoard replaced AWS with Prisma Postgres to simplify infrastructure and streamline testing. Discover how they spin up fresh databases for every PR, test with real data, and ship faster with less setup, more speed, and top-tier support from Prisma." -metaImagePath: "/blog/how-masterboard-simplified-ci-cd-testing-with-prisma-postgres/imgs/meta-e680c2113c3e4838d591e4cac9d2889ea7317998-1266x711.png" -heroImagePath: "/blog/how-masterboard-simplified-ci-cd-testing-with-prisma-postgres/imgs/hero-1f23e9b31ddcd853665664a9c2039b7c413a587e-844x474.svg" +metaImagePath: "/how-masterboard-simplified-ci-cd-testing-with-prisma-postgres/imgs/meta-e680c2113c3e4838d591e4cac9d2889ea7317998-1266x711.png" +heroImagePath: "/how-masterboard-simplified-ci-cd-testing-with-prisma-postgres/imgs/hero-1f23e9b31ddcd853665664a9c2039b7c413a587e-844x474.svg" heroImageAlt: "MasterBoard and Prisma logos side by side on a dark gradient background. The MasterBoard logo appears on the left with bold, stylized typography, and the Prisma logo with its geometric icon and wordmark appears on the right, separated by a vertical line." excerpt: | [MasterBoard](https://masterboardapp.com/), a startup building software for hydraulics repair shops, switched from AWS to Prisma Postgres to simplify their CI/CD workflows. The move reduced infrastructure overhead, simplified testing and deployment, and gave both developers and testers faster, hassle-free workflows. diff --git a/apps/blog/content/blog/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/index.mdx b/apps/blog/content/blog/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/index.mdx index 3d2f610e62..f717b4f8ba 100644 --- a/apps/blog/content/blog/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/index.mdx +++ b/apps/blog/content/blog/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/index.mdx @@ -6,9 +6,11 @@ authors: - "Vladi Stevanovic" metaTitle: "The migration to Prisma was so smooth that none of their hundreds of agents and customers experienced any downtime." metaDescription: "Invisible combines best-in-class, easy to implement, scalable automation solutions. Prisma was crucial in future proofing their stack and supporting its scale." -metaImagePath: "/blog/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/meta-86c169055f2cef3afec8529ac1a1f9d2feb2e9ec-1692x852.png" -heroImagePath: "/blog/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/hero-6c079320ad9b2a389f2419759abe8b2089f4b2d4-870x438.png" +metaImagePath: "/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/meta-86c169055f2cef3afec8529ac1a1f9d2feb2e9ec-1692x852.png" +heroImagePath: "/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/hero-6c079320ad9b2a389f2419759abe8b2089f4b2d4-870x438.png" heroImageAlt: "How migrating from Sequelize to Prisma allowed Invisible to scale" +tags: + - "usersuccessstory" excerpt: | Invisible is a B2B productivity startup that allows its users to automate and outsource any complex workflow or business process through [Worksharing](https://www.invisible.co/our-platform). Prisma played a crucial role in allowing Invisible to future proof their tech stack and in supporting its scale. @@ -106,7 +108,7 @@ Currently, the Invisible team is focusing on refactoring the Heroku monolithic A Prisma works seamlessly with their new microservice architecture and has been abstracted out into its own library that can be shared across the services that require data. Prisma automatically opens and closes DB connections as the serverless functions require. Check out [The world's worst pool party: Connection management with Prisma](https://www.youtube.com/watch?v=SmKJnITMQZw&feature=youtu.be) - a talk by Martina Welander on the subject! -![Invisible's tech stack before and after Prisma](/blog/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/2021-06-05-invisible-diagram.png) +![Invisible's tech stack before and after Prisma](/how-migrating-from-sequelize-to-prisma-allowed-invisible-to-scale-i4pz2mwu6q/imgs/2021-06-05-invisible-diagram.png) ## Invisible’s Engineering Culture diff --git a/apps/blog/content/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/index.mdx b/apps/blog/content/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/index.mdx index 6530475a98..1ff6aee41a 100644 --- a/apps/blog/content/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/index.mdx +++ b/apps/blog/content/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/index.mdx @@ -6,9 +6,11 @@ authors: - "Sabin Adams" metaTitle: "How Prisma & Serverless Fit Together" metaDescription: "Learn about how Prisma views the evolution of deployment types, serverless and the edge, and the problems we want to solve in the space." -metaImagePath: "/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/meta-16bd738ba008cf22a31f583608f1717f4dfffb34-1266x712.png" -heroImagePath: "/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/hero-39edebe28834872f6ce4c951529f02ea55725adc-844x474.svg" +metaImagePath: "/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/meta-16bd738ba008cf22a31f583608f1717f4dfffb34-1266x712.png" +heroImagePath: "/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/hero-39edebe28834872f6ce4c951529f02ea55725adc-844x474.svg" heroImageAlt: "How Prisma & Serverless Fit Together" +tags: + - "serverless" excerpt: | As we shift towards a serverless world, we create new opportunities and new problems to be solved. One problem has Prisma's attention: how to make databases fit into a serverless world. @@ -35,7 +37,7 @@ In this article, we want to take a step back and consider how software was deplo You may have been (un)fortunate enough to have been a developer during the bare-metal (or *on-premise*) deployment phase of development. -![On-premise servers](/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/on-prem.png) +![On-premise servers](/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/on-prem.png) A bare-metal deployment is a deployment made on a _physical server_ that is set up and managed on-premise, likely by a systems administrator. The provisioning of software updates, hardware updates, etc... is all manually done directly on a physical machine by a human being. @@ -45,7 +47,7 @@ Even in its simplest form, bare-metal deployments are difficult as they require As teams grew tired of managing so many physical machines and maintaining facilities to house that hardware, they turned to a new technology that allowed them to create *virtual machines* that host their applications. -![Virtual machine](/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/virtual-machine.png) +![Virtual machine](/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/virtual-machine.png) A virtual machine is essentially a virtualized copy of a complete physical machine that can be run on physical hardware. @@ -57,7 +59,7 @@ The last incarnation of deployments we will talk about before getting into serve A container is an isolated space on a host machine's operating system that can exist and operate independently from the other processes running on that host. This means developers may run multiple containers on their machines as completely isolated virtualized machines. -![Containers](/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/containers.png) +![Containers](/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/containers.png) The most common example of a containerization tool is [Docker](https://www.docker.com/). Docker makes it easy for developers to host multiple applications with different environmental requirements on a single machine in a way that closely matches the production environment. @@ -83,7 +85,7 @@ This allows developers to iterate much more quickly than they otherwise would ha Long-distance network requests cause latency that is only cured by bringing the request destination closer to the user sending that request. -![](/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/serverless.png) +![](/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/serverless.png) Because serverless does not rely on a singular server to host your application, developers have the option to easily deploy their applications to many different regions. This allows them to put their product as close to the users as possible, eliminating that latency as long as the user is close to the geographical deployment zones. @@ -101,7 +103,7 @@ Deploying to "the edge" takes the benefits of serverless one step further. Befor An application that is deployed to the edge refers to one that is deployed across a widely distributed network of data centers in many regions, putting the application close to _every_ user, not just _some_ users. In this context, "the edge" typically refers to "the edge of the network". -![](/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/edge.png) +![](/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/edge.png) In the most technical sense, any deployment model can be _"at the edge"_ if it is deployed across every geographical region. That being said when we at Prisma refer to "the edge", we refer specifically to serverless deployments to the edge as this is the most feasible way to get there. [Cloudflare Workers](https://workers.cloudflare.com/), [Vercel Edge Functions](https://vercel.com/docs/concepts/functions/edge-functions) and [Deno Deploy](https://deno.com/deploy) are examples of this. @@ -147,13 +149,13 @@ Databases in a serverless setting, however, become a performance bottleneck. A s The symptom of this problem is that requests still end up with the network hops across large geographical distances to connect to and query the database, forfeiting the benefit serverless brings of low-latency requests. -![](/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/edge-w-db.png) +![](/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/edge-w-db.png) Another side-effect of the ephemeral nature of a serverless function's environment is that long-lived connections are not viable. The implications of this can be huge, especially when interacting with a traditional relational database. In a long-running server, a TCP connection from the application to the database is made and kept alive, allowing the application to query the database using that connection. With serverless this is not possible. -![Exhausted connection pool](/blog/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/connection-pool.svg) +![Exhausted connection pool](/how-prisma-and-serverless-fit-together-iasfcpqvi0/imgs/connection-pool.svg) As applications scale up and multiple functions handle requests, each function will create a connection pool to the database. This will easily exhaust the database's connection limits. diff --git a/apps/blog/content/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/index.mdx b/apps/blog/content/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/index.mdx index c6dd90ad9f..c338b620ff 100644 --- a/apps/blog/content/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/index.mdx +++ b/apps/blog/content/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/index.mdx @@ -6,9 +6,11 @@ authors: - "Nikolas Burk" metaTitle: "How Prisma ORM Became the Most Downloaded ORM for Node.js" metaDescription: "Reflect on three years of Prisma ORM development with this article showing how Prisma ORM became the most downloaded ORM for Node.js" -metaImagePath: "/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/meta-1b20c9918f8c70edad559c02e68c2f0098514e92-1266x711.png" -heroImagePath: "/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/hero-09a857300a35ccb0e825102b49c0477ce6a88d3c-844x474.svg" +metaImagePath: "/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/meta-1b20c9918f8c70edad559c02e68c2f0098514e92-1266x711.png" +heroImagePath: "/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/hero-09a857300a35ccb0e825102b49c0477ce6a88d3c-844x474.svg" heroImageAlt: "A friendly prismanaut climbing the npm trends mountain to #1 in npm downloads" +tags: + - "orm" excerpt: | Prisma ORM was released for production in 2021 and recently became the most downloaded database library on npm! We are grateful to share this milestone with our community and want to take the opportunity to reflect on the past and give an outlook into the future. --- @@ -23,7 +25,7 @@ Since then, Prisma ORM has gained steady popularity and recently made it to firs We’re proud that Prisma ORM has pushed the TypeScript ecosystem forward and introduced the first *fully* type-safe layer for database interactions in Node.js and other server-side JS runtimes. -![A graph showing npm downloads of popular ORMs over the past year](/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/8c9fedf1d8f95be1c2cca043f80b05b991c7d161-2618x1100.png) +![A graph showing npm downloads of popular ORMs over the past year](/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/8c9fedf1d8f95be1c2cca043f80b05b991c7d161-2618x1100.png) ### Community is the core of Prisma @@ -31,7 +33,7 @@ We’re proud that Prisma ORM has pushed the TypeScript ecosystem forward and in We see developers create content about Prisma ORM, build tools for the Prisma ecosystem, or help each other out with questions on GitHub, Stack Overflow, and Discord. -![A prismanaut surrounded by the various online communities Prisma wouldn't be here without](/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/885db2c52d6cd7ebe6f82437ac6e7a6034478698-1480x1696.png) +![A prismanaut surrounded by the various online communities Prisma wouldn't be here without](/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/885db2c52d6cd7ebe6f82437ac6e7a6034478698-1480x1696.png) In short: We wouldn’t be here without the amazing support from our community — thank you! @@ -50,7 +52,7 @@ There are numerous next-generation web development tools and frameworks that hav - [Wasp](https://wasp-lang.dev/) (YC W21): High-level DSL to build web apps using React. Check out their [free, production-ready SaaS starter](https://wasp-lang.dev/blog/2024/01/30/open-saas-free-open-source-starter-react-nodejs) if you’re curious. - [Amplication](https://amplication.com): Backend development tool that auto-generates production-ready applications. With [6.6M in seed funding](https://twitter.com/amplication/status/1491413095822073863), Amplication is one of the most promising backend generation tools on the market. -![How Prisma integrates with next generation frameworks](/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/12d31463e91d394c5019b14618766b4047c2bd8e-1480x731.png) +![How Prisma integrates with next generation frameworks](/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/12d31463e91d394c5019b14618766b4047c2bd8e-1480x731.png) #### Community tools for even better Prisma ORM workflows @@ -70,11 +72,11 @@ As a company, we went through a lot of different phases until we arrived where w Having started as [GraphQL-based Backend-as-a-Service](https://www.graph.cool/) (BaaS), we’ve “climbed down the ladder of abstractions” from the API layer to the database. While Prisma 1 still was primarily focused on building *GraphQL* APIs, Prisma 2 and later versions (aka “Prisma ORM”) have been solely about improving *database* workflows. -![A timeline of Prisma's evolution as a company, going from Graphcool, to Prisma, Prisma ORM, Prisma Accelerate, and beyond](/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/c2dd92cb8e0c4703e5b01448980142d32e4087fe-1998x750.png) +![A timeline of Prisma's evolution as a company, going from Graphcool, to Prisma, Prisma ORM, Prisma Accelerate, and beyond](/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/c2dd92cb8e0c4703e5b01448980142d32e4087fe-1998x750.png) Since the initial, early access release of Prisma ORM in July 2019, a lot has happened. Here’s a recap of our favorite things that we accomplished in the last years: -![A timeline of big releases in Prisma's lifetime](/blog/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/1ca939c080b3cf8bb986fcf4a17f16d6965f2a27-2220x1365.png) +![A timeline of big releases in Prisma's lifetime](/how-prisma-orm-became-the-most-downloaded-orm-for-node-js/imgs/1ca939c080b3cf8bb986fcf4a17f16d6965f2a27-2220x1365.png) diff --git a/apps/blog/content/blog/how-prisma-supports-transactions-x45s1d5l0ww1/index.mdx b/apps/blog/content/blog/how-prisma-supports-transactions-x45s1d5l0ww1/index.mdx index b548e64615..da05cb7a34 100644 --- a/apps/blog/content/blog/how-prisma-supports-transactions-x45s1d5l0ww1/index.mdx +++ b/apps/blog/content/blog/how-prisma-supports-transactions-x45s1d5l0ww1/index.mdx @@ -6,8 +6,8 @@ authors: - "Nikolas Burk" - "Søren Bramer Schmidt" metaTitle: "Learn How Prisma Supports Database Transactions | Prisma" -metaImagePath: "/blog/how-prisma-supports-transactions-x45s1d5l0ww1/imgs/hero-644cfd40037273136103e964bfde80be554c43a7-1692x852.png" -heroImagePath: "/blog/how-prisma-supports-transactions-x45s1d5l0ww1/imgs/hero-644cfd40037273136103e964bfde80be554c43a7-1692x852.png" +metaImagePath: "/how-prisma-supports-transactions-x45s1d5l0ww1/imgs/hero-644cfd40037273136103e964bfde80be554c43a7-1692x852.png" +heroImagePath: "/how-prisma-supports-transactions-x45s1d5l0ww1/imgs/hero-644cfd40037273136103e964bfde80be554c43a7-1692x852.png" heroImageAlt: "How Prisma Supports Database Transactions" excerpt: | Database transactions often are a major source of complexity in server-side applications. In this article, we'll examine how Prisma supports different types of database transactions _today_ as well as our plans for expanding transaction support _in the future_. diff --git a/apps/blog/content/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/index.mdx b/apps/blog/content/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/index.mdx index 5aa6312f06..c17c34bb14 100644 --- a/apps/blog/content/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/index.mdx +++ b/apps/blog/content/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/index.mdx @@ -6,8 +6,10 @@ authors: - "Nikolas Burk" metaTitle: "How Solin Uses Prisma Accelerate to Serve 2.5M Database Queries per" metaDescription: "Learn how Prisma Accelerate has contributed to Solin's success by enhancing performance and reliability with its scalable connection pool and global database cache." -metaImagePath: "/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/meta-1ca84fbcd21cf4ba2965d4581c6b2e4ccbeba496-1688x948.png" -heroImagePath: "/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/hero-501535574f7a2c835073bf096890b78dd3ee3490-844x474.svg" +metaImagePath: "/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/meta-1ca84fbcd21cf4ba2965d4581c6b2e4ccbeba496-1688x948.png" +heroImagePath: "/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/hero-501535574f7a2c835073bf096890b78dd3ee3490-844x474.svg" +tags: + - "usersuccessstory" excerpt: | [Solin](https://www.solin.stream/), a leading fitness marketplace for creators, has improved its platform by integrating [Prisma Accelerate](https://www.prisma.io/data-platform/accelerate). This story highlights how Prisma Accelerate has contributed to Solin's success by enhancing performance and reliability with its scalable connection pool and global database cache. --- @@ -18,7 +20,7 @@ In the rapidly evolving fitness industry, staying ahead of the curve requires no This story highlights how Prisma Accelerate has contributed to Solin's platform, enhancing performance and reliability, and why other businesses might benefit from this tool. -![](/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/c808dbbce252a0914d4b1f13c09de462e9d077a1-2688x2050.png) +![](/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/c808dbbce252a0914d4b1f13c09de462e9d077a1-2688x2050.png) [Solin](https://www.solin.stream/) connects fitness creators with consumers, offering a marketplace where creators can sell various fitness-related products and services, such as workout programs, challenges, and cookbooks. Consumers gain access to these offerings along with community features and transformation tracking, fostering a more interactive and hands-on digital fitness experience. @@ -30,13 +32,13 @@ They leverage Remix’ server-side capabilities and implement the entire API lay Their PostgreSQL database is hosted on Heroku. -![](/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/3057a791f5ec64f5eb6394e7b8c5193d8450a23e-2618x1237.png) +![](/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/3057a791f5ec64f5eb6394e7b8c5193d8450a23e-2618x1237.png) ## Serving 2.5M database queries per day with Accelerate’s connection pool When accessing a database from serverless functions, it’s easy to exhaust the database connection limit and run out of connections during traffic spikes. This leads to failed requests and frustrated users. -![](/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/542523ef4a619afc3ce8475550c08c8bbc6c8551-1850x678.png) +![](/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/542523ef4a619afc3ce8475550c08c8bbc6c8551-1850x678.png) For these situations, it’s crucial to add an external connection pool that can keep connections open and ensure their reuse. That’s why Solin decided to integrate Prisma Accelerate into their application stack! With its scalable connection pool and seamless integration with Prisma ORM, Prisma Accelerate is the perfect companion for building data-driven applications in a serverless environment. @@ -64,8 +66,8 @@ const myExpensiveQuery = await prisma.widget.findMany({ ``` Fast responses are not the only benefit of integrating a database cache! It also notably reduces load on the database server, freeing up resources for more complex queries. The reduced load on the database server also shrinks the monetary cost for running it. -![](/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/6eb1d966a877e30a33103ea5b451f09928de7ce1-2888x1110.png) -![](/blog/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/1abd3930cb6ad0701c2860ec6491495ea20858f4-2888x1110.png) +![](/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/6eb1d966a877e30a33103ea5b451f09928de7ce1-2888x1110.png) +![](/how-solin-uses-prisma-accelerate-to-serve-2-5m-database-queries-per/imgs/1abd3930cb6ad0701c2860ec6491495ea20858f4-2888x1110.png) Learn more about the benefits of caching in our recent article: [S](https://www.prisma.io/blog/saving-black-friday-with-connection-pooling)[peed and Savings: Caching Database Queries with Prisma Accelerate](https://www.prisma.io/blog/caching-database-queries-with-prisma-accelerate). diff --git a/apps/blog/content/blog/how-to-build-a-real-time-chat-with-graphql-subscriptions-and-apollo-d4004369b0d4/index.mdx b/apps/blog/content/blog/how-to-build-a-real-time-chat-with-graphql-subscriptions-and-apollo-d4004369b0d4/index.mdx index f2c53ad59d..66977a7084 100644 --- a/apps/blog/content/blog/how-to-build-a-real-time-chat-with-graphql-subscriptions-and-apollo-d4004369b0d4/index.mdx +++ b/apps/blog/content/blog/how-to-build-a-real-time-chat-with-graphql-subscriptions-and-apollo-d4004369b0d4/index.mdx @@ -5,8 +5,8 @@ date: "2017-03-17" authors: - "Nikolas Burk" metaTitle: "Building a Real-Time Chat with GraphQL Subscriptions and Apollo" -metaImagePath: "/blog/how-to-build-a-real-time-chat-with-graphql-subscriptions-and-apollo-d4004369b0d4/imgs/hero-c189aafe68785bbb4ff4f8c3e303c7f1ced92ea9-720x385.png" -heroImagePath: "/blog/how-to-build-a-real-time-chat-with-graphql-subscriptions-and-apollo-d4004369b0d4/imgs/hero-c189aafe68785bbb4ff4f8c3e303c7f1ced92ea9-720x385.png" +metaImagePath: "/how-to-build-a-real-time-chat-with-graphql-subscriptions-and-apollo-d4004369b0d4/imgs/hero-c189aafe68785bbb4ff4f8c3e303c7f1ced92ea9-720x385.png" +heroImagePath: "/how-to-build-a-real-time-chat-with-graphql-subscriptions-and-apollo-d4004369b0d4/imgs/hero-c189aafe68785bbb4ff4f8c3e303c7f1ced92ea9-720x385.png" heroImageAlt: "How to build a Real-Time Chat with GraphQL Subscriptions and Apollo" excerpt: | In this tutorial, we explain how to build a chat application where the users can see their own and the locations of diff --git a/apps/blog/content/blog/how-to-improve-startup-times-kdrb9mjpev/index.mdx b/apps/blog/content/blog/how-to-improve-startup-times-kdrb9mjpev/index.mdx index 46a8e5c717..294d4beadf 100644 --- a/apps/blog/content/blog/how-to-improve-startup-times-kdrb9mjpev/index.mdx +++ b/apps/blog/content/blog/how-to-improve-startup-times-kdrb9mjpev/index.mdx @@ -6,9 +6,12 @@ authors: - "Sabin Adams" metaTitle: "Best Practices To Speed Up Your Serverless Applications" metaDescription: "Learn about some best practices to speed up your serverless applications using Prisma." -metaImagePath: "/blog/how-to-improve-startup-times-kdrb9mjpev/imgs/meta-76ae590ec7affe2930cc868334e99844d136473b-1266x711.png" -heroImagePath: "/blog/how-to-improve-startup-times-kdrb9mjpev/imgs/hero-e09fcabd4fa41b7b452a43664dea361d78f10e82-844x474.svg" +metaImagePath: "/how-to-improve-startup-times-kdrb9mjpev/imgs/meta-76ae590ec7affe2930cc868334e99844d136473b-1266x711.png" +heroImagePath: "/how-to-improve-startup-times-kdrb9mjpev/imgs/hero-e09fcabd4fa41b7b452a43664dea361d78f10e82-844x474.svg" heroImageAlt: "Best Practices To Speed Up Your Serverless Applications" +tags: + - "serverless" + - "education" excerpt: | Fast performance of an app is crucial for delivering a great user experience! In this article, we'll look at the pitfalls and best practices for optimizing cold starts and handler performance in _serverless_ applications. @@ -58,7 +61,7 @@ Any time you host an application or function that needs access to a traditional Your goal is to keep that time and latency to an absolute minimum. The best way to do this at the moment is to ensure your application or function is deployed in the _same_ geographical region as your database server. -![](/blog/how-to-improve-startup-times-kdrb9mjpev/imgs/db-near-server.png) +![](/how-to-improve-startup-times-kdrb9mjpev/imgs/db-near-server.png) The shorter the distance your request has to travel to reach the database server, the faster that connection will be established. This is a very important thing to keep in mind when deploying serverless applications, as the negative impact that results from _not_ doing this can be significant. @@ -71,11 +74,11 @@ Not doing so can affect the time it takes to: All those factors are activated during a cold start, and hence contribute to the impact using a database with Prisma can have on your application's cold start. When researching the impact this has on a cold start we, embarrasingly, noticed that we had done the first few runs of our tests with a serverless function at AWS Lambda in `eu-central-1`, and a RDS PostgreSQL instance hosted in `us-east-1`. We quickly fixed that, and the "after" measurement clearly shows the _tremendous_ impact this can have on your database latency, both for the creation of the connection, but also for any query that is executed: -![](/blog/how-to-improve-startup-times-kdrb9mjpev/imgs/after-json.png) +![](/how-to-improve-startup-times-kdrb9mjpev/imgs/after-json.png) *Before* -![](/blog/how-to-improve-startup-times-kdrb9mjpev/imgs/after-same-region.png) +![](/how-to-improve-startup-times-kdrb9mjpev/imgs/after-same-region.png) *After* diff --git a/apps/blog/content/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/index.mdx b/apps/blog/content/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/index.mdx index 966fb7c8ba..956479f79f 100644 --- a/apps/blog/content/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/index.mdx +++ b/apps/blog/content/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/index.mdx @@ -5,8 +5,8 @@ date: "2017-03-27" authors: - "Nikolas Burk" metaTitle: "Using `create-react-app` with GraphQL & Apollo | Prisma" -metaImagePath: "/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/hero-d817c94b8e0c665d3296db3d2983002133e7a548-900x619.png" -heroImagePath: "/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/hero-d817c94b8e0c665d3296db3d2983002133e7a548-900x619.png" +metaImagePath: "/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/hero-d817c94b8e0c665d3296db3d2983002133e7a548-900x619.png" +heroImagePath: "/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/hero-d817c94b8e0c665d3296db3d2983002133e7a548-900x619.png" heroImageAlt: "GraphQL & Apollo" excerpt: | The easiest way to get started with React apps that are using a GraphQL backend is with create-react-app and Apollo. @@ -61,7 +61,7 @@ create-react-app react-apollo-instagram-example cd react-apollo-instagram-example npm start # open http://localhost:3000 ``` -![This is what you should see when opening [localhost:3000](http://localhost:3000)](/blog/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/0*MZcp4O86JEoMbtpi.png)_This is what you should see when opening [localhost:3000](http://localhost:3000)_ +![This is what you should see when opening [localhost:3000](http://localhost:3000)](/how-to-use-create-react-app-with-graphql-apollo-62e574617cff/imgs/0*MZcp4O86JEoMbtpi.png)_This is what you should see when opening [localhost:3000](http://localhost:3000)_ Hot-reloading and linting is included as well, the terminal window keeps us updated about errors and linter problems. diff --git a/apps/blog/content/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/index.mdx b/apps/blog/content/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/index.mdx index 50212fd81b..b9fb721e15 100644 --- a/apps/blog/content/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/index.mdx +++ b/apps/blog/content/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/index.mdx @@ -5,8 +5,8 @@ date: "2018-02-22" authors: - "Nikolas Burk" metaTitle: "Wrap a REST API with GraphQL - A 3-step tutorial | Prisma" -metaImagePath: "/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/hero-bf82758030919645523931bf645440e96386e06f-720x385.png" -heroImagePath: "/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/hero-bf82758030919645523931bf645440e96386e06f-720x385.png" +metaImagePath: "/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/hero-bf82758030919645523931bf645440e96386e06f-720x385.png" +heroImagePath: "/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/hero-bf82758030919645523931bf645440e96386e06f-720x385.png" heroImageAlt: "How to wrap a REST API with GraphQL - A 3-step tutorial" excerpt: | REST APIs have been the standard for building web APIs for the past decade. In 2015, Facebook introduced a new and @@ -409,19 +409,19 @@ server.start(() => console.log(`Server is running on http://localhost:4000`)) ``` If you want to follow along, you can copy the code from the above `index.js` and `schema.graphql` snippets into corresponding files inside a `src` directory in a Node project, add `graphql-yoga` as a dependency and then run `node src/index.js`. If you do so and then open your browser at [http://localhost:4000](http://localhost:4000), you’ll see the following [GraphQL Playground](https://github.com/graphcool/graphql-playground): -![](/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*sGvSvA1yKloKDpXNb3jfBw.png) +![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*sGvSvA1yKloKDpXNb3jfBw.png) A GraphQL Playground is a GraphQL IDE that let’s you explore the capabilities of a GraphQL API in an interactive manner. Similar to [Postman](https://www.getpostman.com/), but with many additional GraphQL-specific features. In there, you can now send the queries we saw above. The query will be resolved by the GraphQL engine of the `GraphQLServer`. All it needs to do is invoking the resolvers for the fields in the query and thus calling out to the appropriate REST endpoints. This is the `user(id: ID)` query for example: -![](/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*m5LM8FgXa0VEMz-KwMyd3Q.png) +![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*m5LM8FgXa0VEMz-KwMyd3Q.png) Awesome! You can now add fields of the `User` type to the query as you like. However, when also asking for the related `Post` items of a user, you’ll be disappointed that you’re getting an error: -![](/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*UF5m7oNBcs1LKPboj7GQ8A.png) +![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*UF5m7oNBcs1LKPboj7GQ8A.png) So, something doesn’t quite work yet! Let’s take a look at the resolver implementation for the `user(id: ID)` field again: @@ -456,7 +456,7 @@ const resolvers = { ``` The implementation of the resolver is bug free and you can nest your queries as you wish. Pleasing! -![](/blog/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*0mbKo-p6qfrBKgAaJb0gOQ.png) +![](/how-to-wrap-a-rest-api-with-graphql-8bf3fb17547d/imgs/1*0mbKo-p6qfrBKgAaJb0gOQ.png) > Explaining the underlying mechanics of why these additional resolvers fix the bug from before are beyond the scope of this article. If you’re curios, check out the following article: [Demystifying the info Argument in GraphQL Resolvers](https://www.prisma.io/blog/graphql-server-basics-demystifying-the-info-argument-in-graphql-resolvers-6f26249f613a) diff --git a/apps/blog/content/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/index.mdx b/apps/blog/content/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/index.mdx index fb0580de47..31a4fe87a2 100644 --- a/apps/blog/content/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/index.mdx +++ b/apps/blog/content/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/index.mdx @@ -6,8 +6,8 @@ authors: - "Søren Bramer Schmidt" - "Johannes Schickling" metaTitle: "How to Improve Performance with Apollo Query Batching | Prisma" -metaImagePath: "/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/hero-f2e13f2e7910c8249ff5843c46423850eac4455d-1080x231.png" -heroImagePath: "/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/hero-f2e13f2e7910c8249ff5843c46423850eac4455d-1080x231.png" +metaImagePath: "/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/hero-f2e13f2e7910c8249ff5843c46423850eac4455d-1080x231.png" +heroImagePath: "/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/hero-f2e13f2e7910c8249ff5843c46423850eac4455d-1080x231.png" heroImageAlt: "Improving Performance with Apollo Query Batching" excerpt: | Learn about transport-level query batching, an advanced Apollo feature that enables you to significantly improve @@ -24,7 +24,7 @@ In this article we will dive into transport-level query batching, an advanced Ap We will use an extended version of the [Learn Apollo](https://learnapollo.com/) Pokedex app to explore the performance gains query batching can provide. The original Pokedex app lists all Pokemon for a single trainer. We make the app multi-tenant by rendering the Pokedex component for each trainer. This is how the app looks like with 6 trainers -![](/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*eqlu9eJJgj8vIqck.png) +![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*eqlu9eJJgj8vIqck.png) To really stress test Apollo, we’ll load each trainer twice! @@ -32,13 +32,13 @@ To really stress test Apollo, we’ll load each trainer twice! Chrome DevTools has a very detailed network traffic inspection feature. If you are serious about app performance take a look at the [documentation](https://developers.google.com/web/tools/chrome-devtools/network-performance/resource-loading?utm_source=dcc&utm_medium=redirect&utm_campaign=2016q3). When you load the extended pokedex and filter for requests to the GraphQL backend it looks like this -![](/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*-h6XwUanLrNSYjJk.png) +![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*-h6XwUanLrNSYjJk.png) The first thing you notice is that Apollo is generating 12 requests. This makes sense as we are rendering 12 Pokedex components. Each request takes around 100 ms and the first 6 requests completes within 126 ms. But now something interesting happens. The following 6 requests are stalled for up to 126 ms while the first requests complete. All browsers have a limit on [concurrent connections](http://www.browserscope.org/?category=network). For Chrome the limit is currently 6 concurrent requests to the same hostname, so 7 requests will take roughly double the amount of time to complete as 6 requests. This is where Apollos Query Batching comes into play. If Query Batching is enabled, Apollo will not issue requests immediately. Instead it will wait for up to 10 ms to see if more requests come in from other components. After the 10 ms, Apollo will issue 1 request containing all the queries. This eliminates the issue with stalled connections and delivers significantly better performance -![](/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*mv6z4N7_OSza7_2h.png) +![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*mv6z4N7_OSza7_2h.png) The performance of this combined query is almost as good as a single query from the first test. @@ -174,7 +174,7 @@ batched response: Enabling Query Batching already provided a significant boost to performance. Can we do even better? Remember how the BatchingNetworkInterface queues up all requests for a predetermined amount of time before sending them all in one batch. Query deduplication takes this a step further by inspecting all queries in the batch to find and remove duplicates. Let's see how this affects our performance: -![](/blog/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*5vAu8GPtx3kpYcX9.png) +![](/improving-performance-with-apollo-query-batching-66455ea9d8b/imgs/0*5vAu8GPtx3kpYcX9.png) As you can see the request size is slightly smaller and the request is now just as fast as a single unbatched request. diff --git a/apps/blog/content/blog/improving-prismas-release-process-yaey8deiwaex/index.mdx b/apps/blog/content/blog/improving-prismas-release-process-yaey8deiwaex/index.mdx index 41e04ec023..e403236cb6 100644 --- a/apps/blog/content/blog/improving-prismas-release-process-yaey8deiwaex/index.mdx +++ b/apps/blog/content/blog/improving-prismas-release-process-yaey8deiwaex/index.mdx @@ -5,8 +5,8 @@ date: "2018-05-29" authors: - "Nikolas Burk" metaTitle: "Improving the Release Process | Prisma" -metaImagePath: "/blog/improving-prismas-release-process-yaey8deiwaex/imgs/hero-d8dabd6ac06854c11615741cb43bbae8569cdd4e-1200x630.png" -heroImagePath: "/blog/improving-prismas-release-process-yaey8deiwaex/imgs/hero-d8dabd6ac06854c11615741cb43bbae8569cdd4e-1200x630.png" +metaImagePath: "/improving-prismas-release-process-yaey8deiwaex/imgs/hero-d8dabd6ac06854c11615741cb43bbae8569cdd4e-1200x630.png" +heroImagePath: "/improving-prismas-release-process-yaey8deiwaex/imgs/hero-d8dabd6ac06854c11615741cb43bbae8569cdd4e-1200x630.png" heroImageAlt: "New Release Process for Prisma" excerpt: | We're introducing an improved release process with a dedicated beta period to ensure high quality while shipping new @@ -42,7 +42,7 @@ We recommend that you run the _stable_ channel on your production servers. Relea A new feature in Prisma starts its life as a feature request on Github. This chart describes the stages a feature goes through before being included in a stable release: -![Breakdown of release cycle](/blog/improving-prismas-release-process-yaey8deiwaex/imgs/TvlsOeC.png) +![Breakdown of release cycle](/improving-prismas-release-process-yaey8deiwaex/imgs/TvlsOeC.png) ### 1. Planning @@ -66,7 +66,7 @@ At the end of the beta period, the latest beta release is promoted unchanged to The following diagram illustrates how feature development and beta period of consecutive release cycles overlap: -![Breakdown of the Prisma release cycle](/blog/improving-prismas-release-process-yaey8deiwaex/imgs/hL3C79O.png) +![Breakdown of the Prisma release cycle](/improving-prismas-release-process-yaey8deiwaex/imgs/hL3C79O.png) ## Planning for the future: Prisma's Roadmap diff --git a/apps/blog/content/blog/improving-query-performance-using-indexes-1-zulnzwbkul/index.mdx b/apps/blog/content/blog/improving-query-performance-using-indexes-1-zulnzwbkul/index.mdx index deb1a140ca..21503fd775 100644 --- a/apps/blog/content/blog/improving-query-performance-using-indexes-1-zulnzwbkul/index.mdx +++ b/apps/blog/content/blog/improving-query-performance-using-indexes-1-zulnzwbkul/index.mdx @@ -6,13 +6,14 @@ authors: - "Alex Ruheni" metaTitle: "Improving query performance with database indexes using Prisma: Introduction" metaDescription: "Learn the fundamentals of database indexes: what they are, the problem they solve, and their benefit and cost" -metaImagePath: "/blog/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/meta-c92a4afeb9d9b1df6f8104fced300d5e49233bd0-1269x714.png" -heroImagePath: "/blog/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/hero-1c62649f62f41f22d8a54c882cd24da906c51479-844x474.svg" +metaImagePath: "/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/meta-c92a4afeb9d9b1df6f8104fced300d5e49233bd0-1269x714.png" +heroImagePath: "/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/hero-1c62649f62f41f22d8a54c882cd24da906c51479-844x474.svg" heroImageAlt: "Improving Query Performance with Indexes using Prisma: Introduction" series: title: "Improving query performance with indexes using Prisma" - slug: "improving-query-performance-using-indexes-2gozGfdxjevI" seriesIndex: 1 +tags: + - "education" excerpt: | One strategy for improving the performance of your database queries is using _indexes_. This article covers the fundamentals of database indexes: what they are, how they work, and their cost and benefits. @@ -46,19 +47,19 @@ You may naively organize the books into one big shelf alphabetically according t This is similar to [_partitioning_](https://docs.gitlab.com/ee/development/database/table_partitioning.html) a table in a database. A table is split into smaller chunks by a _partition key_ which is included in a query. A partition key is the column used to split the table. The database narrows down the data to be queried using the partition key. -![Table Partitioning](/blog/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/table-partitioning.png) +![Table Partitioning](/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/table-partitioning.png) ### More people searching leads to faster searches (query parallelization) Another strategy for faster book retrieval would be to ask more people to join your search and distribute their work in a structured way. Some databases support a similar pattern where the database server can assign more compute or CPU cores to execute a query. This is known as [_parallel query execution_](https://www.postgresql.org/docs/current/parallel-query.html). -![Parallelized database query](/blog/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/query-parallelization.png) +![Parallelized database query](/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/query-parallelization.png) ### Using a catalog to store book metadata for faster retrieval (indexes) Another pattern you could use to retrieve a book is using a catalog. The catalog is an external, organized structure separate from the existing shelves containing the _metadata_ of the books in the library. The metadata contains information such as titles, authors, subjects, publication dates, and the book's location. Databases provide similar structures called indexes. -![Database index](/blog/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/index.png) +![Database index](/improving-query-performance-using-indexes-1-zulnzwbkul/imgs/index.png) ### Conclusion: You can speed up search time by reducing search scope diff --git a/apps/blog/content/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/index.mdx b/apps/blog/content/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/index.mdx index f700ba17d3..5f9387bc76 100644 --- a/apps/blog/content/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/index.mdx +++ b/apps/blog/content/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/index.mdx @@ -6,13 +6,14 @@ authors: - "Alex Ruheni" metaTitle: "Improving query performance with database indexes using Prisma: B-tree indexes" metaDescription: "Learn how you can optimize a slow database query in your application with a B-Tree index using Prisma" -metaImagePath: "/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/meta-f47ff182b4ce89e7dd52fb5ba19e0850dd24a8fa-1692x952.png" -heroImagePath: "/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/hero-21765b1aeb13badff0117580a169a45609788d7e-844x474.svg" +metaImagePath: "/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/meta-f47ff182b4ce89e7dd52fb5ba19e0850dd24a8fa-1692x952.png" +heroImagePath: "/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/hero-21765b1aeb13badff0117580a169a45609788d7e-844x474.svg" heroImageAlt: "Improving Query Performance with Indexes using Prisma: B-Tree Index" series: title: "Improving query performance with indexes using Prisma" - slug: "improving-query-performance-using-indexes-2gozGfdxjevI" seriesIndex: 2 +tags: + - "education" excerpt: | One strategy for improving performance for your database queries is using indexes. This article will dive a deeper into B-Tree indexes: taking a look at the data structure used and improve the performance of an existing query with an index using Prisma. @@ -48,7 +49,7 @@ Database indexes are smaller secondary data structure used by the database to st - **key**: the column(s) that will be used to create an index - **value**: a pointer to the record in the specific table -![](/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/index.png) +![](/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/index.png) However, the data structures used to define an index are more sophisticated, making them as fast as they are. @@ -237,15 +238,15 @@ The cloned repository contains a `requests.http` file that contains sample reque Click the **Send Request** button right above the request to make the request. -![](/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184096935-1a680505-14fc-47ef-8862-126ef0d15708.png) +![](/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184096935-1a680505-14fc-47ef-8862-126ef0d15708.png) VS Code will open an editor tab on the right side of the window with the responses. -![](/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184096950-9fc9fa57-88b1-45d7-9b75-b49b8e4e8d70.png) +![](/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184096950-9fc9fa57-88b1-45d7-9b75-b49b8e4e8d70.png) You should also see information logged on the terminal. -![](/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184093478-92dea6ed-6486-46b8-b99e-62a0af29c01a.png) +![](/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184093478-92dea6ed-6486-46b8-b99e-62a0af29c01a.png) In the screenshot above, the query took 174ms to be executed. The sample data 174ms might not sound like much because the existing dataset is fairly small — roughly 31 MB. @@ -290,7 +291,7 @@ The data will first be cleared and then seeded with the new data. Next, make an API request in the `requests.http` file and watch logs to see the time taken query the database. In the screenshot below, the request took 504ms. -![](/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/188598587-7ff4c4c8-c91c-4ff0-b32c-c4ab5a45db97.png) +![](/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/188598587-7ff4c4c8-c91c-4ff0-b32c-c4ab5a45db97.png) @@ -333,7 +334,7 @@ CREATE INDEX `User_firstName_idx` ON `User`(`firstName`); Next, navigate to the `requests.http` file again and send the requests to `/users`. -![](/blog/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184093462-b8ec58e9-3540-4a60-9408-84e51a4f9f19.png) +![](/improving-query-performance-using-indexes-2-myoijnmftsfq/imgs/184093462-b8ec58e9-3540-4a60-9408-84e51a4f9f19.png) You will notice a significant improvement in response times. In my case, the response time was cut down to 8ms. diff --git a/apps/blog/content/blog/improving-query-performance-using-indexes-3-kduk351qv1/index.mdx b/apps/blog/content/blog/improving-query-performance-using-indexes-3-kduk351qv1/index.mdx index 5709acf6d9..bbff25f0ad 100644 --- a/apps/blog/content/blog/improving-query-performance-using-indexes-3-kduk351qv1/index.mdx +++ b/apps/blog/content/blog/improving-query-performance-using-indexes-3-kduk351qv1/index.mdx @@ -6,13 +6,14 @@ authors: - "Alex Ruheni" metaTitle: "Improving query performance with database indexes using Prisma: Hash indexes" metaDescription: "Learn how you can optimize a slow database query in your application with a Hash index using Prisma" -metaImagePath: "/blog/improving-query-performance-using-indexes-3-kduk351qv1/imgs/meta-a2babe32fc26290c3dee9a6d0cb09decc68fae6a-1269x714.png" -heroImagePath: "/blog/improving-query-performance-using-indexes-3-kduk351qv1/imgs/hero-f7add11b063d3376bf02a64092431ac5397e82ba-844x474.svg" +metaImagePath: "/improving-query-performance-using-indexes-3-kduk351qv1/imgs/meta-a2babe32fc26290c3dee9a6d0cb09decc68fae6a-1269x714.png" +heroImagePath: "/improving-query-performance-using-indexes-3-kduk351qv1/imgs/hero-f7add11b063d3376bf02a64092431ac5397e82ba-844x474.svg" heroImageAlt: "Improving Query Performance with Indexes using Prisma: Hash Indexes" series: title: "Improving query performance with indexes using Prisma" - slug: "improving-query-performance-using-indexes-2gozGfdxjevI" seriesIndex: 3 +tags: + - "education" excerpt: | One strategy for improving performance for your database queries is using indexes. This article will dive into hash indexes: taking a look at the data structure used and improve the performance of an existing query with an index using Prisma. @@ -46,7 +47,7 @@ Hash indexes use the [hash table](https://en.wikipedia.org/wiki/Hash_table) data PostgreSQL's hash index is composed of "buckets" or "slots" into which [tuples](https://en.wikipedia.org/wiki/Tuple) are placed. -![](/blog/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194055764-a7c4adfd-b649-4597-af10-1676b0159272.png) +![](/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194055764-a7c4adfd-b649-4597-af10-1676b0159272.png) PostgreSQL uses a _hash function_ to compute a _hash key_ or _hash code_ when storing a value to the index: - Hash key: maps the value to a 32-bit integer. @@ -58,7 +59,7 @@ PostgreSQL uses a _hash function_ to compute a _hash key_ or _hash code_ when st When retrieving a record using a hash index, the database applies the hash function to the value to determine the bucket that might contain the value. After determining the bucket, the database will search through the tuple to find the records that match your query. -![](/blog/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194057994-bdf3aeca-85f8-4b06-801a-63bac39621be.png) +![](/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194057994-bdf3aeca-85f8-4b06-801a-63bac39621be.png) If you're interested in reading about PostgreSQL's implementation of the hash index, you can read further [here](https://github.com/postgres/postgres/blob/master/src/backend/access/hash/README). @@ -231,11 +232,11 @@ The cloned repository contains a `requests.http` file that contains sample reque ``` Click the **Send Request** button right above the request to make the request. -![](/blog/improving-query-performance-using-indexes-3-kduk351qv1/imgs/184096935-1a680505-14fc-47ef-8862-126ef0d15708.png) +![](/improving-query-performance-using-indexes-3-kduk351qv1/imgs/184096935-1a680505-14fc-47ef-8862-126ef0d15708.png) VS Code will open an editor tab on the right side of the window with the responses. You should also see some information logged on the terminal. -![](/blog/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194079327-6dab2f11-a528-45f6-99f9-13db3a84cb0d.png) +![](/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194079327-6dab2f11-a528-45f6-99f9-13db3a84cb0d.png) In the screenshot above, the query took 55 ms. ### Improve query performance with a hash index @@ -277,7 +278,7 @@ Next, navigate to the `requests.http` file again and resend the requests to the You will notice an improvement in response times. In my case, in the screenshot below, the response times have been down to about 9 to 11ms. -![](/blog/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194080275-c4bd1059-595b-40b0-b2d9-b05339dac8cc.png) +![](/improving-query-performance-using-indexes-3-kduk351qv1/imgs/194080275-c4bd1059-595b-40b0-b2d9-b05339dac8cc.png) Congratulations! 🎉 diff --git a/apps/blog/content/blog/introducing-auto-scaling-for-prisma-accelerate/index.mdx b/apps/blog/content/blog/introducing-auto-scaling-for-prisma-accelerate/index.mdx index c6bf4e778c..d476171eee 100644 --- a/apps/blog/content/blog/introducing-auto-scaling-for-prisma-accelerate/index.mdx +++ b/apps/blog/content/blog/introducing-auto-scaling-for-prisma-accelerate/index.mdx @@ -6,9 +6,12 @@ authors: - "Luan van der Westhuizen" metaTitle: "Enhance your database connections with Prisma Accelerate's auto-scaling" metaDescription: "Prisma Accelerate’s new auto-scaling feature improves connection pooling, ensuring efficient and scalable database management." -metaImagePath: "/blog/introducing-auto-scaling-for-prisma-accelerate/imgs/meta-10e47c310be4f5f4dadcdf9d7c80a79bffdbd80a-1266x711.png" -heroImagePath: "/blog/introducing-auto-scaling-for-prisma-accelerate/imgs/hero-6643cd3fa55e6b2554f2256149a7ea9e62df3258-844x474.svg" +metaImagePath: "/introducing-auto-scaling-for-prisma-accelerate/imgs/meta-10e47c310be4f5f4dadcdf9d7c80a79bffdbd80a-1266x711.png" +heroImagePath: "/introducing-auto-scaling-for-prisma-accelerate/imgs/hero-6643cd3fa55e6b2554f2256149a7ea9e62df3258-844x474.svg" heroImageAlt: "Connection pooling using multiple instances of accelerate's connection poolers " +tags: + - "data-platform" + - "newrelease-feature" excerpt: | Since its initial release, [Prisma Accelerate](https://pris.ly/as-accelerate) has served close to 10 billion queries already! And it continues to get better: With the addition of auto-scaling, Prisma Accelerate is even better at helping applications scale and removing concerns about database connection bottlenecks. --- @@ -31,7 +34,7 @@ When your application interacts with a database, it typically follows these step This process repeats for *every single database interaction*. Opening and closing database connections is notoriously slow and resource-intensive because it requires authentication, [3-way-handshake](https://developer.mozilla.org/en-US/docs/Glossary/TCP_handshake) and allocation of resources like memory and CPU. -![Requests to the database from around the globe](/blog/introducing-auto-scaling-for-prisma-accelerate/imgs/4ffc6b8ef9456acfad56fa8a3f77bb148989afd3-1984x1132.png) +![Requests to the database from around the globe](/introducing-auto-scaling-for-prisma-accelerate/imgs/4ffc6b8ef9456acfad56fa8a3f77bb148989afd3-1984x1132.png) This challenge is exacerbated in modern serverless and edge computing environments. In these scenarios, each individual function invocation attempts to establish a new database connection. @@ -66,7 +69,7 @@ Since its launch last year, Prisma Accelerate has proven its production readines 3. If more resources are needed to handle your application's traffic, additional resources will be allocated up to the connection limit you set. 4. As traffic decreases, any additional resources will be removed. -![Autoscaling Accelerate's connection pooling nodes](/blog/introducing-auto-scaling-for-prisma-accelerate/imgs/a8231f899a60321d89f75d825fa405c6422a6e17-1820x846.png) +![Autoscaling Accelerate's connection pooling nodes](/introducing-auto-scaling-for-prisma-accelerate/imgs/a8231f899a60321d89f75d825fa405c6422a6e17-1820x846.png) Scaling occurs horizontally by provisioning more connection pool instances as your load increases and your volume grows. This not only helps with spiky, unpredictable workloads but with growing applications meaning we can manage your volume at scale. @@ -74,7 +77,7 @@ Scaling occurs horizontally by provisioning more connection pool instances as yo In Prisma Accelerate, you can set the connection limit via the connection pool size drop down in the Connection Pool section found when enabling or updating the configuration for an existing Accelerate enabled environment: -![Configuring Accelerate connection pool size in Platform Console](/blog/introducing-auto-scaling-for-prisma-accelerate/imgs/76efc2865f37348c9f7647ad34e773239eb34c12-3094x978.png) +![Configuring Accelerate connection pool size in Platform Console](/introducing-auto-scaling-for-prisma-accelerate/imgs/76efc2865f37348c9f7647ad34e773239eb34c12-3094x978.png) Visit the documentation to [learn more about configuring the connection pool size for Accelerate](https://www.prisma.io/docs/accelerate/connection-pooling#configuring-the-connection-pool-size). diff --git a/apps/blog/content/blog/introducing-global-omit-for-model-fields-in-prisma-orm-5-16-0/index.mdx b/apps/blog/content/blog/introducing-global-omit-for-model-fields-in-prisma-orm-5-16-0/index.mdx index 8696c1b005..39d3a87884 100644 --- a/apps/blog/content/blog/introducing-global-omit-for-model-fields-in-prisma-orm-5-16-0/index.mdx +++ b/apps/blog/content/blog/introducing-global-omit-for-model-fields-in-prisma-orm-5-16-0/index.mdx @@ -6,8 +6,8 @@ authors: - "Jon Harrell" metaTitle: "Prisma ORM 5.16.0 allows global or local omitted fields in Prisma Client" metaDescription: "Prisma ORM v5.16.0 allows you to omit fields globally or per-query. This blog post overviews the change and how to omit fields in your Prisma Client queries." -metaImagePath: "/blog/introducing-global-omit-for-model-fields-in-prisma-orm-5-16-0/imgs/meta-1325214bfbabc8d99d4e2c312dcd142ad5a550d9-1200x630.png" -heroImagePath: "/blog/introducing-global-omit-for-model-fields-in-prisma-orm-5-16-0/imgs/hero-88b194703cf6aa9c1e4010c7769d1ed078fce438-844x474.svg" +metaImagePath: "/introducing-global-omit-for-model-fields-in-prisma-orm-5-16-0/imgs/meta-1325214bfbabc8d99d4e2c312dcd142ad5a550d9-1200x630.png" +heroImagePath: "/introducing-global-omit-for-model-fields-in-prisma-orm-5-16-0/imgs/hero-88b194703cf6aa9c1e4010c7769d1ed078fce438-844x474.svg" heroImageAlt: "An image describing a new feature with Prisma ORM version 5.16.0. It shows a User model with a password field that is omitted. Text reads \"globally or locally omit fields returned by Prisma Client queries\"" excerpt: | Discover the powerful new feature in Prisma ORM 5.16.0 that lets you globally or locally omit specific fields from your queries. Whether you need to ensure sensitive information (like a password) is never exposed or you want to streamline data retrieval for a single query, Prisma ORM has you covered. In this blog post, learn how to enhance your data management with code examples and guidance. diff --git a/apps/blog/content/blog/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/index.mdx b/apps/blog/content/blog/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/index.mdx index ad7b96312c..de41ae34da 100644 --- a/apps/blog/content/blog/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/index.mdx +++ b/apps/blog/content/blog/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/index.mdx @@ -5,12 +5,11 @@ date: "2019-02-07" authors: - "Tim Griesser" metaTitle: "GraphQL Nexus: Code-First GraphQL Server Development | Prisma" -metaImagePath: "/blog/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/hero-5fcd43415f21b9a4fc240fa2c5869f6b6fe2abe0-1200x630.png" -heroImagePath: "/blog/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/hero-5fcd43415f21b9a4fc240fa2c5869f6b6fe2abe0-1200x630.png" +metaImagePath: "/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/hero-5fcd43415f21b9a4fc240fa2c5869f6b6fe2abe0-1200x630.png" +heroImagePath: "/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/hero-5fcd43415f21b9a4fc240fa2c5869f6b6fe2abe0-1200x630.png" heroImageAlt: "Introducing GraphQL Nexus" series: title: "What is Nexus and how to use it to build GraphQL servers?" - slug: "what-is-nexus-wsobadcm7oju" seriesIndex: 2 excerpt: | In our last post, we outlined the issues with SDL-first GraphQL server development. This week, we're excited to @@ -45,7 +44,7 @@ With Nexus, the GraphQL schema is defined and implemented programmatically. It t GraphQL Nexus was designed with TypeScript/JavaScript intellisense in mind. It combines TypeScript generics, conditional types, and type merging to provide full auto-generated type coverage. A core design goal of Nexus is to have the best possible type coverage with the least possible manual type annotation. -![Type-safe, compatible with GraphQL ecosystem & data-agnostic](/blog/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/KMUm6rd.png) +![Type-safe, compatible with GraphQL ecosystem & data-agnostic](/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/KMUm6rd.png) Nexus builds upon the primitives of `graphql-js` which makes it largely compatible with the current GraphQL ecosystem. @@ -319,7 +318,7 @@ server.start(() => `Server is running on http://localhost:4000`) The [SDL converter](https://nexusjs.org/converter) lets you provide an SDL schema definition and outputs the corresponding Nexus code (without any resolvers): -![SDL converter](/blog/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/AbkFWNO.png) +![SDL converter](/introducing-graphql-nexus-code-first-graphql-server-development-ll6s1yy5cxl5/imgs/AbkFWNO.png) --- diff --git a/apps/blog/content/blog/introducing-instant-app-deployments-in-partnership-with-vercel/index.mdx b/apps/blog/content/blog/introducing-instant-app-deployments-in-partnership-with-vercel/index.mdx index 2681b402f8..3a31c3efb6 100644 --- a/apps/blog/content/blog/introducing-instant-app-deployments-in-partnership-with-vercel/index.mdx +++ b/apps/blog/content/blog/introducing-instant-app-deployments-in-partnership-with-vercel/index.mdx @@ -6,8 +6,8 @@ authors: - "Nitin Gupta" metaTitle: "Introducing Instant App Deployments in Partnership with Vercel" metaDescription: "Instant App Deployment with Prisma Postgres and Vercel makes going from generated code to production effortless. Provision a Postgres database, deploy globally, and let users claim full ownership with a single API call. Perfect for AI coding platforms, no-code tools, and modern app builders." -metaImagePath: "/blog/introducing-instant-app-deployments-in-partnership-with-vercel/imgs/meta-361d392f23fa013b8ba4f778b7727c0807fc1aca-1266x711.png" -heroImagePath: "/blog/introducing-instant-app-deployments-in-partnership-with-vercel/imgs/hero-38b924b5e2a902a17211a9d7a9493153361dbc43-844x474.svg" +metaImagePath: "/introducing-instant-app-deployments-in-partnership-with-vercel/imgs/meta-361d392f23fa013b8ba4f778b7727c0807fc1aca-1266x711.png" +heroImagePath: "/introducing-instant-app-deployments-in-partnership-with-vercel/imgs/hero-38b924b5e2a902a17211a9d7a9493153361dbc43-844x474.svg" heroImageAlt: "Promotional graphic with the text “Instant app deployments for AI” and “Vercel + Prisma.” The design shows UI elements like a chat box with “Build and deploy anything…,” a send button, generating text, and icons representing databases and deployment." excerpt: | AI coding platforms let anyone create software from a prompt, but turning generated code into a deployed app is still a hard problem. Announcing **Instant App Deployment**, a new API built on [Prisma Postgres](https://prisma.io/postgres) and [Vercel](https://vercel.com), that solves this problem. diff --git a/apps/blog/content/blog/introducing-platform-environments/index.mdx b/apps/blog/content/blog/introducing-platform-environments/index.mdx index 99bbda027b..728f0bcd86 100644 --- a/apps/blog/content/blog/introducing-platform-environments/index.mdx +++ b/apps/blog/content/blog/introducing-platform-environments/index.mdx @@ -6,9 +6,12 @@ authors: - "Ankur Datta" metaTitle: "Introducing Platform Environments" metaDescription: "Introducing Platform Environments & Early Access Prisma Data Platform integration to Prisma CLI." -metaImagePath: "/blog/introducing-platform-environments/imgs/meta-5c40baf506e9ff75d2718b0a9f9906de8b417457-1800x945.png" -heroImagePath: "/blog/introducing-platform-environments/imgs/hero-aa4a9432e7742d1f7b3468e632869ef802833652-870x480.svg" +metaImagePath: "/introducing-platform-environments/imgs/meta-5c40baf506e9ff75d2718b0a9f9906de8b417457-1800x945.png" +heroImagePath: "/introducing-platform-environments/imgs/hero-aa4a9432e7742d1f7b3468e632869ef802833652-870x480.svg" heroImageAlt: "Introducing Platform Environments" +tags: + - "data-platform" + - "newrelease-feature" excerpt: | 🎉 We're thrilled to introduce Platform Environments and a new Early Access feature that enables accessing the Prisma Data Platform from the Prisma CLI! --- @@ -19,7 +22,7 @@ Each Environment serves as an isolated space, enabling teams to build, test, and Ever thought how seamless your development could be with dedicated environments for your Prisma Data Platform projects? You're in good company! -![User requesting Environments](/blog/introducing-platform-environments/imgs/f9a5925752a6c2fc40919aa77c4c648bcba905d4-1200x305.png) +![User requesting Environments](/introducing-platform-environments/imgs/f9a5925752a6c2fc40919aa77c4c648bcba905d4-1200x305.png) At Prisma, we're constantly striving to make your development journey smoother and more efficient. That's why we're excited to introduce Platform Environments 🎉. @@ -27,11 +30,11 @@ At Prisma, we're constantly striving to make your development journey smoother a Before Environments: -![Before Environments](/blog/introducing-platform-environments/imgs/02e32d8486dc1aea98ab63bc49ca1d233e3186b7-1800x907.png) +![Before Environments](/introducing-platform-environments/imgs/02e32d8486dc1aea98ab63bc49ca1d233e3186b7-1800x907.png) With Platform Environments, you can now create multiple environments within a single project, making it easier to manage various stages of your development lifecycle: -![After Environments](/blog/introducing-platform-environments/imgs/9193bd9d3c0496e3e36f00bb6800dccf89f5d651-2155x907.png) +![After Environments](/introducing-platform-environments/imgs/9193bd9d3c0496e3e36f00bb6800dccf89f5d651-2155x907.png) This not only saves you time but also allows you to get more out of your existing projects. See the gains across all our plans: @@ -48,7 +51,7 @@ This not only saves you time but also allows you to get more out of your existin We're also excited to announce that the Prisma Data Platform is now accessible through the Prisma CLI, available in Early Access, offering programmatic access for streamlined management of platform resources and improved workflow efficiency. -![Prisma CLI x Prisma Data Platform](/blog/introducing-platform-environments/imgs/8678791c42ed1bcbe418c3d592f64756a2e9a2cb-1344x1029.png) +![Prisma CLI x Prisma Data Platform](/introducing-platform-environments/imgs/8678791c42ed1bcbe418c3d592f64756a2e9a2cb-1344x1029.png) You can leverage the Prisma CLI to manage your databases for Prisma Accelerate and [Prisma Postgres](https://www.prisma.io/postgres). e.g. This works really well with workflows using branch-based databases. @@ -57,7 +60,7 @@ Database branching lets you quickly create independent copies of your database Some popular database providers that allow you to add database branching in your workflows are [PlanetScale](https://planetscale.com/docs/concepts/branching), [Neon](https://neon.tech/docs/introduction/branching), and [Railway](https://docs.railway.app/guides/environments): -![Database branching](/blog/introducing-platform-environments/imgs/a804b1270d904b50d3dd60d10d1e3a6cb80d6ac6-2380x907.png) +![Database branching](/introducing-platform-environments/imgs/a804b1270d904b50d3dd60d10d1e3a6cb80d6ac6-2380x907.png) Now let’s look at a simple example below. @@ -87,7 +90,7 @@ npx prisma platform auth login --early-access A browser window should pop-up prompting you to log in or create an account. Once authenticated, you will be instructed to head back to the CLI: -![Login pop-up](/blog/introducing-platform-environments/imgs/8a292af17b608eb1a80eca022984869fe9a6d0a3-1920x1080.png) +![Login pop-up](/introducing-platform-environments/imgs/8a292af17b608eb1a80eca022984869fe9a6d0a3-1920x1080.png) You can also check your login status by running: diff --git a/apps/blog/content/blog/introducing-prisma-nuxt/index.mdx b/apps/blog/content/blog/introducing-prisma-nuxt/index.mdx index da7991d86f..c5764ce01a 100644 --- a/apps/blog/content/blog/introducing-prisma-nuxt/index.mdx +++ b/apps/blog/content/blog/introducing-prisma-nuxt/index.mdx @@ -6,9 +6,11 @@ authors: - "Ankur Datta" metaTitle: "Introducing Prisma Nuxt: Simplifying Data Management for Nuxt Apps" metaDescription: "Use Prisma ORM in your Nuxt.js app easily with the Prisma Nuxt module for type-safe queries and database management." -metaImagePath: "/blog/introducing-prisma-nuxt/imgs/meta-fa5d318365caa55c59c4977b9b552b45e68c19e5-1200x631.png" -heroImagePath: "/blog/introducing-prisma-nuxt/imgs/hero-c442fbbddd3bf0f1894047b3e87fad73d8c4c80c-870x480.png" +metaImagePath: "/introducing-prisma-nuxt/imgs/meta-fa5d318365caa55c59c4977b9b552b45e68c19e5-1200x631.png" +heroImagePath: "/introducing-prisma-nuxt/imgs/hero-c442fbbddd3bf0f1894047b3e87fad73d8c4c80c-870x480.png" heroImageAlt: "The logo of Nuxt and Prisma side-by-side" +tags: + - "orm" excerpt: | The Prisma Nuxt module is now available, offering a streamlined way to integrate Prisma ORM into Nuxt applications. This module extends Nuxt, a powerful framework for building full-stack Vue.js apps, with functionalities provided by Prisma ORM such as type-safe database interactions, automated migrations, and Prisma Studio for data management. --- @@ -61,11 +63,11 @@ Let’s create a new Nuxt app and add the `@prisma/nuxt` module. This module wil 6. Prompt you to start Prisma Studio 5. Open [localhost:3000](http://localhost:3000/) in your browser and follow terminal instructions to open Nuxt Devtools and Prisma Studio: - ![Prisma Studio integrated with the Nuxt devtools](/blog/introducing-prisma-nuxt/imgs/4b382494983173328bca87b9d927878808be769f-3456x2160.png) + ![Prisma Studio integrated with the Nuxt devtools](/introducing-prisma-nuxt/imgs/4b382494983173328bca87b9d927878808be769f-3456x2160.png) 6. Use Prisma Studio to add a user to the database: - ![Adding user data with Prisma Studio](/blog/introducing-prisma-nuxt/imgs/66431efa24a44146a3ca79463c0cf8a6764c9b18-3456x2160.png) + ![Adding user data with Prisma Studio](/introducing-prisma-nuxt/imgs/66431efa24a44146a3ca79463c0cf8a6764c9b18-3456x2160.png) We’ve seen how easy it is to start with Prisma ORM in Nuxt, thanks to the module. Now proceed to the next section to see how to query your data from within the app using the `usePrismaClient` composable. @@ -110,7 +112,7 @@ Now we’ll create a [server component](https://nuxt.com/docs/guide/directory-st 4. View the user details queried from the database in your browser: - ![User details being shown on a JSON format while Prisma Studio is still open](/blog/introducing-prisma-nuxt/imgs/42555908a437dac15e42224b3e7a1fbccfadd8d2-3456x2160.png) + ![User details being shown on a JSON format while Prisma Studio is still open](/introducing-prisma-nuxt/imgs/42555908a437dac15e42224b3e7a1fbccfadd8d2-3456x2160.png) And that’s how easily you can get started using Prisma ORM in your Nuxt app using the Nuxt Prisma module. diff --git a/apps/blog/content/blog/iopool-customer-success-story-ulscwvaqzxoa/index.mdx b/apps/blog/content/blog/iopool-customer-success-story-ulscwvaqzxoa/index.mdx index e53213dfc1..b08f5c6f05 100644 --- a/apps/blog/content/blog/iopool-customer-success-story-ulscwvaqzxoa/index.mdx +++ b/apps/blog/content/blog/iopool-customer-success-story-ulscwvaqzxoa/index.mdx @@ -6,9 +6,11 @@ authors: - "Ryan Chenkie" metaTitle: "How iopool became more productive with Prisma" metaDescription: "In 2020, iopool decided to rearchitect its app and use Prisma for their database needs. Doing so helped them move fast with confidence and has greatly simplified their development process." -metaImagePath: "/blog/iopool-customer-success-story-ulscwvaqzxoa/imgs/hero-97ed1e5446a02b6a9c6be975ada9fd1d26f31173-1692x852.png" -heroImagePath: "/blog/iopool-customer-success-story-ulscwvaqzxoa/imgs/hero-97ed1e5446a02b6a9c6be975ada9fd1d26f31173-1692x852.png" +metaImagePath: "/iopool-customer-success-story-ulscwvaqzxoa/imgs/hero-97ed1e5446a02b6a9c6be975ada9fd1d26f31173-1692x852.png" +heroImagePath: "/iopool-customer-success-story-ulscwvaqzxoa/imgs/hero-97ed1e5446a02b6a9c6be975ada9fd1d26f31173-1692x852.png" heroImageAlt: "How iopool refactored their app in less than 6 months with Prisma" +tags: + - "usersuccessstory" excerpt: | In 2020, iopool realized that their architecture was slowing them down and preventing them from innovating. They decided to switch to Lambda functions and a relational database powered by Prisma. Read on to learn how this has helped them move fast with confidence and has greatly simplified their development process. @@ -32,7 +34,7 @@ Luc didn't see version 1 of iopool as a failure. Rather, it showed their commitm Many development teams would cringe at hearing "refactoring", and rightly so given the time and effort needed, but iopool had an additional obstacle: they needed to refactor a product that had taken them two years in less than six months. They also had to do it in time for the next high season which was to start in June. -![iopool architecture before Prisma](/blog/iopool-customer-success-story-ulscwvaqzxoa/imgs/iopool-diagram-before.png) +![iopool architecture before Prisma](/iopool-customer-success-story-ulscwvaqzxoa/imgs/iopool-diagram-before.png) iopool had five requirements when choosing their ORM: @@ -53,7 +55,7 @@ With their requirements identified, iopool got to work on version 2 of their bac The new stack relies on popular technologies such as React Native, GraphQL (using Apollo), Postgres, and DynamoDB. At version 2, Prisma plays a pivotal role. -![iopool architecture after Prisma](/blog/iopool-customer-success-story-ulscwvaqzxoa/imgs/iopool-diagram-after.png) +![iopool architecture after Prisma](/iopool-customer-success-story-ulscwvaqzxoa/imgs/iopool-diagram-after.png) The substantially upgraded version 2 of iopool makes extensive use of serverless functions through AWS Lambda. Nexus is used to provide a GraphQL API which is called from the React Native app. Prisma Client is used to access the Postgres database that iopool uses for everything aside from water quality data. For the enormous amount of water quality data collected, DynamoDB was chosen because of its ability to easily handle this kind of data at massive scale. @@ -75,7 +77,7 @@ To find out more about how iopool was successful with Prisma, and to learn more - [Learn more about iopool](https://iopool.com/en/) - [Join the Prisma Community for updates](https://slack.prisma.io/) -- [Watch Luc Matagne's talk at a recent Prisma Meetup](/blog/iopool-customer-success-story-ulscwvaqzxoa/imgs/mWvroX_lkZI) +- [Watch Luc Matagne's talk at a recent Prisma Meetup](/iopool-customer-success-story-ulscwvaqzxoa/imgs/mWvroX_lkZI)