diff --git a/apps/docs/components/HomePageCover.tsx b/apps/docs/components/HomePageCover.tsx
index 597e64e8174..e760c411dc3 100644
--- a/apps/docs/components/HomePageCover.tsx
+++ b/apps/docs/components/HomePageCover.tsx
@@ -77,7 +77,7 @@ const HomePageCover = (props) => {
Discover how to set up a database to an app making queries in just a few minutes.
)
diff --git a/apps/www/components/Hero/HeroFrameworks.tsx b/apps/www/components/Hero/HeroFrameworks.tsx
index 76229d879ea..12e604a1746 100644
--- a/apps/www/components/Hero/HeroFrameworks.tsx
+++ b/apps/www/components/Hero/HeroFrameworks.tsx
@@ -1,5 +1,4 @@
import React from 'react'
-import Image from 'next/image'
import Link from 'next/link'
import ReactTooltip from 'react-tooltip'
import Telemetry from '~/lib/telemetry'
@@ -10,43 +9,43 @@ import { useBreakpoint } from 'common'
const frameworks = [
{
name: 'Next.js',
- icon: '/images/logos/frameworks/nextjs.svg',
+ icon: 'M42.3148 48.6796C38.9009 50.9525 34.8014 52.2771 30.3924 52.2771C18.4957 52.2771 8.85156 42.6329 8.85156 30.7362C8.85156 18.8395 18.4957 9.19531 30.3924 9.19531C42.2891 9.19531 51.9333 18.8395 51.9333 30.7362C51.9333 37.1564 49.1245 42.9207 44.6688 46.8671L39.5552 40.2803V21.8278H36.584V36.4531L25.2299 21.8278H21.4808V39.6473H24.4801V25.6368L42.3148 48.6796Z',
docs: '/docs/guides/getting-started/quickstarts/nextjs',
gaEvent: 'www_hp_hero_frameworks_nextjs',
},
{
name: 'React',
- icon: '/images/logos/frameworks/react.svg',
+ icon: 'M45.74 23.6983C45.2739 23.5379 44.7909 23.3861 44.2937 23.2426C44.3754 22.909 44.4504 22.5798 44.5171 22.2561C45.6119 16.9418 44.8961 12.6605 42.4518 11.2509C40.1079 9.89927 36.2748 11.3085 32.4035 14.6776C32.0313 15.0016 31.6579 15.3446 31.2848 15.704C31.0362 15.4662 30.7879 15.2364 30.5403 15.0165C26.4831 11.4141 22.4164 9.89599 19.9744 11.3097C17.6329 12.6652 16.9394 16.69 17.9249 21.7265C18.0201 22.2129 18.1313 22.7097 18.2571 23.2148C17.6816 23.3782 17.1259 23.5524 16.5943 23.7377C11.8376 25.3961 8.7998 27.9952 8.7998 30.6911C8.7998 33.4755 12.0609 36.2683 17.0153 37.9617C17.4063 38.0953 17.812 38.2217 18.2301 38.3416C18.0944 38.8879 17.9763 39.4232 17.8773 39.9454C16.9376 44.8944 17.6714 48.8242 20.0068 50.1711C22.4189 51.5622 26.4673 50.1324 30.4093 46.6865C30.7209 46.4141 31.0336 46.1253 31.3469 45.8225C31.7529 46.2135 32.1582 46.5835 32.5615 46.9306C36.3798 50.2164 40.151 51.5432 42.4842 50.1925C44.894 48.7975 45.6772 44.576 44.6604 39.4399C44.5828 39.0476 44.4924 38.6469 44.3909 38.239C44.6752 38.155 44.9543 38.0682 45.2265 37.978C50.3771 36.2715 53.7282 33.5127 53.7282 30.6911C53.7282 27.9854 50.5924 25.3688 45.74 23.6983ZM44.6228 36.1561C44.3772 36.2375 44.1251 36.3161 43.8682 36.3923C43.2996 34.5922 42.5322 32.6781 41.5931 30.7005C42.4893 28.7699 43.227 26.8803 43.7797 25.0919C44.2393 25.2249 44.6854 25.3651 45.1152 25.5132C49.2728 26.9444 51.8089 29.0605 51.8089 30.6911C51.8089 32.4279 49.07 34.6826 44.6228 36.1561ZM42.7776 39.8126C43.2272 42.0837 43.2914 44.1371 42.9936 45.7423C42.726 47.1847 42.1878 48.1463 41.5225 48.5315C40.1066 49.351 37.0787 48.2857 33.8132 45.4757C33.4388 45.1535 33.0618 44.8096 32.6835 44.4455C33.9495 43.061 35.2147 41.4514 36.4495 39.6638C38.6215 39.4711 40.6735 39.156 42.5344 38.7258C42.626 39.0955 42.7074 39.4581 42.7776 39.8126ZM24.1169 48.3898C22.7336 48.8784 21.6318 48.8924 20.9658 48.5084C19.5486 47.691 18.9594 44.5358 19.7631 40.3033C19.8551 39.8186 19.9647 39.3207 20.091 38.8118C21.9314 39.2187 23.9684 39.5116 26.1456 39.6881C27.3887 41.4373 28.6905 43.0452 30.0024 44.453C29.7157 44.7297 29.4302 44.9931 29.1463 45.2413C27.4032 46.7651 25.6564 47.8461 24.1169 48.3898ZM17.6361 36.1455C15.4453 35.3967 13.6361 34.4235 12.396 33.3616C11.2817 32.4073 10.7191 31.4599 10.7191 30.6911C10.7191 29.0551 13.1581 26.9684 17.226 25.5501C17.7196 25.378 18.2363 25.2158 18.7725 25.0635C19.3347 26.8923 20.0722 28.8043 20.9623 30.7378C20.0607 32.7 19.3128 34.6425 18.745 36.4927C18.3628 36.3829 17.9924 36.2672 17.6361 36.1455ZM19.8085 21.3579C18.9642 17.0428 19.5249 13.7876 20.936 12.9708C22.4391 12.1006 25.7628 13.3413 29.2659 16.4518C29.4898 16.6506 29.7146 16.8587 29.9401 17.074C28.6347 18.4756 27.3448 20.0714 26.1127 21.8103C23.9997 22.0061 21.977 22.3208 20.1174 22.742C20.0004 22.2717 19.8969 21.8097 19.8085 21.3579ZM39.1886 26.1433C38.744 25.3754 38.2876 24.6257 37.8223 23.8964C39.2558 24.0777 40.6293 24.3182 41.9191 24.6126C41.5318 25.8536 41.0492 27.1511 40.4811 28.4813C40.0735 27.7076 39.6425 26.9275 39.1886 26.1433ZM31.2854 18.4456C32.1707 19.4047 33.0573 20.4756 33.9293 21.6374C33.0506 21.5959 32.161 21.5743 31.264 21.5743C30.3755 21.5743 29.4925 21.5954 28.6192 21.6362C29.4921 20.4852 30.3863 19.4158 31.2854 18.4456ZM23.3317 26.1566C22.8876 26.9267 22.4645 27.7025 22.0634 28.4799C21.5045 27.1543 21.0263 25.8509 20.6357 24.5923C21.9176 24.3054 23.2846 24.0709 24.7089 23.8931C24.2371 24.6291 23.7769 25.3843 23.3317 26.1564V26.1566ZM24.75 37.626C23.2783 37.4618 21.8908 37.2394 20.6093 36.9604C21.0061 35.6793 21.4948 34.3481 22.0655 32.994C22.4677 33.7707 22.8925 34.5469 23.3393 35.3187H23.3393C23.7945 36.1049 24.266 36.875 24.75 37.626ZM31.3385 43.0719C30.4289 42.0904 29.5215 41.0047 28.6353 39.8368C29.4956 39.8706 30.3726 39.8879 31.264 39.8879C32.1798 39.8879 33.085 39.8672 33.9761 39.8276C33.1012 41.0164 32.2178 42.1038 31.3385 43.0719ZM40.4994 32.9249C41.0999 34.2937 41.6061 35.618 42.0081 36.8772C40.7054 37.1744 39.2989 37.4138 37.8171 37.5916C38.2835 36.8525 38.7439 36.0899 39.1963 35.3055C39.6539 34.5118 40.0885 33.717 40.4994 32.9249ZM37.5337 34.3466C36.8314 35.5643 36.1104 36.7268 35.3784 37.8241C34.0452 37.9194 32.6678 37.9685 31.264 37.9685C29.8659 37.9685 28.5058 37.9251 27.1962 37.8401C26.4347 36.7284 25.698 35.5625 25.0002 34.3571H25.0004C24.3044 33.155 23.6638 31.9427 23.0834 30.7372C23.6636 29.5289 24.3025 28.3152 24.9945 27.1152L24.9944 27.1155C25.6882 25.9123 26.4184 24.7521 27.1729 23.6473C28.509 23.5463 29.8792 23.4936 31.2639 23.4936H31.264C32.655 23.4936 34.0269 23.5467 35.3626 23.6486C36.1056 24.7453 36.8308 25.9017 37.5274 27.1051C38.2319 28.3219 38.879 29.5275 39.4642 30.7099C38.8808 31.9126 38.2351 33.1303 37.5337 34.3466ZM41.4931 12.9137C42.9976 13.7813 43.5826 17.2804 42.6374 21.8688C42.5771 22.1615 42.5092 22.4597 42.4354 22.762C40.5715 22.3319 38.5474 22.0118 36.4282 21.813C35.1937 20.055 33.9143 18.4567 32.6302 17.0731C32.9755 16.741 33.3202 16.4243 33.6636 16.1254C36.9805 13.2388 40.0806 12.0991 41.4931 12.9137ZM31.264 26.6791C33.4797 26.6791 35.276 28.4753 35.276 30.6911C35.276 32.9068 33.4797 34.703 31.264 34.703C29.0483 34.703 27.252 32.9068 27.252 30.6911C27.252 28.4753 29.0483 26.6791 31.264 26.6791Z',
docs: '/docs/guides/getting-started/quickstarts/reactjs',
gaEvent: 'www_hp_hero_frameworks_react',
},
{
name: 'Nuxt',
- icon: '/images/logos/frameworks/nuxtjs.svg',
+ icon: 'M32.5784 45.4741H50.2199C50.7802 45.4741 51.3307 45.3325 51.8159 45.0634C52.3012 44.7943 52.7041 44.4072 52.9842 43.9409C53.2642 43.4748 53.4115 42.946 53.4113 42.4078C53.4111 41.8696 53.2633 41.3409 52.9828 40.875L41.1352 21.164C40.8552 20.6979 40.4524 20.3109 39.9672 20.0418C39.4821 19.7727 38.9317 19.631 38.3715 19.631C37.8113 19.631 37.261 19.7727 36.7758 20.0418C36.2906 20.3109 35.8878 20.6979 35.6078 21.164L32.5784 26.2073L26.6555 16.3452C26.3753 15.8792 25.9723 15.4922 25.487 15.2232C25.0017 14.9541 24.4513 14.8125 23.8909 14.8125C23.3306 14.8125 22.7802 14.9541 22.2949 15.2232C21.8096 15.4922 21.4066 15.8792 21.1263 16.3452L6.38358 40.875C6.10311 41.3409 5.95532 41.8696 5.95508 42.4078C5.95483 42.946 6.10214 43.4748 6.38219 43.9409C6.66224 44.4072 7.06515 44.7943 7.5504 45.0634C8.03564 45.3325 8.58612 45.4741 9.14645 45.4741H20.2203C24.6079 45.4741 27.8436 43.6229 30.07 40.0113L38.3706 26.2073L47.0599 40.6619H35.4754L32.5784 45.4741ZM20.0398 40.657L12.3116 40.6553L23.8961 21.3836L29.6763 31.0195L25.8062 37.4599C24.3276 39.8032 22.6479 40.657 20.0398 40.657Z',
docs: '/docs/guides/getting-started/quickstarts/nuxtjs',
gaEvent: 'www_hp_hero_frameworks_nuxt',
},
{
name: 'Flutter',
- icon: '/images/logos/frameworks/flutter.svg',
+ icon: `M46.5067 10.3828L34.3509 10.3962L14.75 29.9971L20.7974 36.0519L26.1125 30.7666L46.5067 10.3828Z M34.6996 28.4653C34.5272 28.4573 34.3493 28.4491 34.2378 28.5965L23.7856 39.0471L29.7894 45.0142L29.7825 45.021L34.079 49.3212C34.1072 49.3462 34.1352 49.3741 34.1637 49.4026C34.2813 49.5201 34.4074 49.6462 34.5895 49.6055C36.5743 49.601 38.5591 49.6017 40.544 49.6025C42.529 49.6032 44.5142 49.604 46.4998 49.5995L35.9333 39.0234L46.4963 28.467L34.906 28.464C34.8415 28.4719 34.7711 28.4686 34.6996 28.4653Z`,
docs: '/docs/guides/getting-started/quickstarts/flutter',
gaEvent: 'www_hp_hero_frameworks_flutter',
},
{
name: 'Svelte',
- icon: '/images/logos/frameworks/svelte.svg',
+ icon: 'M28.8421 13.5737C33.6246 10.5267 40.239 11.9474 43.588 16.7408H43.5882C45.1937 18.9881 45.826 21.7874 45.3423 24.5066C45.1104 25.792 44.6203 27.017 43.9015 28.1076C44.9502 30.1077 45.3021 32.4004 44.9015 34.6229C44.4229 37.291 42.8426 39.634 40.5482 41.0772L32.1489 46.4304C27.3671 49.4774 20.7527 48.0572 17.4029 43.2634C15.7977 41.016 15.1654 38.2167 15.6488 35.4975C15.8809 34.2121 16.3713 32.987 17.0902 31.8964C16.041 29.8965 15.6888 27.6038 16.0895 25.3813C16.5683 22.7133 18.1485 20.3704 20.4428 18.927L28.8421 13.5737ZM20.8577 41.0643C22.4527 43.3635 25.3126 44.4236 28.0207 43.7194H28.0206C28.6247 43.558 29.2004 43.305 29.7278 42.9693L38.1291 37.6151C39.5092 36.7467 40.4598 35.3374 40.7479 33.7325C41.0388 32.0968 40.6583 30.4128 39.6925 29.061C38.0976 26.7618 35.2377 25.7017 32.5296 26.4059C31.926 26.5672 31.3506 26.8201 30.8237 27.1557L27.618 29.1987C27.4585 29.3002 27.2845 29.3766 27.1019 29.4255C26.286 29.6371 25.4247 29.3173 24.9444 28.6246C24.6537 28.2169 24.5393 27.7094 24.627 27.2164C24.7138 26.7331 25.0001 26.3087 25.4157 26.0471L33.8177 20.6927C33.9771 20.5912 34.1512 20.5147 34.3338 20.4659C35.1494 20.2542 36.0104 20.5738 36.4904 21.2664C36.7471 21.6298 36.8671 22.0722 36.8293 22.5155L36.8005 22.8272L37.1128 22.922C38.294 23.2783 39.4056 23.8339 40.3996 24.5648L40.8298 24.8804L40.988 24.398C41.0728 24.1413 41.1399 23.8792 41.1888 23.6134C41.4796 21.9776 41.0992 20.2937 40.1334 18.9419C38.5385 16.6427 35.6786 15.5826 32.9705 16.2868C32.3664 16.4481 31.7907 16.7011 31.2633 17.0369L22.862 22.3915C21.4818 23.2594 20.5311 24.6687 20.2432 26.2735C19.9523 27.9092 20.3328 29.5932 21.2987 30.945C22.8935 33.2442 25.7534 34.3043 28.4616 33.6001C29.0651 33.4388 29.6405 33.1861 30.1677 32.8509L33.3738 30.8071C33.533 30.7057 33.7068 30.6293 33.8892 30.5804C34.7051 30.3689 35.5664 30.6886 36.0467 31.3814C36.3372 31.7891 36.4518 32.2964 36.3648 32.7894C36.2775 33.2728 35.991 33.6973 35.5754 33.959L27.1734 39.3132C27.014 39.4147 26.8399 39.4912 26.6573 39.54C25.8417 39.7517 24.9807 39.4321 24.5007 38.7396C24.2437 38.3763 24.1237 37.9337 24.1618 37.4903L24.1906 37.1787L23.8783 37.084C22.6973 36.7276 21.5858 36.1723 20.5917 35.4419L20.1613 35.1257L20.0031 35.6082C19.9181 35.8648 19.851 36.1269 19.8023 36.3928C19.5115 38.0285 19.8919 39.7125 20.8577 41.0643Z',
docs: '/docs/guides/getting-started/quickstarts/sveltekit',
gaEvent: 'www_hp_hero_frameworks_svelte',
},
{
name: 'Python',
- icon: '/images/logos/languages/python-icon.svg',
+ icon: 'M25.8507 12.3604C27.1186 12.136 28.5596 12.0073 30.0686 12.0003C31.5775 11.9933 33.1508 12.108 34.6671 12.3604C37.0624 12.7596 39.0804 14.5565 39.0804 16.9486V25.3535C39.0804 27.8182 37.1213 29.8389 34.6671 29.8389H25.8507C22.8573 29.8389 20.3366 32.4087 20.3366 35.3221V39.3548H17.3017C14.7365 39.3548 13.2381 37.4929 12.6106 34.8798C11.7643 31.3692 11.8002 29.2712 12.6106 25.909C13.3132 22.9758 15.5595 21.434 18.1247 21.434H21.4373H30.264V20.3126H21.4373V16.9486C21.4373 14.4014 22.1155 13.0203 25.8507 12.3604ZM26.9514 16.3931C26.9514 15.4626 26.2069 14.7059 25.2952 14.7059C24.3801 14.7059 23.6389 15.4626 23.6389 16.3931C23.6389 17.3202 24.3801 18.0699 25.2952 18.0699C26.2069 18.0699 26.9514 17.3202 26.9514 16.3931ZM40.1814 25.3549V21.4353H43.494C46.0625 21.4353 47.2734 23.3566 47.9073 25.9104C48.7897 29.4573 48.8289 32.1162 47.9073 34.8811C47.0152 37.5668 46.0593 39.3562 43.494 39.3562H39.0807H30.2642V40.4775H39.0807V43.8415C39.0807 46.3887 36.8895 47.6835 34.6673 48.3269C31.3243 49.2969 28.6449 49.1485 25.8509 48.3269C23.5176 47.6406 21.4375 46.2336 21.4375 43.8415V35.4366C21.4375 33.0182 23.4359 30.9513 25.8509 30.9513H34.6673C37.6051 30.9513 40.1814 28.3936 40.1814 25.3549ZM36.8791 44.3971C36.8791 43.4699 36.1378 42.7202 35.2228 42.7202C34.3111 42.7202 33.5665 43.4699 33.5665 44.3971C33.5665 45.3275 34.3111 46.0842 35.2228 46.0842C36.1378 46.0842 36.8791 45.3275 36.8791 44.3971Z',
docs: '/docs/reference/python/introduction',
gaEvent: 'www_hp_hero_frameworks_python',
},
{
name: 'Vue',
- icon: '/images/logos/frameworks/vue.svg',
+ icon: 'M43.0532 13.4531H50.1147L30.2756 47.8158L10.4365 13.4531H17.4978L30.2755 35.5845L43.0532 13.4531ZM42.1764 13.4531L30.2755 34.0659L18.3746 13.4531L25.6939 13.4531L30.2756 21.3888L34.8572 13.4531L42.1764 13.4531Z',
docs: '/docs/guides/getting-started/quickstarts/vue',
gaEvent: 'www_hp_hero_frameworks_vue',
},
@@ -82,14 +81,15 @@ const HeroFrameworks = ({ className }: { className?: string }) => {
data-tip={framework.name}
onClick={() => sendTelemetryEvent(framework.gaEvent)}
>
-
+ viewBox="0 0 61 61"
+ fill="none"
+ xmlns="http://www.w3.org/2000/svg"
+ >
+
+
))}
diff --git a/apps/www/components/Hero/hero.module.css b/apps/www/components/Hero/hero.module.css
index f8e4fb0a77b..cf28344a0b2 100644
--- a/apps/www/components/Hero/hero.module.css
+++ b/apps/www/components/Hero/hero.module.css
@@ -1,7 +1,7 @@
.hero-text {
opacity: 0;
transform: translate3d(0, 10px, 0);
- animation: animateText 1s cubic-bezier(0.25, 0.25, 0, 1) 0.1s both;
+ animation: animateText 0.2s cubic-bezier(0.25, 0.25, 0, 1) 0.1s both;
}
@keyframes animateText {
diff --git a/apps/www/components/Nav/Product.tsx b/apps/www/components/Nav/Product.tsx
index d2085722e6e..9720208e620 100644
--- a/apps/www/components/Nav/Product.tsx
+++ b/apps/www/components/Nav/Product.tsx
@@ -1,5 +1,5 @@
import React from 'react'
-import SolutionsData from 'data/Solutions.json'
+import SolutionsData from 'data/Solutions'
import CustomerStoriesData from 'data/CustomerStories.json'
import { useRouter } from 'next/router'
import ProductIcon from '../ProductIcon'
diff --git a/apps/www/components/Nav/index.tsx b/apps/www/components/Nav/index.tsx
index 6f19e4b2be2..ec9a2c5d075 100644
--- a/apps/www/components/Nav/index.tsx
+++ b/apps/www/components/Nav/index.tsx
@@ -6,7 +6,7 @@ import { Button, Badge, IconStar, IconChevronDown } from 'ui'
import FlyOut from '~/components/UI/FlyOut'
import Transition from 'lib/Transition'
-import SolutionsData from 'data/Solutions.json'
+import SolutionsData from 'data/Solutions'
import Solutions from '~/components/Nav/Product'
import Developers from '~/components/Nav/Developers'
diff --git a/apps/www/data/Examples.json b/apps/www/data/Examples.json
index 2796512d6fa..325dff587d7 100644
--- a/apps/www/data/Examples.json
+++ b/apps/www/data/Examples.json
@@ -35,7 +35,7 @@
"author_img": "https://avatars.githubusercontent.com/u/14985020",
"repo_name": "nextjs-subscription-payments",
"repo_url": "https://github.com/vercel/nextjs-subscription-payments",
- "vercel_deploy_url": "https://vercel.com/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fnextjs-subscription-payments&project-name=nextjs-subscription-payments&repo-name=nextjs-subscription-payments&demo-title=Next.js%20Subscription%20Payments%20Starter&demo-description=Demo%20project%20on%20Vercel&demo-url=https%3A%2F%2Fsubscription-payments.vercel.app&demo-image=https%3A%2F%2Fsubscription-payments.vercel.app%2Fdemo.png&integration-ids=oac_pb1dqJT8Ry2D99Q0o9qXWIhJ,oac_jUduyjQgOyzev1fjrW83NYOv&external-id=nextjs-subscription-payments",
+ "vercel_deploy_url": "https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fnextjs-subscription-payments&env=NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY,STRIPE_SECRET_KEY&envDescription=Enter%20your%20Stripe%20API%20keys.&envLink=https%3A%2F%2Fdashboard.stripe.com%2Fapikeys&project-name=nextjs-subscription-payments&repository-name=nextjs-subscription-payments&integration-ids=oac_VqOgBHqhEoFTPzGkPd7L0iH6&external-id=https%3A%2F%2Fgithub.com%2Fvercel%2Fnextjs-subscription-payments%2Ftree%2Fmain",
"demo_url": "https://subscription-payments.vercel.app/"
},
{
diff --git a/apps/www/data/Solutions.json b/apps/www/data/Solutions.json
deleted file mode 100644
index 27ac8e08592..00000000000
--- a/apps/www/data/Solutions.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
- "database": {
- "name": "Database",
- "icon": "M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4",
- "description": "Every project is a full Postgres database, the world's most trusted relational database.",
- "description_short": "",
- "label": "",
- "url": "/database"
- },
- "authentication": {
- "name": "Authentication",
- "icon": "M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z",
- "description": "Add user sign ups and logins, securing your data with Row Level Security.",
- "description_short": "",
- "label": "",
- "url": "/auth"
- },
- "storage": {
- "name": "Storage",
- "icon": "M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4",
- "description": "Store, organize, and serve large files. Any media, including videos and images.",
- "description_short": "",
- "label": "",
- "url": "/storage"
- },
- "edge-functions": {
- "name": "Edge Functions",
- "icon": "M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4",
- "description": "Write custom code without deploying or scaling servers.",
- "description_short": "",
- "label": "",
- "url": "/edge-functions"
- },
- "realtime": {
- "name": "Realtime",
- "icon": "M13 10V3L4 14h7v7l9-11h-7z",
- "description": "Create multiplayer experiences by sharing, broadcasting, and listening to changes from other clients or the Database.",
- "description_short": "",
- "label": "",
- "url": "/realtime"
- },
- "vector": {
- "name": "Vector",
- "icon": "M11.9983 11.4482V21.7337M11.9983 11.4482L21.0732 6.17699M11.9983 11.4482L2.92383 6.17723M2.92383 6.17723V12.4849M2.92383 6.17723V6.1232L8.35978 2.9657M21.0736 12.54V6.1232L15.6376 2.9657M17.7247 18.6107L11.9987 21.9367L6.27265 18.6107",
- "description": "Integrate your favorite ML-models to store, index and search vector embeddings.",
- "description_short": "",
- "label": "",
- "url": "/vector"
- }
-}
diff --git a/apps/www/data/Solutions.ts b/apps/www/data/Solutions.ts
new file mode 100644
index 00000000000..72f7226a907
--- /dev/null
+++ b/apps/www/data/Solutions.ts
@@ -0,0 +1,57 @@
+import { products } from 'shared-data'
+import { PRODUCT_NAMES, PRODUCT_SHORTNAMES } from 'shared-data/products'
+
+const solutions = {
+ [PRODUCT_SHORTNAMES.DATABASE]: {
+ name: PRODUCT_NAMES.DATABASE,
+ icon: products.database.icon[24],
+ description:
+ "Every project is a full Postgres database, the world's most trusted relational database.",
+ description_short: '',
+ label: '',
+ url: '/database',
+ },
+ [PRODUCT_SHORTNAMES.AUTHENTICATION]: {
+ name: PRODUCT_NAMES.AUTHENTICATION,
+ icon: products.authentication.icon[24],
+ description: 'Add user sign ups and logins, securing your data with Row Level Security.',
+ description_short: '',
+ label: '',
+ url: '/auth',
+ },
+ [PRODUCT_SHORTNAMES.STORAGE]: {
+ name: PRODUCT_NAMES.STORAGE,
+ icon: products.storage.icon[24],
+ description: 'Store, organize, and serve large files. Any media, including videos and images.',
+ description_short: '',
+ label: '',
+ url: '/storage',
+ },
+ [PRODUCT_SHORTNAMES.FUNCTIONS]: {
+ name: PRODUCT_NAMES.FUNCTIONS,
+ icon: products.functions.icon[24],
+ description: 'Write custom code without deploying or scaling servers.',
+ description_short: '',
+ label: '',
+ url: '/edge-functions',
+ },
+ [PRODUCT_SHORTNAMES.REALTIME]: {
+ name: PRODUCT_NAMES.REALTIME,
+ icon: products.realtime.icon[24],
+ description:
+ 'Create multiplayer experiences by sharing, broadcasting, and listening to changes from other clients or the Database.',
+ description_short: '',
+ label: '',
+ url: '/realtime',
+ },
+ [PRODUCT_SHORTNAMES.VECTOR]: {
+ name: PRODUCT_NAMES.VECTOR,
+ icon: products.vector.icon[24],
+ description: 'Integrate your favorite ML-models to store, index and search vector embeddings.',
+ description_short: '',
+ label: '',
+ url: '/vector',
+ },
+}
+
+export default solutions
diff --git a/apps/www/pages/_app.tsx b/apps/www/pages/_app.tsx
index 09c560806f3..730df558da3 100644
--- a/apps/www/pages/_app.tsx
+++ b/apps/www/pages/_app.tsx
@@ -84,7 +84,7 @@ export default function MyApp({ Component, pageProps }: AppProps) {
}}
/>
-
+
diff --git a/apps/www/pages/auth/Auth.tsx b/apps/www/pages/auth/Auth.tsx
index b47d4eefcae..e2a546a2301 100644
--- a/apps/www/pages/auth/Auth.tsx
+++ b/apps/www/pages/auth/Auth.tsx
@@ -2,7 +2,7 @@ import { createClient } from '@supabase/supabase-js'
import { Button, IconArrowUpRight, IconBriefcase, IconEye, IconLink, IconShield } from 'ui'
import ApiExamples from 'data/products/auth/auth-api-examples'
import AuthSqlRulesExamples from 'data/products/auth/auth-sql-rules-examples'
-import Solutions from 'data/Solutions.json'
+import Solutions from 'data/Solutions'
import { NextSeo } from 'next-seo'
import Image from 'next/image'
import Link from 'next/link'
diff --git a/apps/www/pages/database/Database.tsx b/apps/www/pages/database/Database.tsx
index 4f3639cd5b5..72508725ff4 100644
--- a/apps/www/pages/database/Database.tsx
+++ b/apps/www/pages/database/Database.tsx
@@ -4,7 +4,7 @@ import ApiExamplesData from 'data/products/database/api-examples'
import ExtensionsExamplesData from 'data/products/database/extensions-examples'
import SqlViewCarouselData from 'data/products/database/sql-view-carousel.json'
import TableViewCarouselData from 'data/products/database/table-view-carousel.json'
-import Solutions from 'data/Solutions.json'
+import Solutions from 'data/Solutions'
import { NextSeo } from 'next-seo'
import Image from 'next/image'
import Link from 'next/link'
diff --git a/apps/www/pages/edge-functions/edge-functions.tsx b/apps/www/pages/edge-functions/edge-functions.tsx
index c572c51526d..20900033d31 100644
--- a/apps/www/pages/edge-functions/edge-functions.tsx
+++ b/apps/www/pages/edge-functions/edge-functions.tsx
@@ -1,6 +1,6 @@
import { Badge, IconCode, IconFastForward, IconGlobe, IconRefreshCcw } from 'ui'
import UseCaseExamples from 'data/products/functions/usecase-examples'
-import Solutions from 'data/Solutions.json'
+import Solutions from 'data/Solutions'
import { NextSeo } from 'next-seo'
import Image from 'next/image'
import { useRouter } from 'next/router'
@@ -104,8 +104,8 @@ function Database() {
/>
Serverless Edge Functions
diff --git a/apps/www/pages/pricing/index.tsx b/apps/www/pages/pricing/index.tsx
index 5179ad7c8ee..32f23ded8bf 100644
--- a/apps/www/pages/pricing/index.tsx
+++ b/apps/www/pages/pricing/index.tsx
@@ -1,5 +1,5 @@
import { Accordion, Button, IconCheck, Select } from 'ui'
-import Solutions from 'data/Solutions.json'
+import Solutions from 'data/Solutions'
import { NextSeo } from 'next-seo'
import Link from 'next/link'
import { useRouter } from 'next/router'
@@ -524,7 +524,7 @@ export default function IndexPage() {
diff --git a/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml b/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml
index 1085e7ff935..8e9cc3431e9 100644
--- a/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml
+++ b/apps/www/public/planetpg-angelico_de_los_reyes-rss.xml
@@ -5,35 +5,35 @@
https://supabase.com/blog
Latest Postgres news from Angelico de los Reyes at Supabaseen
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/postgres-point-in-time-recoveryPoint in Time Recovery is now available for Pro projects
https://supabase.com/blog/postgres-point-in-time-recovery
We're making PITR available for more projects, with a new Dashboard UI that makes it simple to use.
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/continuous-postgresql-backup-walgContinuous PostgreSQL Backups using WAL-G
https://supabase.com/blog/continuous-postgresql-backup-walg
Have you ever wanted to restore your database's state to a particular moment in time? This post explains how, using WAL-G.
- Sat, 01 Aug 2020 16:00:00 GMT
+ Sat, 01 Aug 2020 23:00:00 GMThttps://supabase.com/blog/postgresql-templatesWhat are PostgreSQL Templates?
https://supabase.com/blog/postgresql-templates
What are PostgreSQL templates and what are they used for?
- Wed, 08 Jul 2020 16:00:00 GMT
+ Wed, 08 Jul 2020 23:00:00 GMThttps://supabase.com/blog/postgresql-physical-logical-backupsPhysical vs Logical Backups in PostgreSQL
https://supabase.com/blog/postgresql-physical-logical-backups
What are physical and logical backups in Postgres?
- Mon, 06 Jul 2020 16:00:00 GMT
+ Mon, 06 Jul 2020 23:00:00 GMT
diff --git a/apps/www/public/planetpg-ant_wilson-rss.xml b/apps/www/public/planetpg-ant_wilson-rss.xml
index 8ce4387e596..7733d8ee02d 100644
--- a/apps/www/public/planetpg-ant_wilson-rss.xml
+++ b/apps/www/public/planetpg-ant_wilson-rss.xml
@@ -5,14 +5,14 @@
https://supabase.com/blog
Latest Postgres news from Ant Wilson at Supabaseen
- Fri, 26 Feb 2021 16:00:00 GMT
+ Fri, 26 Feb 2021 23:00:00 GMThttps://supabase.com/blog/cracking-postgres-interviewCracking PostgreSQL Interview Questions
https://supabase.com/blog/cracking-postgres-interview
Understand the top PostgreSQL Interview Questions
- Fri, 26 Feb 2021 16:00:00 GMT
+ Fri, 26 Feb 2021 23:00:00 GMT
diff --git a/apps/www/public/planetpg-bo_lu-rss.xml b/apps/www/public/planetpg-bo_lu-rss.xml
index 34edf154931..23958771024 100644
--- a/apps/www/public/planetpg-bo_lu-rss.xml
+++ b/apps/www/public/planetpg-bo_lu-rss.xml
@@ -5,14 +5,14 @@
https://supabase.com/blog
Latest Postgres news from Bo Lu at Supabaseen
- Wed, 14 Dec 2022 16:00:00 GMT
+ Wed, 14 Dec 2022 23:00:00 GMThttps://supabase.com/blog/postgres-foreign-data-wrappers-rustSupabase Wrappers, a Postgres FDW framework written in Rust
https://supabase.com/blog/postgres-foreign-data-wrappers-rust
A framework for building Postgres Foreign Data Wrappers which connects to Stripe, Firebase, Clickhouse, and more.
- Wed, 14 Dec 2022 16:00:00 GMT
+ Wed, 14 Dec 2022 23:00:00 GMT
diff --git a/apps/www/public/planetpg-burggraf-rss.xml b/apps/www/public/planetpg-burggraf-rss.xml
index 3bec1f37cf3..9d2390826b2 100644
--- a/apps/www/public/planetpg-burggraf-rss.xml
+++ b/apps/www/public/planetpg-burggraf-rss.xml
@@ -5,21 +5,21 @@
https://supabase.com/blog
Latest Postgres news from Mark Burggraf at Supabaseen
- Wed, 23 Nov 2022 16:00:00 GMT
+ Wed, 23 Nov 2022 23:00:00 GMThttps://supabase.com/blog/sql-or-nosql-both-with-postgresqlSQL or NoSQL? Why not use both (with PostgreSQL)?
https://supabase.com/blog/sql-or-nosql-both-with-postgresql
How to turn Postgres into an easy-to-use NoSQL database that retains all the power of SQL
- Wed, 23 Nov 2022 16:00:00 GMT
+ Wed, 23 Nov 2022 23:00:00 GMThttps://supabase.com/blog/postgres-wasmPostgres WASM by Snaplet and Supabase
https://supabase.com/blog/postgres-wasm
We're open sourcing postgres-wasm, a PostgresQL server that runs inside a browser, with our friends at Snaplet.
- Sun, 02 Oct 2022 16:00:00 GMT
+ Sun, 02 Oct 2022 23:00:00 GMT
diff --git a/apps/www/public/planetpg-gregnr-rss.xml b/apps/www/public/planetpg-gregnr-rss.xml
index 7ff629a885d..7c7fd0ecbd1 100644
--- a/apps/www/public/planetpg-gregnr-rss.xml
+++ b/apps/www/public/planetpg-gregnr-rss.xml
@@ -5,14 +5,14 @@
https://supabase.com/blog
Latest Postgres news from Greg Richardson at Supabaseen
- Sun, 05 Feb 2023 16:00:00 GMT
+ Sun, 05 Feb 2023 23:00:00 GMThttps://supabase.com/blog/openai-embeddings-postgres-vectorStoring OpenAI embeddings in Postgres with pgvector
https://supabase.com/blog/openai-embeddings-postgres-vector
An example of how to build an AI-powered search engine using OpenAI's embeddings and PostgreSQL.
- Sun, 05 Feb 2023 16:00:00 GMT
+ Sun, 05 Feb 2023 23:00:00 GMT
diff --git a/apps/www/public/planetpg-michel-rss.xml b/apps/www/public/planetpg-michel-rss.xml
index 7c2cd380ecf..579efc5a58f 100644
--- a/apps/www/public/planetpg-michel-rss.xml
+++ b/apps/www/public/planetpg-michel-rss.xml
@@ -5,21 +5,21 @@
https://supabase.com/blog
Latest Postgres news from Michel Pelletier at Supabaseen
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/vault-now-in-betaSupabase Vault is now in Beta
https://supabase.com/blog/vault-now-in-beta
A Postgres extension to store encrypted secrets and encrypt data.
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/transparent-column-encryption-with-postgresTransparent Column Encryption with Postgres
https://supabase.com/blog/transparent-column-encryption-with-postgres
Using pgsodium's Transparent Column Encryption to encrypt data and provide your users with row-level encryption.
- Wed, 30 Nov 2022 16:00:00 GMT
+ Wed, 30 Nov 2022 23:00:00 GMT
diff --git a/apps/www/public/planetpg-oli_rice-rss.xml b/apps/www/public/planetpg-oli_rice-rss.xml
index 7b7fc946cd2..7d19002661f 100644
--- a/apps/www/public/planetpg-oli_rice-rss.xml
+++ b/apps/www/public/planetpg-oli_rice-rss.xml
@@ -5,49 +5,49 @@
https://supabase.com/blog
Latest Postgres news from Oliver Rice at Supabaseen
- Thu, 20 Apr 2023 16:00:00 GMT
+ Thu, 20 Apr 2023 23:00:00 GMThttps://supabase.com/blog/whats-new-in-pg-graphql-v1-2What's New in pg_graphql v1.2
https://supabase.com/blog/whats-new-in-pg-graphql-v1-2
New Features in the v1.2 release of pg_graphql
- Thu, 20 Apr 2023 16:00:00 GMT
+ Thu, 20 Apr 2023 23:00:00 GMThttps://supabase.com/blog/type-constraints-in-65-lines-of-sqlType Constraints in 65 lines of SQL
https://supabase.com/blog/type-constraints-in-65-lines-of-sql
Creating validated data types in Postgres
- Thu, 16 Feb 2023 16:00:00 GMT
+ Thu, 16 Feb 2023 23:00:00 GMThttps://supabase.com/blog/pg-graphql-v1pg_graphql v1.0
https://supabase.com/blog/pg-graphql-v1
Announcing the v1.0 release of pg_graphql
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/postgres-foreign-data-wrappers-rustSupabase Wrappers, a Postgres FDW framework written in Rust
https://supabase.com/blog/postgres-foreign-data-wrappers-rust
A framework for building Postgres Foreign Data Wrappers which connects to Stripe, Firebase, Clickhouse, and more.
- Wed, 14 Dec 2022 16:00:00 GMT
+ Wed, 14 Dec 2022 23:00:00 GMThttps://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validationpg_jsonschema: JSON Schema support for Postgres
https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation
Today we're releasing pg_jsonschema, a Postgres extension for JSON validation.
- Thu, 18 Aug 2022 16:00:00 GMT
+ Thu, 18 Aug 2022 23:00:00 GMThttps://supabase.com/blog/postgres-auditPostgres Auditing in 150 lines of SQL
https://supabase.com/blog/postgres-audit
PostgreSQL has a robust set of features which we can leverage to create a generic auditing solution in 150 lines of SQL.
- Mon, 07 Mar 2022 16:00:00 GMT
+ Mon, 07 Mar 2022 23:00:00 GMT
diff --git a/apps/www/public/planetpg-paul_copplestone-rss.xml b/apps/www/public/planetpg-paul_copplestone-rss.xml
index e4aa87e7a4c..c61afa6c121 100644
--- a/apps/www/public/planetpg-paul_copplestone-rss.xml
+++ b/apps/www/public/planetpg-paul_copplestone-rss.xml
@@ -5,49 +5,49 @@
https://supabase.com/blog
Latest Postgres news from Paul Copplestone at Supabaseen
- Sun, 30 Apr 2023 16:00:00 GMT
+ Sun, 30 Apr 2023 23:00:00 GMThttps://supabase.com/blog/postgres-pluggable-strorageNext steps for Postgres pluggable storage
https://supabase.com/blog/postgres-pluggable-strorage
Exploring history of Postgres pluggable storage and the possibility of landing it in the Postgres core.
- Sun, 30 Apr 2023 16:00:00 GMT
+ Sun, 30 Apr 2023 23:00:00 GMThttps://supabase.com/blog/postgres-foreign-data-wrappers-rustSupabase Wrappers, a Postgres FDW framework written in Rust
https://supabase.com/blog/postgres-foreign-data-wrappers-rust
A framework for building Postgres Foreign Data Wrappers which connects to Stripe, Firebase, Clickhouse, and more.
- Wed, 14 Dec 2022 16:00:00 GMT
+ Wed, 14 Dec 2022 23:00:00 GMThttps://supabase.com/blog/postgres-crdtpg_crdt - an experimental CRDT extension for Postgres
https://supabase.com/blog/postgres-crdt
Embedding Yjs and Automerge into Postgres for collaborative applications.
- Fri, 09 Dec 2022 16:00:00 GMT
+ Fri, 09 Dec 2022 23:00:00 GMThttps://supabase.com/blog/partial-postgresql-data-dumps-with-rlsPartial data dumps using Postgres Row Level Security
https://supabase.com/blog/partial-postgresql-data-dumps-with-rls
Using RLS to create seed files for local PostgreSQL testing.
- Mon, 27 Jun 2022 16:00:00 GMT
+ Mon, 27 Jun 2022 23:00:00 GMThttps://supabase.com/blog/postgres-as-a-cron-serverPostgres as a CRON Server
https://supabase.com/blog/postgres-as-a-cron-server
Running repetitive tasks with your Postgres database.
- Thu, 04 Mar 2021 16:00:00 GMT
+ Thu, 04 Mar 2021 23:00:00 GMThttps://supabase.com/blog/postgresql-viewsPostgres Views
https://supabase.com/blog/postgresql-views
Creating and using a view in PostgreSQL.
- Tue, 17 Nov 2020 16:00:00 GMT
+ Tue, 17 Nov 2020 23:00:00 GMT
diff --git a/apps/www/public/planetpg-pavel-rss.xml b/apps/www/public/planetpg-pavel-rss.xml
index 65fe235548f..44ff28fb261 100644
--- a/apps/www/public/planetpg-pavel-rss.xml
+++ b/apps/www/public/planetpg-pavel-rss.xml
@@ -5,21 +5,21 @@
https://supabase.com/blog
Latest Postgres news from Pavel Borisov at Supabaseen
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/new-in-postgres-15What's new in Postgres 15?
https://supabase.com/blog/new-in-postgres-15
Describes the release of Postgres 15, new features and reasons to use it
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/postgresql-commitfestWhat is PostgreSQL commitfest and how to contribute
https://supabase.com/blog/postgresql-commitfest
A time-tested method for contributing to the core Postgres code
- Wed, 26 Oct 2022 16:00:00 GMT
+ Wed, 26 Oct 2022 23:00:00 GMT
diff --git a/apps/www/public/planetpg-steve_chavez-rss.xml b/apps/www/public/planetpg-steve_chavez-rss.xml
index 3fa9a2969f4..bfd508bd218 100644
--- a/apps/www/public/planetpg-steve_chavez-rss.xml
+++ b/apps/www/public/planetpg-steve_chavez-rss.xml
@@ -5,21 +5,21 @@
https://supabase.com/blog
Latest Postgres news from Steve Chavez at Supabaseen
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/postgrest-11-prereleasePostgREST 11 pre-release
https://supabase.com/blog/postgrest-11-prerelease
Describes new features of PostgREST 11 pre-release
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/roles-postgres-hooksProtecting reserved roles with PostgreSQL Hooks
https://supabase.com/blog/roles-postgres-hooks
Using Postgres Hooks to protect functionality in your Postgres database.
- Thu, 01 Jul 2021 16:00:00 GMT
+ Thu, 01 Jul 2021 23:00:00 GMT
diff --git a/apps/www/public/planetpg-victor-rss.xml b/apps/www/public/planetpg-victor-rss.xml
index a5d33f9feaf..57f800fbe3d 100644
--- a/apps/www/public/planetpg-victor-rss.xml
+++ b/apps/www/public/planetpg-victor-rss.xml
@@ -5,28 +5,28 @@
https://supabase.com/blog
Latest Postgres news from Victor at Supabaseen
- Thu, 13 Oct 2022 16:00:00 GMT
+ Thu, 13 Oct 2022 23:00:00 GMThttps://supabase.com/blog/postgres-full-text-search-vs-the-restPostgres Full Text Search vs the rest
https://supabase.com/blog/postgres-full-text-search-vs-the-rest
Comparing one of the most popular Postgres features against alternatives
- Thu, 13 Oct 2022 16:00:00 GMT
+ Thu, 13 Oct 2022 23:00:00 GMThttps://supabase.com/blog/choosing-a-postgres-primary-keyChoosing a Postgres Primary Key
https://supabase.com/blog/choosing-a-postgres-primary-key
Turns out the question of which identifier to use as a Primary Key is complicated -- we're going to dive into some of the complexity and inherent trade-offs, and figure things out
- Wed, 07 Sep 2022 16:00:00 GMT
+ Wed, 07 Sep 2022 23:00:00 GMThttps://supabase.com/blog/seen-by-in-postgresqlImplementing "seen by" functionality with Postgres
https://supabase.com/blog/seen-by-in-postgresql
Different approaches for tracking visitor counts with PostgreSQL.
- Sun, 17 Jul 2022 16:00:00 GMT
+ Sun, 17 Jul 2022 23:00:00 GMT
diff --git a/apps/www/public/rss.xml b/apps/www/public/rss.xml
index e365f1a0ef6..1ad54bccef2 100644
--- a/apps/www/public/rss.xml
+++ b/apps/www/public/rss.xml
@@ -5,1302 +5,1316 @@
https://supabase.com
Latest news from Supabaseen
- Thu, 08 Jun 2023 16:00:00 GMT
+ Wed, 05 Jul 2023 23:00:00 GMT
+ https://supabase.com/blog/supabase-beta-update-june-2023
+ Supabase Beta June 2023
+ https://supabase.com/blog/supabase-beta-update-june-2023
+ A plethora of announcements... read till the end to find out when is the new Launch Week
+ Wed, 05 Jul 2023 23:00:00 GMT
+
+
+ https://supabase.com/blog/native-mobile-auth
+ Native Mobile Auth Support for Google and Apple Sign in
+ https://supabase.com/blog/native-mobile-auth
+ Supabase auth adds full support for native mobile sign in with Apple and Google.
+ Mon, 26 Jun 2023 23:00:00 GMT
+
+https://supabase.com/blog/supabase-beta-update-may-2023Supabase Beta May 2023
https://supabase.com/blog/supabase-beta-update-may-2023
Learn about the great things we shipped last month. Spoiler alert... lots of AI.
- Thu, 08 Jun 2023 16:00:00 GMT
+ Thu, 08 Jun 2023 23:00:00 GMThttps://supabase.com/blog/vecsSupabase Vecs: a vector client for Postgres
https://supabase.com/blog/vecs
Introducing Supabase Vecs, a PostgreSQL vector client
- Sun, 28 May 2023 16:00:00 GMT
+ Sun, 28 May 2023 23:00:00 GMThttps://supabase.com/blog/flutter-hackathon-winnersFlutter Hackathon Winners
https://supabase.com/blog/flutter-hackathon-winners
Announcing the winners of the Flutter Hackathon!
- Sun, 28 May 2023 16:00:00 GMT
+ Sun, 28 May 2023 23:00:00 GMThttps://supabase.com/blog/chatgpt-plugins-support-postgresChatGPT plugins now support Postgres & Supabase
https://supabase.com/blog/chatgpt-plugins-support-postgres
Supabase recently contributed to the OpenAI Retrieval Plugin repo with a Postgres and a Supabase implementation to help developers build ChatGPT plugins using pgvector.
- Wed, 24 May 2023 16:00:00 GMT
+ Wed, 24 May 2023 23:00:00 GMThttps://supabase.com/blog/building-chatgpt-plugins-templateBuilding ChatGPT Plugins with Supabase Edge Runtime
https://supabase.com/blog/building-chatgpt-plugins-template
We're releasing a ChatGPT plugin template written in TypeScript and running on Deno!
- Sun, 14 May 2023 16:00:00 GMT
+ Sun, 14 May 2023 23:00:00 GMThttps://supabase.com/blog/flutter-hackathonFlutter Hackathon
https://supabase.com/blog/flutter-hackathon
Build Flutter apps and win limited edition swag.
- Thu, 11 May 2023 16:00:00 GMT
+ Thu, 11 May 2023 23:00:00 GMThttps://supabase.com/blog/supabase-beta-update-april-2023Supabase Beta April 2023
https://supabase.com/blog/supabase-beta-update-april-2023
A review of Launch Week 7 and more exciting updates from last month.
- Mon, 08 May 2023 16:00:00 GMT
+ Mon, 08 May 2023 23:00:00 GMThttps://supabase.com/blog/flutter-multi-factor-authenticationSecuring your Flutter apps with Multi-Factor Authentication
https://supabase.com/blog/flutter-multi-factor-authentication
Build a Flutter app where the user is required to authenticate using Multi-Factor Authentication.
- Wed, 03 May 2023 16:00:00 GMT
+ Wed, 03 May 2023 23:00:00 GMThttps://supabase.com/blog/postgres-pluggable-strorageNext steps for Postgres pluggable storage
https://supabase.com/blog/postgres-pluggable-strorage
Exploring history of Postgres pluggable storage and the possibility of landing it in the Postgres core.
- Sun, 30 Apr 2023 16:00:00 GMT
+ Sun, 30 Apr 2023 23:00:00 GMThttps://supabase.com/blog/launch-week-7-hackathon-winnersLaunch Week 7 Hackathon Winners
https://supabase.com/blog/launch-week-7-hackathon-winners
Announcing the winners of the Launch Week 7 Hackathon!
- Sun, 23 Apr 2023 16:00:00 GMT
+ Sun, 23 Apr 2023 23:00:00 GMThttps://supabase.com/blog/whats-new-in-pg-graphql-v1-2What's New in pg_graphql v1.2
https://supabase.com/blog/whats-new-in-pg-graphql-v1-2
New Features in the v1.2 release of pg_graphql
- Thu, 20 Apr 2023 16:00:00 GMT
+ Thu, 20 Apr 2023 23:00:00 GMThttps://supabase.com/blog/supabase-studio-2.0Supabase Studio 2.0: help when you need it most
https://supabase.com/blog/supabase-studio-2.0
Supabase Studio now comes with ChatGPT, and GraphiQL built in, Cascade Deletes, and Foreign Key Selectors, and much more.
- Thu, 13 Apr 2023 16:00:00 GMT
+ Thu, 13 Apr 2023 23:00:00 GMThttps://supabase.com/blog/dbdevdbdev: PostgreSQL Package Manager
https://supabase.com/blog/dbdev
We're publicly previewing dbdev, a PostgreSQL package manager.
- Thu, 13 Apr 2023 16:00:00 GMT
+ Thu, 13 Apr 2023 23:00:00 GMThttps://supabase.com/blog/pg-tleTrusted Language Extensions for Postgres
https://supabase.com/blog/pg-tle
We're collaborating with AWS to bring Trusted Language Extensions to Postgres.
- Thu, 13 Apr 2023 16:00:00 GMT
+ Thu, 13 Apr 2023 23:00:00 GMThttps://supabase.com/blog/launch-week-7-community-highlightsLaunch Week 7 Community Highlights
https://supabase.com/blog/launch-week-7-community-highlights
We're honored to work with, sponsor, and support incredible people and tools. Here is a highlight of the last 3 months.
- Thu, 13 Apr 2023 16:00:00 GMT
+ Thu, 13 Apr 2023 23:00:00 GMThttps://supabase.com/blog/supabase-auth-sso-pkceSupabase Auth: SSO, Mobile, and Server-side support
https://supabase.com/blog/supabase-auth-sso-pkce
Supacharging Supabase Auth with Sign in with Apple on iOS, Single-Sign-On support with SAML 2.0, and PKCE for server-side rendering and mobile auth.
- Wed, 12 Apr 2023 16:00:00 GMT
+ Wed, 12 Apr 2023 23:00:00 GMThttps://supabase.com/blog/storage-v3-resumable-uploadsSupabase Storage v3: Resumable Uploads with support for 50GB files
https://supabase.com/blog/storage-v3-resumable-uploads
Storage V3 with lots of new features including resumable uploads, more image transformationsm a Next.js image loader and more.
- Tue, 11 Apr 2023 16:00:00 GMT
+ Tue, 11 Apr 2023 23:00:00 GMThttps://supabase.com/blog/edge-runtime-self-hosted-deno-functionsSupabase Edge Runtime: Self-hosted Deno Functions
https://supabase.com/blog/edge-runtime-self-hosted-deno-functions
We are open-sourcing Supabase Edge Runtime allowing you to host your Edge Functions anywhere.
- Mon, 10 Apr 2023 16:00:00 GMT
+ Mon, 10 Apr 2023 23:00:00 GMThttps://supabase.com/blog/supabase-logs-self-hostedSupabase Logs: open source logging server
https://supabase.com/blog/supabase-logs-self-hosted
We're releasing Supabase Logs for both self-hosted users and CLI development.
- Sun, 09 Apr 2023 16:00:00 GMT
+ Sun, 09 Apr 2023 23:00:00 GMThttps://supabase.com/blog/supabase-beta-update-march-2023Supabase Beta March 2023
https://supabase.com/blog/supabase-beta-update-march-2023
We are in full shipping mode 🛥️… Launch Week 7 can’t come quickly enough!
- Fri, 07 Apr 2023 16:00:00 GMT
+ Fri, 07 Apr 2023 23:00:00 GMThttps://supabase.com/blog/launch-week-7-hackathonThe Supabase AI Hackathon
https://supabase.com/blog/launch-week-7-hackathon
Build an Open Source Project over 10 days. 5 prize categories.
- Thu, 06 Apr 2023 16:00:00 GMT
+ Thu, 06 Apr 2023 23:00:00 GMThttps://supabase.com/blog/designing-with-ai-midjourneyDesigning with AI: Generating unique artwork for every user
https://supabase.com/blog/designing-with-ai-midjourney
Using MidJourney to generative artwork and serving ticket images with Edge Functions
- Thu, 06 Apr 2023 16:00:00 GMT
+ Thu, 06 Apr 2023 23:00:00 GMThttps://supabase.com/blog/infinite-scroll-with-nextjs-framer-motionInfinite scroll with Next.js, Framer Motion, and Supabase
https://supabase.com/blog/infinite-scroll-with-nextjs-framer-motion
Lazy load and paginate data on scroll with Next.js and a sprinkle of Framer Motion magic ✨
- Mon, 03 Apr 2023 16:00:00 GMT
+ Mon, 03 Apr 2023 23:00:00 GMThttps://supabase.com/blog/supaclubSupaClub
https://supabase.com/blog/supaclub
The Worlds First Software Engineering Nightclub.
- Fri, 31 Mar 2023 16:00:00 GMT
+ Fri, 31 Mar 2023 23:00:00 GMThttps://supabase.com/blog/supabase-beta-update-february-2023Supabase Beta February 2023
https://supabase.com/blog/supabase-beta-update-february-2023
There is something for everybody this month - AI, Auth, Database, Edge Functions, GraphQL … you name it!
- Wed, 08 Mar 2023 16:00:00 GMT
+ Wed, 08 Mar 2023 23:00:00 GMThttps://supabase.com/blog/geo-queries-with-postgis-in-ionic-angularGeo Queries with PostGIS in Ionic Angular
https://supabase.com/blog/geo-queries-with-postgis-in-ionic-angular
Using the PostGIS extension to build a cross-platform application with Ionic Angular.
- Tue, 28 Feb 2023 16:00:00 GMT
+ Tue, 28 Feb 2023 23:00:00 GMThttps://supabase.com/blog/type-constraints-in-65-lines-of-sqlType Constraints in 65 lines of SQL
https://supabase.com/blog/type-constraints-in-65-lines-of-sql
Creating validated data types in Postgres
- Thu, 16 Feb 2023 16:00:00 GMT
+ Thu, 16 Feb 2023 23:00:00 GMThttps://supabase.com/blog/case-study-happyteamsHappyTeams unlocks better performance and reduces cost with Supabase
https://supabase.com/blog/case-study-happyteams
How a bootstrapped startup migrated from Heroku to Supabase in 30 minutes and never looked back
- Wed, 15 Feb 2023 16:00:00 GMT
+ Wed, 15 Feb 2023 23:00:00 GMThttps://supabase.com/blog/flutter-real-time-multiplayer-gameHow to build a real-time multiplayer game with Flutter Flame
https://supabase.com/blog/flutter-real-time-multiplayer-game
Build a real-time multiplayer game using Flutter, Flame, and Supabase realtime.
- Mon, 13 Feb 2023 16:00:00 GMT
+ Mon, 13 Feb 2023 23:00:00 GMThttps://supabase.com/blog/supabase-beta-january-2023Supabase Beta January 2023
https://supabase.com/blog/supabase-beta-january-2023
New Postgres extensions, pg_graphql updates, changes to Edge Functions, and more!
- Tue, 07 Feb 2023 16:00:00 GMT
+ Tue, 07 Feb 2023 23:00:00 GMThttps://supabase.com/blog/chatgpt-supabase-docsSupabase Clippy: ChatGPT for Supabase Docs
https://supabase.com/blog/chatgpt-supabase-docs
Creating a ChatGPT interface for the Supabase documentation.
- Mon, 06 Feb 2023 16:00:00 GMT
+ Mon, 06 Feb 2023 23:00:00 GMThttps://supabase.com/blog/openai-embeddings-postgres-vectorStoring OpenAI embeddings in Postgres with pgvector
https://supabase.com/blog/openai-embeddings-postgres-vector
An example of how to build an AI-powered search engine using OpenAI's embeddings and PostgreSQL.
- Sun, 05 Feb 2023 16:00:00 GMT
+ Sun, 05 Feb 2023 23:00:00 GMThttps://supabase.com/blog/supabase-beta-december-2022Supabase Beta December 2022
https://supabase.com/blog/supabase-beta-december-2022
This month the Beta Update is a Launch Week 6 Special, where we review the cascade of announcements.
- Wed, 04 Jan 2023 16:00:00 GMT
+ Wed, 04 Jan 2023 23:00:00 GMThttps://supabase.com/blog/launch-week-6-hackathon-winnersLaunch Week 6 Hackathon Winners
https://supabase.com/blog/launch-week-6-hackathon-winners
Announcing the winners of the Launch Week 6 Hackathon!
- Mon, 02 Jan 2023 16:00:00 GMT
+ Mon, 02 Jan 2023 23:00:00 GMThttps://supabase.com/blog/vault-now-in-betaSupabase Vault is now in Beta
https://supabase.com/blog/vault-now-in-beta
A Postgres extension to store encrypted secrets and encrypt data.
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/postgrest-11-prereleasePostgREST 11 pre-release
https://supabase.com/blog/postgrest-11-prerelease
Describes new features of PostgREST 11 pre-release
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/postgres-point-in-time-recoveryPoint in Time Recovery is now available for Pro projects
https://supabase.com/blog/postgres-point-in-time-recovery
We're making PITR available for more projects, with a new Dashboard UI that makes it simple to use.
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/pg-graphql-v1pg_graphql v1.0
https://supabase.com/blog/pg-graphql-v1
Announcing the v1.0 release of pg_graphql
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/new-in-postgres-15What's new in Postgres 15?
https://supabase.com/blog/new-in-postgres-15
Describes the release of Postgres 15, new features and reasons to use it
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/launch-week-6-wrap-upLaunch Week 6: Wrap Up
https://supabase.com/blog/launch-week-6-wrap-up
That's a wrap on Supabase Launch Week Day 6. Here's everything we shipped in one long blog post.
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/launch-week-6-community-dayCommunity Day
https://supabase.com/blog/launch-week-6-community-day
Wrapping up Launch Week 6 with contributors, partners, and friends.
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/custom-domain-namesCustom Domain Names
https://supabase.com/blog/custom-domain-names
Change your Supabase project's domain name to your own domain.
- Thu, 15 Dec 2022 16:00:00 GMT
+ Thu, 15 Dec 2022 23:00:00 GMThttps://supabase.com/blog/postgres-foreign-data-wrappers-rustSupabase Wrappers, a Postgres FDW framework written in Rust
https://supabase.com/blog/postgres-foreign-data-wrappers-rust
A framework for building Postgres Foreign Data Wrappers which connects to Stripe, Firebase, Clickhouse, and more.
- Wed, 14 Dec 2022 16:00:00 GMT
+ Wed, 14 Dec 2022 23:00:00 GMThttps://supabase.com/blog/mfa-auth-via-rlsMulti-factor Authentication via Row Level Security Enforcement
https://supabase.com/blog/mfa-auth-via-rls
MFA Auth with enforcement via RLS
- Tue, 13 Dec 2022 16:00:00 GMT
+ Tue, 13 Dec 2022 23:00:00 GMThttps://supabase.com/blog/storage-image-resizing-smart-cdnSupabase Storage v2: Image resizing and Smart CDN
https://supabase.com/blog/storage-image-resizing-smart-cdn
We're introducing new features for Supabase Storage: Image resizing and a Smart CDN.
- Mon, 12 Dec 2022 16:00:00 GMT
+ Mon, 12 Dec 2022 23:00:00 GMThttps://supabase.com/blog/new-supabase-docs-built-with-nextjsNew Supabase Docs, built with Next.js
https://supabase.com/blog/new-supabase-docs-built-with-nextjs
We've redesigned our Docs and migrated to Next.js
- Sun, 11 Dec 2022 16:00:00 GMT
+ Sun, 11 Dec 2022 23:00:00 GMThttps://supabase.com/blog/postgres-crdtpg_crdt - an experimental CRDT extension for Postgres
https://supabase.com/blog/postgres-crdt
Embedding Yjs and Automerge into Postgres for collaborative applications.
- Fri, 09 Dec 2022 16:00:00 GMT
+ Fri, 09 Dec 2022 23:00:00 GMThttps://supabase.com/blog/who-we-hireWho We Hire at Supabase
https://supabase.com/blog/who-we-hire
Traits we look for to maintain a culture of shipping fast and often
- Thu, 08 Dec 2022 16:00:00 GMT
+ Thu, 08 Dec 2022 23:00:00 GMThttps://supabase.com/blog/launch-week-6-hackathonLaunch Week 6 Hackathon
https://supabase.com/blog/launch-week-6-hackathon
Build an Open Source Project, Win $1500 and the Supabase Darkmode Keyboard
- Thu, 08 Dec 2022 16:00:00 GMT
+ Thu, 08 Dec 2022 23:00:00 GMThttps://supabase.com/blog/supabase-beta-november-2022Supabase Beta November 2022
https://supabase.com/blog/supabase-beta-november-2022
We are preparing everything for Launch Week 6, but we still had time to ship some goodies this month!
- Tue, 06 Dec 2022 16:00:00 GMT
+ Tue, 06 Dec 2022 23:00:00 GMThttps://supabase.com/blog/the-supabase-content-stormThe Supabase Content Storm
https://supabase.com/blog/the-supabase-content-storm
We worked with +30 content creators to drop a mountain of content simultaneously.
- Mon, 05 Dec 2022 16:00:00 GMT
+ Mon, 05 Dec 2022 23:00:00 GMThttps://supabase.com/blog/transparent-column-encryption-with-postgresTransparent Column Encryption with Postgres
https://supabase.com/blog/transparent-column-encryption-with-postgres
Using pgsodium's Transparent Column Encryption to encrypt data and provide your users with row-level encryption.
- Wed, 30 Nov 2022 16:00:00 GMT
+ Wed, 30 Nov 2022 23:00:00 GMThttps://supabase.com/blog/sql-or-nosql-both-with-postgresqlSQL or NoSQL? Why not use both (with PostgreSQL)?
https://supabase.com/blog/sql-or-nosql-both-with-postgresql
How to turn Postgres into an easy-to-use NoSQL database that retains all the power of SQL
- Wed, 23 Nov 2022 16:00:00 GMT
+ Wed, 23 Nov 2022 23:00:00 GMThttps://supabase.com/blog/flutter-authentication-and-authorization-with-rlsFlutter Authentication and Authorization with RLS
https://supabase.com/blog/flutter-authentication-and-authorization-with-rls
Learn how you can secure your Flutter app using Supabase Row Level Security.
- Mon, 21 Nov 2022 16:00:00 GMT
+ Mon, 21 Nov 2022 23:00:00 GMThttps://supabase.com/blog/fetching-and-caching-supabase-data-in-next-js-server-componentsFetching and caching Supabase data in Next.js 13 Server Components
https://supabase.com/blog/fetching-and-caching-supabase-data-in-next-js-server-components
Next.js 13 introduces new data fetching and caching methods to enable React Server Components and Suspense.
- Wed, 16 Nov 2022 16:00:00 GMT
+ Wed, 16 Nov 2022 23:00:00 GMThttps://supabase.com/blog/authentication-in-ionic-angularAuthentication in Ionic Angular with Supabase
https://supabase.com/blog/authentication-in-ionic-angular
Learn how to build an Ionic Angular app with authentication, Row Level Security, and Magic Link auth.
- Mon, 07 Nov 2022 16:00:00 GMT
+ Mon, 07 Nov 2022 23:00:00 GMThttps://supabase.com/blog/supabase-beta-update-october-2022Supabase Beta October 2022
https://supabase.com/blog/supabase-beta-update-october-2022
New SDKs, quickstarts, Functions tricks, and more. But, more importantly, Launch Week 6️ has a date!
- Tue, 01 Nov 2022 16:00:00 GMT
+ Tue, 01 Nov 2022 23:00:00 GMThttps://supabase.com/blog/postgresql-commitfestWhat is PostgreSQL commitfest and how to contribute
https://supabase.com/blog/postgresql-commitfest
A time-tested method for contributing to the core Postgres code
- Wed, 26 Oct 2022 16:00:00 GMT
+ Wed, 26 Oct 2022 23:00:00 GMThttps://supabase.com/blog/supabase-flutter-sdk-v1-releasedsupabase-flutter v1 Released
https://supabase.com/blog/supabase-flutter-sdk-v1-released
We've released supabase-flutter v1. More intuitive way of accessing Supabase from your Flutter application.
- Thu, 20 Oct 2022 16:00:00 GMT
+ Thu, 20 Oct 2022 23:00:00 GMThttps://supabase.com/blog/supabase-js-v2-releasedsupabase-js v2 Released
https://supabase.com/blog/supabase-js-v2-released
We've released supabase-js v2. Updated examples, quickstarts, and an improved experience.
- Wed, 19 Oct 2022 16:00:00 GMT
+ Wed, 19 Oct 2022 23:00:00 GMThttps://supabase.com/blog/postgres-full-text-search-vs-the-restPostgres Full Text Search vs the rest
https://supabase.com/blog/postgres-full-text-search-vs-the-rest
Comparing one of the most popular Postgres features against alternatives
- Thu, 13 Oct 2022 16:00:00 GMT
+ Thu, 13 Oct 2022 23:00:00 GMThttps://supabase.com/blog/supabase-beta-update-september-2022Supabase Beta September 2022
https://supabase.com/blog/supabase-beta-update-september-2022
We were too focused on clearing out the backlog so we didn't ship anything new last month... or did we?!
- Tue, 04 Oct 2022 16:00:00 GMT
+ Tue, 04 Oct 2022 23:00:00 GMThttps://supabase.com/blog/postgres-wasmPostgres WASM by Snaplet and Supabase
https://supabase.com/blog/postgres-wasm
We're open sourcing postgres-wasm, a PostgresQL server that runs inside a browser, with our friends at Snaplet.
- Sun, 02 Oct 2022 16:00:00 GMT
+ Sun, 02 Oct 2022 23:00:00 GMThttps://supabase.com/blog/choosing-a-postgres-primary-keyChoosing a Postgres Primary Key
https://supabase.com/blog/choosing-a-postgres-primary-key
Turns out the question of which identifier to use as a Primary Key is complicated -- we're going to dive into some of the complexity and inherent trade-offs, and figure things out
- Wed, 07 Sep 2022 16:00:00 GMT
+ Wed, 07 Sep 2022 23:00:00 GMThttps://supabase.com/blog/supabase-beta-update-august-2022Supabase Beta August 2022
https://supabase.com/blog/supabase-beta-update-august-2022
Launch Week Special. See everything we shipped, plus winners of the Hackathon and the extended Community Highlights
- Tue, 06 Sep 2022 16:00:00 GMT
+ Tue, 06 Sep 2022 23:00:00 GMThttps://supabase.com/blog/launch-week-5-hackathon-winnersLaunch Week 5 Hackathon Winners
https://supabase.com/blog/launch-week-5-hackathon-winners
Announcing the winners of the Launch Week 5 Hackathon!
- Wed, 24 Aug 2022 16:00:00 GMT
+ Wed, 24 Aug 2022 23:00:00 GMThttps://supabase.com/blog/building-a-realtime-trello-board-with-supabase-and-angularBuilding a Realtime Trello Board with Supabase and Angular
https://supabase.com/blog/building-a-realtime-trello-board-with-supabase-and-angular
Go beyond the hello world example with this real world project.
- Tue, 23 Aug 2022 16:00:00 GMT
+ Tue, 23 Aug 2022 23:00:00 GMThttps://supabase.com/blog/supabase-vaultSupabase Vault
https://supabase.com/blog/supabase-vault
Today we're announcing Vault, a Postgres extension for managing secrets and encryption inside your database.
- Thu, 18 Aug 2022 16:00:00 GMT
+ Thu, 18 Aug 2022 23:00:00 GMThttps://supabase.com/blog/postgrest-v10PostgREST v10: EXPLAIN and Improved Relationship Detection
https://supabase.com/blog/postgrest-v10
Today, PostgREST 10 was released. Let's take a look at some of the new features that go hand in hand with supabase-js v2.
- Thu, 18 Aug 2022 16:00:00 GMT
+ Thu, 18 Aug 2022 23:00:00 GMThttps://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validationpg_jsonschema: JSON Schema support for Postgres
https://supabase.com/blog/pg-jsonschema-a-postgres-extension-for-json-validation
Today we're releasing pg_jsonschema, a Postgres extension for JSON validation.
- Thu, 18 Aug 2022 16:00:00 GMT
+ Thu, 18 Aug 2022 23:00:00 GMThttps://supabase.com/blog/launch-week-5-one-more-thingOne more thing
https://supabase.com/blog/launch-week-5-one-more-thing
Let's be honest, it's never just one more thing.
- Thu, 18 Aug 2022 16:00:00 GMT
+ Thu, 18 Aug 2022 23:00:00 GMThttps://supabase.com/blog/launch-week-5-community-dayCommunity Day
https://supabase.com/blog/launch-week-5-community-day
Wrapping up Launch Week 5 with contributors, partners, and friends.
- Thu, 18 Aug 2022 16:00:00 GMT
+ Thu, 18 Aug 2022 23:00:00 GMThttps://supabase.com/blog/supabase-realtime-multiplayer-general-availabilityRealtime: Multiplayer Edition
https://supabase.com/blog/supabase-realtime-multiplayer-general-availability
Announcing the general availability of Realtime's Broadcast and Presence.
- Wed, 17 Aug 2022 16:00:00 GMT
+ Wed, 17 Aug 2022 23:00:00 GMThttps://supabase.com/blog/supabase-soc2Supabase is SOC2 compliant
https://supabase.com/blog/supabase-soc2
Supabase is now SOC2 compliant. Learn how we got here and what it means for our customers.
- Tue, 16 Aug 2022 16:00:00 GMT
+ Tue, 16 Aug 2022 23:00:00 GMThttps://supabase.com/blog/supabase-js-v2supabase-js v2
https://supabase.com/blog/supabase-js-v2
A look at supabase-js v2, which brings type support and focuses on quality-of-life improvements for developers.
- Mon, 15 Aug 2022 16:00:00 GMT
+ Mon, 15 Aug 2022 23:00:00 GMThttps://supabase.com/blog/supabase-cli-v1-and-admin-api-betaSupabase CLI v1 and Management API Beta
https://supabase.com/blog/supabase-cli-v1-and-admin-api-beta
We are moving Supabase CLI v1 out of beta, and releasing Management API beta.
- Sun, 14 Aug 2022 16:00:00 GMT
+ Sun, 14 Aug 2022 23:00:00 GMThttps://supabase.com/blog/supabase-series-bSupabase Series B
https://supabase.com/blog/supabase-series-b
Supabase raised $80M in May, bringing our total funding to $116M.
- Thu, 11 Aug 2022 16:00:00 GMT
+ Thu, 11 Aug 2022 23:00:00 GMThttps://supabase.com/blog/launch-week-5-hackathonLaunch Week 5 Hackathon
https://supabase.com/blog/launch-week-5-hackathon
Build to win $1500 - Friday 12th to Monday 21st August 2022
- Tue, 09 Aug 2022 16:00:00 GMT
+ Tue, 09 Aug 2022 23:00:00 GMThttps://supabase.com/blog/slack-consolidate-slackbot-to-consolidate-messagesSlack Consolidate: a slackbot built with Python and Supabase
https://supabase.com/blog/slack-consolidate-slackbot-to-consolidate-messages
A slackbot to consolidate messages from different channels using Supabase, Slack SDK and Python
- Mon, 08 Aug 2022 16:00:00 GMT
+ Mon, 08 Aug 2022 23:00:00 GMThttps://supabase.com/blog/supabase-beta-update-july-2022Supabase Beta July 2022
https://supabase.com/blog/supabase-beta-update-july-2022
Launch Week Golden Tickets, Flutter SDK 1.0 Developer Preview and more...
- Tue, 02 Aug 2022 16:00:00 GMT
+ Tue, 02 Aug 2022 23:00:00 GMThttps://supabase.com/blog/supabase-flutter-sdk-1-developer-previewSupabase Flutter SDK 1.0 Developer Preview
https://supabase.com/blog/supabase-flutter-sdk-1-developer-preview
Supabase Flutter SDK is getting a major update and we need your help making it better.
- Mon, 01 Aug 2022 16:00:00 GMT
+ Mon, 01 Aug 2022 23:00:00 GMThttps://supabase.com/blog/seen-by-in-postgresqlImplementing "seen by" functionality with Postgres
https://supabase.com/blog/seen-by-in-postgresql
Different approaches for tracking visitor counts with PostgreSQL.
- Sun, 17 Jul 2022 16:00:00 GMT
+ Sun, 17 Jul 2022 23:00:00 GMThttps://supabase.com/blog/supabase-auth-helpers-with-sveltekit-supportRevamped Auth Helpers for Supabase (with SvelteKit support)
https://supabase.com/blog/supabase-auth-helpers-with-sveltekit-support
Supabase Auth Helpers now have improved developer experience, Sveltekit support, and more.
- Tue, 12 Jul 2022 16:00:00 GMT
+ Tue, 12 Jul 2022 23:00:00 GMThttps://supabase.com/blog/beta-update-june-2022Supabase Beta June 2022
https://supabase.com/blog/beta-update-june-2022
Auth Helpers, Unlimited Free Projects, CLI and more...
- Tue, 05 Jul 2022 16:00:00 GMT
+ Tue, 05 Jul 2022 23:00:00 GMThttps://supabase.com/blog/flutter-tutorial-building-a-chat-appFlutter Tutorial: building a Flutter chat app
https://supabase.com/blog/flutter-tutorial-building-a-chat-app
Learn how to build a Flutter chat app with open source and scalable backend (inc. auth, realtime, database, and more).
- Wed, 29 Jun 2022 16:00:00 GMT
+ Wed, 29 Jun 2022 23:00:00 GMThttps://supabase.com/blog/visualizing-supabase-data-using-metabaseVisualizing Supabase Data using Metabase
https://supabase.com/blog/visualizing-supabase-data-using-metabase
How to create different kinds of charts out of data stored in Supabase using Metabase.
- Tue, 28 Jun 2022 16:00:00 GMT
+ Tue, 28 Jun 2022 23:00:00 GMThttps://supabase.com/blog/partial-postgresql-data-dumps-with-rlsPartial data dumps using Postgres Row Level Security
https://supabase.com/blog/partial-postgresql-data-dumps-with-rls
Using RLS to create seed files for local PostgreSQL testing.
- Mon, 27 Jun 2022 16:00:00 GMT
+ Mon, 27 Jun 2022 23:00:00 GMThttps://supabase.com/blog/loading-data-supabase-pythonPython data loading with Supabase
https://supabase.com/blog/loading-data-supabase-python
An example of how to load data into Supabase using supabase-py
- Thu, 16 Jun 2022 16:00:00 GMT
+ Thu, 16 Jun 2022 23:00:00 GMThttps://supabase.com/blog/beta-update-may-2022Supabase Beta May 2022
https://supabase.com/blog/beta-update-may-2022
Product and community updates including wildcard auth redirects, edge functions with webhooks, and Prometheus endpoints for everybody.
- Tue, 31 May 2022 16:00:00 GMT
+ Tue, 31 May 2022 23:00:00 GMThttps://supabase.com/blog/how-supabase-accelerates-development-of-all-pull-togetherHow Mike Lyndon is using Supabase to accelerate development of AllPullTogether
https://supabase.com/blog/how-supabase-accelerates-development-of-all-pull-together
Mike Lyndon is learning web development as he builds AllPullTogether, and Supabase is helping him accelerate what he can accomplish.
- Wed, 25 May 2022 16:00:00 GMT
+ Wed, 25 May 2022 23:00:00 GMThttps://supabase.com/blog/partner-gallery-works-with-supabaseWorks With Supabase - announcing our Partner Gallery
https://supabase.com/blog/partner-gallery-works-with-supabase
Introducing our Partner Gallery - open source and made with Supabase.
- Tue, 19 Apr 2022 16:00:00 GMT
+ Tue, 19 Apr 2022 23:00:00 GMThttps://supabase.com/blog/bring-the-func-hackathon-winnersBring the Func Hackathon Winners 2022
https://supabase.com/blog/bring-the-func-hackathon-winners
Celebrating many amazing OSS Hackathon projects using GraphQL and Edge Functions.
- Sun, 17 Apr 2022 16:00:00 GMT
+ Sun, 17 Apr 2022 23:00:00 GMThttps://supabase.com/blog/beta-update-march-2022Supabase Beta March 2022
https://supabase.com/blog/beta-update-march-2022
Functions, GraphQL, and much more.
- Thu, 14 Apr 2022 16:00:00 GMT
+ Thu, 14 Apr 2022 23:00:00 GMThttps://supabase.com/blog/supabrewSupabrew - Never Code Thirsty
https://supabase.com/blog/supabrew
A light and refreshing non-alcoholic beer for devs.
- Thu, 31 Mar 2022 16:00:00 GMT
+ Thu, 31 Mar 2022 23:00:00 GMThttps://supabase.com/blog/supabase-realtime-with-multiplayer-featuresSupabase Realtime, with Multiplayer Features
https://supabase.com/blog/supabase-realtime-with-multiplayer-features
Today we're announced Realtime, with multiplayer features. Realtime enables broadcast, presence, and listening to database changes delivered over WebSockets.
- Thu, 31 Mar 2022 16:00:00 GMT
+ Thu, 31 Mar 2022 23:00:00 GMThttps://supabase.com/blog/hackathon-bring-the-funcHackathon: Bring the Func(🕺)
https://supabase.com/blog/hackathon-bring-the-func
Build open-source projects with our latest features, win limited edition swag and plant a tree!
- Thu, 31 Mar 2022 16:00:00 GMT
+ Thu, 31 Mar 2022 23:00:00 GMThttps://supabase.com/blog/supabase-edge-functionsEdge Functions are now available in Supabase
https://supabase.com/blog/supabase-edge-functions
Today we're launching Edge Functions. Edge Functions let you execute Typescript code close to your users, no matter where they're located.
- Wed, 30 Mar 2022 16:00:00 GMT
+ Wed, 30 Mar 2022 23:00:00 GMThttps://supabase.com/blog/supabase-enterpriseIntroducing Supabase Enterprise
https://supabase.com/blog/supabase-enterprise
Today we are releasing Supabase Enterprise, a suite of features to scale your project.
- Tue, 29 Mar 2022 16:00:00 GMT
+ Tue, 29 Mar 2022 23:00:00 GMThttps://supabase.com/blog/graphql-now-availableGraphQL is now available in Supabase
https://supabase.com/blog/graphql-now-available
GraphQL support is now in general availability on the Supabase platform via our open source PostgreSQL extension, pg_graphql.
- Mon, 28 Mar 2022 16:00:00 GMT
+ Mon, 28 Mar 2022 23:00:00 GMThttps://supabase.com/blog/community-day-lw4Community Day
https://supabase.com/blog/community-day-lw4
Kicking off Launch Week 4 with contributors, partners, and friends.
- Sun, 27 Mar 2022 16:00:00 GMT
+ Sun, 27 Mar 2022 23:00:00 GMThttps://supabase.com/blog/supabase-launch-week-fourSupabase Launch Week 4
https://supabase.com/blog/supabase-launch-week-four
Launch Week 4: One new feature every day for an entire week. Starting Monday 28th March.
- Thu, 24 Mar 2022 16:00:00 GMT
+ Thu, 24 Mar 2022 23:00:00 GMThttps://supabase.com/blog/should-i-open-source-my-companyShould I Open Source my Company?
https://supabase.com/blog/should-i-open-source-my-company
The unexpected upsides of building in public
- Thu, 24 Mar 2022 16:00:00 GMT
+ Thu, 24 Mar 2022 23:00:00 GMThttps://supabase.com/blog/postgres-auditPostgres Auditing in 150 lines of SQL
https://supabase.com/blog/postgres-audit
PostgreSQL has a robust set of features which we can leverage to create a generic auditing solution in 150 lines of SQL.
- Mon, 07 Mar 2022 16:00:00 GMT
+ Mon, 07 Mar 2022 23:00:00 GMThttps://supabase.com/blog/supabase-beta-january-2022Supabase Beta January 2022
https://supabase.com/blog/supabase-beta-january-2022
New auth providers, SMS providers, and new videos.
- Mon, 21 Feb 2022 16:00:00 GMT
+ Mon, 21 Feb 2022 23:00:00 GMThttps://supabase.com/blog/supabase-beta-december-2021Supabase Beta December 2021
https://supabase.com/blog/supabase-beta-december-2021
New crypto extension, Postgres videos, and a bunch of cool integrations.
- Wed, 19 Jan 2022 16:00:00 GMT
+ Wed, 19 Jan 2022 23:00:00 GMThttps://supabase.com/blog/product-hunt-golden-kitty-awards-2021Golden Kitty Awards Ceremony Watch Party with Supabase
https://supabase.com/blog/product-hunt-golden-kitty-awards-2021
Hang out with us while watching the Product Hunt Golden Kitty Awards Ceremony
- Wed, 19 Jan 2022 16:00:00 GMT
+ Wed, 19 Jan 2022 23:00:00 GMThttps://supabase.com/blog/holiday-hackdays-winners-2021Holiday Hackdays Winners 2021
https://supabase.com/blog/holiday-hackdays-winners-2021
Celebrating many amazing projects submitted to our Holiday Hackdays Hackathon.
- Thu, 16 Dec 2021 16:00:00 GMT
+ Thu, 16 Dec 2021 23:00:00 GMThttps://supabase.com/blog/beta-november-2021-launch-week-recapSupabase Beta November 2021: Launch Week Recap
https://supabase.com/blog/beta-november-2021-launch-week-recap
We wrapped up November with Supabase's third Launch Week. Here's all the awesome stuff that got shipped ...
- Tue, 14 Dec 2021 16:00:00 GMT
+ Tue, 14 Dec 2021 23:00:00 GMThttps://supabase.com/blog/supabase-holiday-hackdays-hackathonKicking off the Holiday Hackdays
https://supabase.com/blog/supabase-holiday-hackdays-hackathon
Build cool stuff and celebrate open-source software with us during the Holiday Hackdays!
- Thu, 02 Dec 2021 16:00:00 GMT
+ Thu, 02 Dec 2021 23:00:00 GMThttps://supabase.com/blog/pg-graphqlpg_graphql: A GraphQL extension for PostgreSQL
https://supabase.com/blog/pg-graphql
GraphQL support is in development for PostgreSQL + Supabase.
- Thu, 02 Dec 2021 16:00:00 GMT
+ Thu, 02 Dec 2021 23:00:00 GMThttps://supabase.com/blog/launch-week-three-friday-five-more-thingsFive more things
https://supabase.com/blog/launch-week-three-friday-five-more-things
It's never just one more thing!
- Thu, 02 Dec 2021 16:00:00 GMT
+ Thu, 02 Dec 2021 23:00:00 GMThttps://supabase.com/blog/supabase-acquires-logflareSupabase acquires Logflare
https://supabase.com/blog/supabase-acquires-logflare
Today, we're ecstatic to announce that Logflare is joining Supabase.
- Wed, 01 Dec 2021 16:00:00 GMT
+ Wed, 01 Dec 2021 23:00:00 GMThttps://supabase.com/blog/realtime-row-level-security-in-postgresqlRealtime Postgres RLS now available on Supabase
https://supabase.com/blog/realtime-row-level-security-in-postgresql
Realtime database changes are now broadcast to authenticated users, respecting the same PostgreSQL policies that you use for Row Level Security.
- Tue, 30 Nov 2021 16:00:00 GMT
+ Tue, 30 Nov 2021 23:00:00 GMThttps://supabase.com/blog/supabase-studioSupabase Studio
https://supabase.com/blog/supabase-studio
The same Dashboard that you're using on our Platform is now available for local development and Self-Hosting.
- Mon, 29 Nov 2021 16:00:00 GMT
+ Mon, 29 Nov 2021 23:00:00 GMThttps://supabase.com/blog/community-day-lw3Community Day
https://supabase.com/blog/community-day-lw3
Kicking off launch week by highlighting the communities around Supabase.
- Sun, 28 Nov 2021 16:00:00 GMT
+ Sun, 28 Nov 2021 23:00:00 GMThttps://supabase.com/blog/whats-new-in-postgres-14New in PostgreSQL 14: What every developer should know
https://supabase.com/blog/whats-new-in-postgres-14
A quick look at some new features and functionality in PostgreSQL 14.
- Sat, 27 Nov 2021 16:00:00 GMT
+ Sat, 27 Nov 2021 23:00:00 GMThttps://supabase.com/blog/postgrest-9PostgREST 9
https://supabase.com/blog/postgrest-9
New features and updates in PostgREST version 9.
- Fri, 26 Nov 2021 16:00:00 GMT
+ Fri, 26 Nov 2021 23:00:00 GMThttps://supabase.com/blog/supabase-launch-week-the-trilogySupabase Launch Week III: Holiday Special
https://supabase.com/blog/supabase-launch-week-the-trilogy
Tis the season to be shipping.
- Thu, 25 Nov 2021 16:00:00 GMT
+ Thu, 25 Nov 2021 23:00:00 GMThttps://supabase.com/blog/supabase-how-we-launchHow we launch at Supabase
https://supabase.com/blog/supabase-how-we-launch
The history and methodology of Supabase Launch Week.
- Thu, 25 Nov 2021 16:00:00 GMT
+ Thu, 25 Nov 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-october-2021Supabase Beta October 2021
https://supabase.com/blog/supabase-beta-october-2021
Three new Auth providers, multi-schema support, and we're gearing up for another Launch Week.
- Sat, 06 Nov 2021 16:00:00 GMT
+ Sat, 06 Nov 2021 23:00:00 GMThttps://supabase.com/blog/supabase-series-aSupabase $30m Series A
https://supabase.com/blog/supabase-series-a
Supabase just raised $30M, bringing our total funding to $36M.
- Wed, 27 Oct 2021 16:00:00 GMT
+ Wed, 27 Oct 2021 23:00:00 GMThttps://supabase.com/blog/replenysh-time-to-value-in-less-than-24-hoursReplenysh uses Supabase to implement OTP in less than 24-hours
https://supabase.com/blog/replenysh-time-to-value-in-less-than-24-hours
Learn how Replenysh uses Supabase to power the circular economy, redefining how brands interact with their customers and products.
- Mon, 18 Oct 2021 16:00:00 GMT
+ Mon, 18 Oct 2021 23:00:00 GMThttps://supabase.com/blog/hacktoberfest-hackathon-winners-2021Hacktoberfest Hackathon Winners 2021
https://supabase.com/blog/hacktoberfest-hackathon-winners-2021
Celebrating many amazing projects submitted to our Hacktoberfest Hackathon.
- Wed, 13 Oct 2021 16:00:00 GMT
+ Wed, 13 Oct 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-sept-2021Supabase Beta Sept 2021
https://supabase.com/blog/supabase-beta-sept-2021
Hackathon, Aborting request, UI updates, and now Hiring.
- Sun, 03 Oct 2021 16:00:00 GMT
+ Sun, 03 Oct 2021 23:00:00 GMThttps://supabase.com/blog/supabase-hacktoberfest-hackathon-2021Supabase Hacktoberfest Hackathon 2021
https://supabase.com/blog/supabase-hacktoberfest-hackathon-2021
We're running another Supabase Hackathon during Hacktoberfest!
- Mon, 27 Sep 2021 16:00:00 GMT
+ Mon, 27 Sep 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-august-2021Supabase Beta August 2021
https://supabase.com/blog/supabase-beta-august-2021
Fundraising, Realtime Security, custom SMS templates, and deployments in South Korea.
- Thu, 09 Sep 2021 16:00:00 GMT
+ Thu, 09 Sep 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-july-2021Supabase Beta July 2021
https://supabase.com/blog/supabase-beta-july-2021
Discord Logins, Vercel Integration, Full text search, and OAuth guides.
- Wed, 11 Aug 2021 16:00:00 GMT
+ Wed, 11 Aug 2021 23:00:00 GMThttps://supabase.com/blog/hackathon-winnersOpen Source Hackathon Winners
https://supabase.com/blog/hackathon-winners
Let the medal ceremony begin for the best projects submitted during the Supabase Hackathon.
- Sun, 08 Aug 2021 16:00:00 GMT
+ Sun, 08 Aug 2021 23:00:00 GMThttps://supabase.com/blog/supabase-swag-storeSupabase Swag Store
https://supabase.com/blog/supabase-swag-store
Today we are officially launching the Supabase Swag Store.
- Thu, 29 Jul 2021 16:00:00 GMT
+ Thu, 29 Jul 2021 23:00:00 GMThttps://supabase.com/blog/supabase-functions-updatesUpdates for Supabase Functions
https://supabase.com/blog/supabase-functions-updates
The question on everyone's mind - are we launching Supabase Functions? Well, it's complicated.
- Thu, 29 Jul 2021 16:00:00 GMT
+ Thu, 29 Jul 2021 23:00:00 GMThttps://supabase.com/blog/1-the-supabase-hackathonThe Supabase Hackathon
https://supabase.com/blog/1-the-supabase-hackathon
A whole week of Hacking for Fun and Prizes.
- Thu, 29 Jul 2021 16:00:00 GMT
+ Thu, 29 Jul 2021 23:00:00 GMThttps://supabase.com/blog/supabase-reports-and-metricsSupabase Reports and Metrics
https://supabase.com/blog/supabase-reports-and-metrics
We're exposing a full set of metrics in your projects, so that you can build better (and faster) products for your users.
- Wed, 28 Jul 2021 16:00:00 GMT
+ Wed, 28 Jul 2021 23:00:00 GMThttps://supabase.com/blog/supabase-auth-passwordless-sms-loginSupabase Auth v2: Phone Auth now available
https://supabase.com/blog/supabase-auth-passwordless-sms-login
Phone Auth is available today on all new and existing Supabase projects.
- Tue, 27 Jul 2021 16:00:00 GMT
+ Tue, 27 Jul 2021 23:00:00 GMThttps://supabase.com/blog/mobbin-supabase-200000-usersMobbin uses Supabase to authenticate 200,000 users
https://supabase.com/blog/mobbin-supabase-200000-users
Learn how Mobbin migrated 200,000 users from Firebase for a better authentication experience.
- Tue, 27 Jul 2021 16:00:00 GMT
+ Tue, 27 Jul 2021 23:00:00 GMThttps://supabase.com/blog/storage-betaSupabase Storage now in Beta
https://supabase.com/blog/storage-beta
Supabase Storage moves into Beta.
- Mon, 26 Jul 2021 16:00:00 GMT
+ Mon, 26 Jul 2021 23:00:00 GMThttps://supabase.com/blog/spot-flutter-with-postgresSpot: a video sharing app built with Flutter
https://supabase.com/blog/spot-flutter-with-postgres
Spot is a geolocation-based video-sharing app with some social networking features.
- Mon, 26 Jul 2021 16:00:00 GMT
+ Mon, 26 Jul 2021 23:00:00 GMThttps://supabase.com/blog/supabase-postgres-13Supabase is now on Postgres 13.3
https://supabase.com/blog/supabase-postgres-13
From today, new Supabase projects will be on a version of Supabase Postgres that runs on Postgres 13.3.
- Sun, 25 Jul 2021 16:00:00 GMT
+ Sun, 25 Jul 2021 23:00:00 GMThttps://supabase.com/blog/supabase-community-daySupabase Community Day
https://supabase.com/blog/supabase-community-day
Community Day
- Sun, 25 Jul 2021 16:00:00 GMT
+ Sun, 25 Jul 2021 23:00:00 GMThttps://supabase.com/blog/epsilon3-self-hostingEpsilon3 Self-Host Supabase To Revolutionize Space Operations
https://supabase.com/blog/epsilon3-self-hosting
Learn how the team at Epsilon3 use Supabase to help teams execute secure and reliable operations in an industry that project spend runs into the billions.
- Sun, 25 Jul 2021 16:00:00 GMT
+ Sun, 25 Jul 2021 23:00:00 GMThttps://supabase.com/blog/supabase-launch-week-sqlSupabase Launch Week II: The SQL
https://supabase.com/blog/supabase-launch-week-sql
Five days of Supabase. Again.
- Wed, 21 Jul 2021 16:00:00 GMT
+ Wed, 21 Jul 2021 23:00:00 GMThttps://supabase.com/blog/roles-postgres-hooksProtecting reserved roles with PostgreSQL Hooks
https://supabase.com/blog/roles-postgres-hooks
Using Postgres Hooks to protect functionality in your Postgres database.
- Thu, 01 Jul 2021 16:00:00 GMT
+ Thu, 01 Jul 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-june-2021Supabase Beta June 2021
https://supabase.com/blog/supabase-beta-june-2021
Discord Logins, Vercel Integration, Full text search, and OAuth guides.
- Tue, 01 Jun 2021 16:00:00 GMT
+ Tue, 01 Jun 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-may-2021Supabase Beta May 2021
https://supabase.com/blog/supabase-beta-may-2021
Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries.
- Tue, 01 Jun 2021 16:00:00 GMT
+ Tue, 01 Jun 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-april-2021Supabase Beta April 2021
https://supabase.com/blog/supabase-beta-april-2021
Supabase "gardening" - stability, security, and community support.
- Tue, 04 May 2021 16:00:00 GMT
+ Tue, 04 May 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-march-2021Supabase Beta March 2021
https://supabase.com/blog/supabase-beta-march-2021
Launch week, Storage, Supabase CLI, Connection Pooling, Supabase UI, and Pricing.
- Mon, 05 Apr 2021 16:00:00 GMT
+ Mon, 05 Apr 2021 23:00:00 GMThttps://supabase.com/blog/supabase-workflowsWorkflows are coming to Supabase
https://supabase.com/blog/supabase-workflows
Functions are great, but you know what's better?
- Thu, 01 Apr 2021 16:00:00 GMT
+ Thu, 01 Apr 2021 23:00:00 GMThttps://supabase.com/blog/supabase-pgbouncerPgBouncer is now available in Supabase
https://supabase.com/blog/supabase-pgbouncer
Better support for Serverless and Postgres.
- Thu, 01 Apr 2021 16:00:00 GMT
+ Thu, 01 Apr 2021 23:00:00 GMThttps://supabase.com/blog/supabase-dot-comSupabase Dot Com
https://supabase.com/blog/supabase-dot-com
The Supabase Domain name is changing.
- Thu, 01 Apr 2021 16:00:00 GMT
+ Thu, 01 Apr 2021 23:00:00 GMThttps://supabase.com/blog/supabase-nft-marketplaceSupabase Launches NFT Marketplace
https://supabase.com/blog/supabase-nft-marketplace
A fully encrypted NFT platform to protect and transact your digital assets
- Wed, 31 Mar 2021 16:00:00 GMT
+ Wed, 31 Mar 2021 23:00:00 GMThttps://supabase.com/blog/supabase-cliSupabase CLI
https://supabase.com/blog/supabase-cli
Local development, database migrations, and self-hosting.
- Tue, 30 Mar 2021 16:00:00 GMT
+ Tue, 30 Mar 2021 23:00:00 GMThttps://supabase.com/blog/supabase-storageStorage is now available in Supabase
https://supabase.com/blog/supabase-storage
Launching Supabase Storage and how you can use it in your apps
- Mon, 29 Mar 2021 16:00:00 GMT
+ Mon, 29 Mar 2021 23:00:00 GMThttps://supabase.com/blog/pricingSupabase Beta Pricing
https://supabase.com/blog/pricing
Supabase launches Beta pricing structure
- Sun, 28 Mar 2021 16:00:00 GMT
+ Sun, 28 Mar 2021 23:00:00 GMThttps://supabase.com/blog/launch-weekLaunch week
https://supabase.com/blog/launch-week
Five days of Supabase.
- Wed, 24 Mar 2021 16:00:00 GMT
+ Wed, 24 Mar 2021 23:00:00 GMThttps://supabase.com/blog/angels-of-supabaseAngels of Supabase
https://supabase.com/blog/angels-of-supabase
Meet the investors of Supabase.
- Wed, 24 Mar 2021 16:00:00 GMT
+ Wed, 24 Mar 2021 23:00:00 GMThttps://supabase.com/blog/In-The-LoopDevelopers stay up to date with intheloop.dev
https://supabase.com/blog/In-The-Loop
Learn why Kevin is building intheloop.dev with Supabase
- Sun, 21 Mar 2021 16:00:00 GMT
+ Sun, 21 Mar 2021 23:00:00 GMThttps://supabase.com/blog/using-supabase-replitUsing Supabase in Replit
https://supabase.com/blog/using-supabase-replit
Free hosted relational database from within your node.js repl
- Wed, 10 Mar 2021 16:00:00 GMT
+ Wed, 10 Mar 2021 23:00:00 GMThttps://supabase.com/blog/toad-a-link-shortener-with-simple-apis-for-low-codersToad, a link shortener with simple APIs for low-coders
https://supabase.com/blog/toad-a-link-shortener-with-simple-apis-for-low-coders
An easy-to-use link shortening tool with simple APIs
- Sun, 07 Mar 2021 16:00:00 GMT
+ Sun, 07 Mar 2021 23:00:00 GMThttps://supabase.com/blog/postgres-as-a-cron-serverPostgres as a CRON Server
https://supabase.com/blog/postgres-as-a-cron-server
Running repetitive tasks with your Postgres database.
- Thu, 04 Mar 2021 16:00:00 GMT
+ Thu, 04 Mar 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-february-2021Supabase Beta February 2021
https://supabase.com/blog/supabase-beta-february-2021
One year of building.
- Mon, 01 Mar 2021 16:00:00 GMT
+ Mon, 01 Mar 2021 23:00:00 GMThttps://supabase.com/blog/cracking-postgres-interviewCracking PostgreSQL Interview Questions
https://supabase.com/blog/cracking-postgres-interview
Understand the top PostgreSQL Interview Questions
- Fri, 26 Feb 2021 16:00:00 GMT
+ Fri, 26 Feb 2021 23:00:00 GMThttps://supabase.com/blog/case-study-roboflowRoboflow.com choose Supabase to power Paint.wtf leaderboard
https://supabase.com/blog/case-study-roboflow
Learn how Roboflow.com used Supabase to build their Paint.wtf leaderboard
- Mon, 08 Feb 2021 16:00:00 GMT
+ Mon, 08 Feb 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-january-2021Supabase Beta January 2021
https://supabase.com/blog/supabase-beta-january-2021
Eleven months of building.
- Mon, 01 Feb 2021 16:00:00 GMT
+ Mon, 01 Feb 2021 23:00:00 GMThttps://supabase.com/blog/supabase-beta-december-2020Supabase Beta December 2020
https://supabase.com/blog/supabase-beta-december-2020
Ten months of building.
- Fri, 01 Jan 2021 16:00:00 GMT
+ Fri, 01 Jan 2021 23:00:00 GMThttps://supabase.com/blog/supabase-dashboard-performanceMaking the Supabase Dashboard Supa-fast
https://supabase.com/blog/supabase-dashboard-performance
Improving the performance of the Supabase dashboard
- Sat, 12 Dec 2020 16:00:00 GMT
+ Sat, 12 Dec 2020 23:00:00 GMThttps://supabase.com/blog/supabase-striveschoolSupabase Partners With Strive School To Help Teach Open Source
https://supabase.com/blog/supabase-striveschool
Supabase Partners With Strive School To Help Teach Open Source To The Next Generation Of Developers
- Tue, 01 Dec 2020 16:00:00 GMT
+ Tue, 01 Dec 2020 23:00:00 GMThttps://supabase.com/blog/case-study-xenditXendit Built a Counter-Fraud Watchlist for the Fintech Industry
https://supabase.com/blog/case-study-xendit
See how Xendit use Supabase to build a full-text search engine.
- Tue, 01 Dec 2020 16:00:00 GMT
+ Tue, 01 Dec 2020 23:00:00 GMThttps://supabase.com/blog/case-study-tayfaTAYFA Built a No-Code Website Builder in Seven Days
https://supabase.com/blog/case-study-tayfa
See how Tayfa went from idea to paying customer in less than 30 days.
- Tue, 01 Dec 2020 16:00:00 GMT
+ Tue, 01 Dec 2020 23:00:00 GMThttps://supabase.com/blog/case-study-monitoroMonitoro Built a Web Crawler Handling Millions of API Requests
https://supabase.com/blog/case-study-monitoro
See how Monitoro built an automated scraping platform using Supabase.
- Tue, 01 Dec 2020 16:00:00 GMT
+ Tue, 01 Dec 2020 23:00:00 GMThttps://supabase.com/blog/supabase-alpha-november-2020Supabase Alpha November 2020
https://supabase.com/blog/supabase-alpha-november-2020
Nine months of building.
- Mon, 30 Nov 2020 16:00:00 GMT
+ Mon, 30 Nov 2020 23:00:00 GMThttps://supabase.com/blog/postgresql-viewsPostgres Views
https://supabase.com/blog/postgresql-views
Creating and using a view in PostgreSQL.
- Tue, 17 Nov 2020 16:00:00 GMT
+ Tue, 17 Nov 2020 23:00:00 GMThttps://supabase.com/blog/supabase-alpha-october-2020Supabase Alpha October 2020
https://supabase.com/blog/supabase-alpha-october-2020
Eight months of building.
- Sun, 01 Nov 2020 16:00:00 GMT
+ Sun, 01 Nov 2020 23:00:00 GMThttps://supabase.com/blog/improved-dxSupabase.js 1.0
https://supabase.com/blog/improved-dx
We're releasing a new version of our Supabase client with some awesome new improvements.
- Thu, 29 Oct 2020 16:00:00 GMT
+ Thu, 29 Oct 2020 23:00:00 GMThttps://supabase.com/blog/supabase-alpha-september-2020Supabase Alpha September 2020
https://supabase.com/blog/supabase-alpha-september-2020
Seven months of building.
- Fri, 02 Oct 2020 16:00:00 GMT
+ Fri, 02 Oct 2020 23:00:00 GMThttps://supabase.com/blog/supabase-hacktoberfest-2020Supabase Hacktoberfest 2020
https://supabase.com/blog/supabase-hacktoberfest-2020
Join us for a celebration of open source software and learn how to contribute to Supabase.
- Thu, 10 Sep 2020 16:00:00 GMT
+ Thu, 10 Sep 2020 23:00:00 GMThttps://supabase.com/blog/supabase-alpha-august-2020Supabase Alpha August 2020
https://supabase.com/blog/supabase-alpha-august-2020
Six months of building
- Wed, 02 Sep 2020 16:00:00 GMT
+ Wed, 02 Sep 2020 23:00:00 GMThttps://supabase.com/blog/supabase-authSupabase Auth
https://supabase.com/blog/supabase-auth
Authenticate and authorize your users with Supabase Auth
- Tue, 04 Aug 2020 16:00:00 GMT
+ Tue, 04 Aug 2020 23:00:00 GMThttps://supabase.com/blog/supabase-alpha-july-2020Supabase Alpha July 2020
https://supabase.com/blog/supabase-alpha-july-2020
Five months of building
- Sat, 01 Aug 2020 16:00:00 GMT
+ Sat, 01 Aug 2020 23:00:00 GMThttps://supabase.com/blog/continuous-postgresql-backup-walgContinuous PostgreSQL Backups using WAL-G
https://supabase.com/blog/continuous-postgresql-backup-walg
Have you ever wanted to restore your database's state to a particular moment in time? This post explains how, using WAL-G.
- Sat, 01 Aug 2020 16:00:00 GMT
+ Sat, 01 Aug 2020 23:00:00 GMThttps://supabase.com/blog/alpha-launch-postmortemAlpha Launch Postmortem
https://supabase.com/blog/alpha-launch-postmortem
Everything that went wrong with Supabase's launch
- Thu, 09 Jul 2020 16:00:00 GMT
+ Thu, 09 Jul 2020 23:00:00 GMThttps://supabase.com/blog/postgresql-templatesWhat are PostgreSQL Templates?
https://supabase.com/blog/postgresql-templates
What are PostgreSQL templates and what are they used for?
- Wed, 08 Jul 2020 16:00:00 GMT
+ Wed, 08 Jul 2020 23:00:00 GMThttps://supabase.com/blog/postgresql-physical-logical-backupsPhysical vs Logical Backups in PostgreSQL
https://supabase.com/blog/postgresql-physical-logical-backups
What are physical and logical backups in Postgres?
- Mon, 06 Jul 2020 16:00:00 GMT
+ Mon, 06 Jul 2020 23:00:00 GMThttps://supabase.com/blog/supabase-alpha-june-2020Supabase Alpha June 2020
https://supabase.com/blog/supabase-alpha-june-2020
Four months of building
- Tue, 30 Jun 2020 16:00:00 GMT
+ Tue, 30 Jun 2020 23:00:00 GMThttps://supabase.com/blog/supabase-steve-chavezSteve Chavez has joined Supabase
https://supabase.com/blog/supabase-steve-chavez
Steve joins Supabase to help build Auth.
- Sun, 14 Jun 2020 16:00:00 GMT
+ Sun, 14 Jun 2020 23:00:00 GMThttps://supabase.com/blog/supabase-alpha-may-2020Supabase Alpha May 2020
https://supabase.com/blog/supabase-alpha-may-2020
Three months of building
- Sun, 31 May 2020 16:00:00 GMT
+ Sun, 31 May 2020 23:00:00 GMThttps://supabase.com/blog/supabase-alpha-april-2020Supabase Alpha April 2020
https://supabase.com/blog/supabase-alpha-april-2020
Two months of building
- Sun, 31 May 2020 16:00:00 GMT
+ Sun, 31 May 2020 23:00:00 GMT
diff --git a/docker/docker-compose-logging.yml b/docker/docker-compose-logging.yml
index b65d190d52e..fe3ec5c8d7c 100644
--- a/docker/docker-compose-logging.yml
+++ b/docker/docker-compose-logging.yml
@@ -93,7 +93,7 @@ services:
analytics:
container_name: supabase-analytics
- image: supabase/logflare:1.0.2
+ image: supabase/logflare:1.3.17
healthcheck:
test: [ "CMD", "curl", "http://localhost:4000/health" ]
timeout: 5s
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
index 2998b154ec0..65d6e83ae9c 100644
--- a/docker/docker-compose.yml
+++ b/docker/docker-compose.yml
@@ -9,7 +9,7 @@ version: "3.8"
services:
studio:
container_name: supabase-studio
- image: supabase/studio:20230621-7a24ddd
+ image: supabase/studio:v0.23.06
restart: unless-stopped
healthcheck:
test:
@@ -119,7 +119,7 @@ services:
rest:
container_name: supabase-rest
- image: postgrest/postgrest:v10.1.2
+ image: postgrest/postgrest:v11.1.0
depends_on:
db:
# Disable this if you are using an external Postgres database
diff --git a/examples/auth/flutter-mfa/README.md b/examples/auth/flutter-mfa/README.md
index abcb23dab84..7e5b066e7de 100644
--- a/examples/auth/flutter-mfa/README.md
+++ b/examples/auth/flutter-mfa/README.md
@@ -1,6 +1,16 @@
# Flutter Supabase MFA Example
-A simple app demonstrating how to implement Multi-Factor Authentication (MFA) with Supabase and Flutter.
+
+
+A Flutter app demonstrating how to implement Multi-Factor Authentication (MFA) with Supabase and Flutter. A user can sign up, add MFA via an authenticator app, and only after they have signed in using MFA they can view the content from the database.
+
+- Full tutorial article [here](https://supabase.com/blog/flutter-authentication)
+
+## Getting Started
+
+- Create a new Supabase project [here](https://database.new)
+- Add your Supabase credentials to `lib/main.dart`
+- Run the following SQL from the SQL editor of your Supabase dashboard to create a table and dummy data
```sql
-- Dummy table that contains "secure" information
@@ -26,4 +36,13 @@ create policy "Users can view private_posts if they have signed in via MFA"
for select
to authenticated
using (auth.jwt()->>'aal' = 'aal2');
-```
\ No newline at end of file
+```
+
+- Run the app and test the login flow 🚀
+
+## Resources
+
+- [Flutter Authorization with RLS article](https://supabase.com/blog/flutter-authorization-with-rls)
+- [Flutter Tutorial: building a Flutter chat app article](https://supabase.com/blog/flutter-tutorial-building-a-chat-app)
+- [Supabase docs for Flutter](https://supabase.com/docs/reference/dart/introduction)
+- [Supabase Flutter YouTube playlist](https://www.youtube.com/watch?v=F2j6Q-4nLEE&list=PL5S4mPUpp4OtkMf5LNDLXdTcAp1niHjoL)
diff --git a/examples/auth/flutter-mfa/images/mfa.png b/examples/auth/flutter-mfa/images/mfa.png
new file mode 100644
index 00000000000..0d13668601a
Binary files /dev/null and b/examples/auth/flutter-mfa/images/mfa.png differ
diff --git a/examples/auth/flutter-native-google-auth/.gitignore b/examples/auth/flutter-native-google-auth/.gitignore
new file mode 100644
index 00000000000..24476c5d1eb
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/.gitignore
@@ -0,0 +1,44 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+migrate_working_dir/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/examples/auth/flutter-native-google-auth/.metadata b/examples/auth/flutter-native-google-auth/.metadata
new file mode 100644
index 00000000000..30d90a7ef8b
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/.metadata
@@ -0,0 +1,45 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled.
+
+version:
+ revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ channel: stable
+
+project_type: app
+
+# Tracks metadata for the flutter migrate command
+migration:
+ platforms:
+ - platform: root
+ create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ - platform: android
+ create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ - platform: ios
+ create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ - platform: linux
+ create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ - platform: macos
+ create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ - platform: web
+ create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ - platform: windows
+ create_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+ base_revision: 796c8ef79279f9c774545b3771238c3098dbefab
+
+ # User provided section
+
+ # List of Local paths (relative to this file) that should be
+ # ignored by the migrate tool.
+ #
+ # Files that are not part of the templates will be ignored by default.
+ unmanaged_files:
+ - 'lib/main.dart'
+ - 'ios/Runner.xcodeproj/project.pbxproj'
diff --git a/examples/auth/flutter-native-google-auth/README.md b/examples/auth/flutter-native-google-auth/README.md
new file mode 100644
index 00000000000..e234f4578c3
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/README.md
@@ -0,0 +1,26 @@
+# Flutter native Google auth with Supabase
+
+
+
+A simple Flutter application with native Google login capabilities on iOS and Android using Supabase auth. Upon signing in, the user is presented with a profile screen where their name and profile image from their Google account are displayed.
+
+- Full tutorial article [here](https://supabase.com/blog/flutter-authentication)
+- Full video guide [here](https://www.youtube.com/watch?v=YtvxRgGouwg)
+
+## Getting Started
+
+- Create a new Supabase project [here](https://database.new)
+- Add your Supabase credentials to `lib/main.dart`
+- Obtain Google API client ID for [Android](https://developers.google.com/identity/sign-in/android/start-integrating#configure_a_project) and [iOS](https://developers.google.com/identity/sign-in/ios/start-integrating#get_an_oauth_client_id)
+- Add the client IDs in Supabase dashboard under `Auth -> Providers -> Google -> Authorized Client IDs` and turn on `Enable Sign in with Google`
+- Find the `clientId` variable in `lib/screens/login_screen.dart` and paste the two client IDs
+- For android open `android/app/build.gradle` file, locate `appAuthRedirectScheme` variable and replace the value with your reversed DNS form of the Android client ID. For example, if your client ID is `1234567890-abc123def456.apps.googleusercontent.com`, then the value should be `com.googleusercontent.apps.1234567890-abc123def456`
+- Run the app on iOS or Android and test the login flow 🚀
+
+## Resources
+
+- [Flutter Authorization with RLS article](https://supabase.com/blog/flutter-authorization-with-rls)
+- [Securing your Flutter apps with Multi-Factor Authentication article](https://supabase.com/blog/flutter-multi-factor-authentication)
+- [Flutter Tutorial: building a Flutter chat app article](https://supabase.com/blog/flutter-tutorial-building-a-chat-app)
+- [Supabase docs for Flutter](https://supabase.com/docs/reference/dart/introduction)
+- [Supabase Flutter YouTube playlist](https://www.youtube.com/watch?v=F2j6Q-4nLEE&list=PL5S4mPUpp4OtkMf5LNDLXdTcAp1niHjoL)
diff --git a/examples/auth/flutter-native-google-auth/analysis_options.yaml b/examples/auth/flutter-native-google-auth/analysis_options.yaml
new file mode 100644
index 00000000000..61b6c4de17c
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/analysis_options.yaml
@@ -0,0 +1,29 @@
+# This file configures the analyzer, which statically analyzes Dart code to
+# check for errors, warnings, and lints.
+#
+# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
+# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
+# invoked from the command line by running `flutter analyze`.
+
+# The following line activates a set of recommended lints for Flutter apps,
+# packages, and plugins designed to encourage good coding practices.
+include: package:flutter_lints/flutter.yaml
+
+linter:
+ # The lint rules applied to this project can be customized in the
+ # section below to disable rules from the `package:flutter_lints/flutter.yaml`
+ # included above or to enable additional rules. A list of all available lints
+ # and their documentation is published at
+ # https://dart-lang.github.io/linter/lints/index.html.
+ #
+ # Instead of disabling a lint rule for the entire project in the
+ # section below, it can also be suppressed for a single line of code
+ # or a specific dart file by using the `// ignore: name_of_lint` and
+ # `// ignore_for_file: name_of_lint` syntax on the line or in the file
+ # producing the lint.
+ rules:
+ # avoid_print: false # Uncomment to disable the `avoid_print` rule
+ # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
+
+# Additional information about this file can be found at
+# https://dart.dev/guides/language/analysis-options
diff --git a/examples/auth/flutter-native-google-auth/android/.gitignore b/examples/auth/flutter-native-google-auth/android/.gitignore
new file mode 100644
index 00000000000..6f568019d3c
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/.gitignore
@@ -0,0 +1,13 @@
+gradle-wrapper.jar
+/.gradle
+/captures/
+/gradlew
+/gradlew.bat
+/local.properties
+GeneratedPluginRegistrant.java
+
+# Remember to never publicly share your keystore.
+# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
+key.properties
+**/*.keystore
+**/*.jks
diff --git a/examples/auth/flutter-native-google-auth/android/app/build.gradle b/examples/auth/flutter-native-google-auth/android/app/build.gradle
new file mode 100644
index 00000000000..1eb3c6c9639
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/app/build.gradle
@@ -0,0 +1,77 @@
+def localProperties = new Properties()
+def localPropertiesFile = rootProject.file('local.properties')
+if (localPropertiesFile.exists()) {
+ localPropertiesFile.withReader('UTF-8') { reader ->
+ localProperties.load(reader)
+ }
+}
+
+def flutterRoot = localProperties.getProperty('flutter.sdk')
+if (flutterRoot == null) {
+ throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
+}
+
+def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
+if (flutterVersionCode == null) {
+ flutterVersionCode = '1'
+}
+
+def flutterVersionName = localProperties.getProperty('flutter.versionName')
+if (flutterVersionName == null) {
+ flutterVersionName = '1.0'
+}
+
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
+
+android {
+ namespace "com.example.myauthapp"
+ compileSdkVersion flutter.compileSdkVersion
+ ndkVersion flutter.ndkVersion
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ defaultConfig {
+ // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
+ applicationId "com.example.myauthapp"
+ // You can update the following values to match your application needs.
+ // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
+ minSdkVersion 20
+ targetSdkVersion flutter.targetSdkVersion
+ versionCode flutterVersionCode.toInteger()
+ versionName flutterVersionName
+ manifestPlaceholders += [
+ // *account_id* will be unique for every single app
+ 'appAuthRedirectScheme': 'com.googleusercontent.apps.*account_id*'
+ ]
+
+ }
+
+ buildTypes {
+ release {
+ // TODO: Add your own signing config for the release build.
+ // Signing with the debug keys for now, so `flutter run --release` works.
+ signingConfig signingConfigs.debug
+ }
+ }
+}
+
+flutter {
+ source '../..'
+}
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+}
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/debug/AndroidManifest.xml b/examples/auth/flutter-native-google-auth/android/app/src/debug/AndroidManifest.xml
new file mode 100644
index 00000000000..399f6981d5d
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/app/src/debug/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/AndroidManifest.xml b/examples/auth/flutter-native-google-auth/android/app/src/main/AndroidManifest.xml
new file mode 100644
index 00000000000..ee07181d612
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/app/src/main/AndroidManifest.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/kotlin/com/example/myauthapp/MainActivity.kt b/examples/auth/flutter-native-google-auth/android/app/src/main/kotlin/com/example/myauthapp/MainActivity.kt
new file mode 100644
index 00000000000..062b5da9424
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/app/src/main/kotlin/com/example/myauthapp/MainActivity.kt
@@ -0,0 +1,6 @@
+package com.example.myauthapp
+
+import io.flutter.embedding.android.FlutterActivity
+
+class MainActivity: FlutterActivity() {
+}
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/res/drawable-v21/launch_background.xml b/examples/auth/flutter-native-google-auth/android/app/src/main/res/drawable-v21/launch_background.xml
new file mode 100644
index 00000000000..f74085f3f6a
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/app/src/main/res/drawable-v21/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/res/drawable/launch_background.xml b/examples/auth/flutter-native-google-auth/android/app/src/main/res/drawable/launch_background.xml
new file mode 100644
index 00000000000..304732f8842
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/app/src/main/res/drawable/launch_background.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 00000000000..db77bb4b7b0
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 00000000000..17987b79bb8
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 00000000000..09d4391482b
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 00000000000..d5f1c8d34e7
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 00000000000..4d6372eebdb
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/res/values-night/styles.xml b/examples/auth/flutter-native-google-auth/android/app/src/main/res/values-night/styles.xml
new file mode 100644
index 00000000000..06952be745f
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/app/src/main/res/values-night/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/main/res/values/styles.xml b/examples/auth/flutter-native-google-auth/android/app/src/main/res/values/styles.xml
new file mode 100644
index 00000000000..cb1ef88056e
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/app/src/main/res/values/styles.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/android/app/src/profile/AndroidManifest.xml b/examples/auth/flutter-native-google-auth/android/app/src/profile/AndroidManifest.xml
new file mode 100644
index 00000000000..399f6981d5d
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/app/src/profile/AndroidManifest.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/android/build.gradle b/examples/auth/flutter-native-google-auth/android/build.gradle
new file mode 100644
index 00000000000..f7eb7f63ce1
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/build.gradle
@@ -0,0 +1,31 @@
+buildscript {
+ ext.kotlin_version = '1.7.10'
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:7.3.0'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+rootProject.buildDir = '../build'
+subprojects {
+ project.buildDir = "${rootProject.buildDir}/${project.name}"
+}
+subprojects {
+ project.evaluationDependsOn(':app')
+}
+
+tasks.register("clean", Delete) {
+ delete rootProject.buildDir
+}
diff --git a/examples/auth/flutter-native-google-auth/android/gradle.properties b/examples/auth/flutter-native-google-auth/android/gradle.properties
new file mode 100644
index 00000000000..94adc3a3f97
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/gradle.properties
@@ -0,0 +1,3 @@
+org.gradle.jvmargs=-Xmx1536M
+android.useAndroidX=true
+android.enableJetifier=true
diff --git a/examples/auth/flutter-native-google-auth/android/gradle/wrapper/gradle-wrapper.properties b/examples/auth/flutter-native-google-auth/android/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000000..3c472b99c6f
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
diff --git a/examples/auth/flutter-native-google-auth/android/settings.gradle b/examples/auth/flutter-native-google-auth/android/settings.gradle
new file mode 100644
index 00000000000..44e62bcf06a
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/android/settings.gradle
@@ -0,0 +1,11 @@
+include ':app'
+
+def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
+def properties = new Properties()
+
+assert localPropertiesFile.exists()
+localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
+
+def flutterSdkPath = properties.getProperty("flutter.sdk")
+assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
+apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
diff --git a/examples/auth/flutter-native-google-auth/images/login.png b/examples/auth/flutter-native-google-auth/images/login.png
new file mode 100644
index 00000000000..2a64b8ade38
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/images/login.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/.gitignore b/examples/auth/flutter-native-google-auth/ios/.gitignore
new file mode 100644
index 00000000000..7a7f9873ad7
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/.gitignore
@@ -0,0 +1,34 @@
+**/dgph
+*.mode1v3
+*.mode2v3
+*.moved-aside
+*.pbxuser
+*.perspectivev3
+**/*sync/
+.sconsign.dblite
+.tags*
+**/.vagrant/
+**/DerivedData/
+Icon?
+**/Pods/
+**/.symlinks/
+profile
+xcuserdata
+**/.generated/
+Flutter/App.framework
+Flutter/Flutter.framework
+Flutter/Flutter.podspec
+Flutter/Generated.xcconfig
+Flutter/ephemeral/
+Flutter/app.flx
+Flutter/app.zip
+Flutter/flutter_assets/
+Flutter/flutter_export_environment.sh
+ServiceDefinitions.json
+Runner/GeneratedPluginRegistrant.*
+
+# Exceptions to above rules.
+!default.mode1v3
+!default.mode2v3
+!default.pbxuser
+!default.perspectivev3
diff --git a/examples/auth/flutter-native-google-auth/ios/Flutter/AppFrameworkInfo.plist b/examples/auth/flutter-native-google-auth/ios/Flutter/AppFrameworkInfo.plist
new file mode 100644
index 00000000000..9625e105df3
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Flutter/AppFrameworkInfo.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ en
+ CFBundleExecutable
+ App
+ CFBundleIdentifier
+ io.flutter.flutter.app
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ App
+ CFBundlePackageType
+ FMWK
+ CFBundleShortVersionString
+ 1.0
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ 1.0
+ MinimumOSVersion
+ 11.0
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Flutter/Debug.xcconfig b/examples/auth/flutter-native-google-auth/ios/Flutter/Debug.xcconfig
new file mode 100644
index 00000000000..ec97fc6f302
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Flutter/Debug.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+#include "Generated.xcconfig"
diff --git a/examples/auth/flutter-native-google-auth/ios/Flutter/Release.xcconfig b/examples/auth/flutter-native-google-auth/ios/Flutter/Release.xcconfig
new file mode 100644
index 00000000000..c4855bfe200
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Flutter/Release.xcconfig
@@ -0,0 +1,2 @@
+#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
+#include "Generated.xcconfig"
diff --git a/examples/auth/flutter-native-google-auth/ios/Podfile b/examples/auth/flutter-native-google-auth/ios/Podfile
new file mode 100644
index 00000000000..fdcc671eb34
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Podfile
@@ -0,0 +1,44 @@
+# Uncomment this line to define a global platform for your project
+# platform :ios, '11.0'
+
+# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
+ENV['COCOAPODS_DISABLE_STATS'] = 'true'
+
+project 'Runner', {
+ 'Debug' => :debug,
+ 'Profile' => :release,
+ 'Release' => :release,
+}
+
+def flutter_root
+ generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
+ unless File.exist?(generated_xcode_build_settings_path)
+ raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
+ end
+
+ File.foreach(generated_xcode_build_settings_path) do |line|
+ matches = line.match(/FLUTTER_ROOT\=(.*)/)
+ return matches[1].strip if matches
+ end
+ raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
+end
+
+require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
+
+flutter_ios_podfile_setup
+
+target 'Runner' do
+ use_frameworks!
+ use_modular_headers!
+
+ flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
+ target 'RunnerTests' do
+ inherit! :search_paths
+ end
+end
+
+post_install do |installer|
+ installer.pods_project.targets.each do |target|
+ flutter_additional_ios_build_settings(target)
+ end
+end
diff --git a/examples/auth/flutter-native-google-auth/ios/Podfile.lock b/examples/auth/flutter-native-google-auth/ios/Podfile.lock
new file mode 100644
index 00000000000..d67eef75818
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Podfile.lock
@@ -0,0 +1,72 @@
+PODS:
+ - app_links (0.0.1):
+ - Flutter
+ - AppAuth (1.6.2):
+ - AppAuth/Core (= 1.6.2)
+ - AppAuth/ExternalUserAgent (= 1.6.2)
+ - AppAuth/Core (1.6.2)
+ - AppAuth/ExternalUserAgent (1.6.2):
+ - AppAuth/Core
+ - Flutter (1.0.0)
+ - flutter_appauth (0.0.1):
+ - AppAuth (= 1.6.2)
+ - Flutter
+ - path_provider_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - shared_preferences_foundation (0.0.1):
+ - Flutter
+ - FlutterMacOS
+ - sign_in_with_apple (0.0.1):
+ - Flutter
+ - url_launcher_ios (0.0.1):
+ - Flutter
+ - webview_flutter_wkwebview (0.0.1):
+ - Flutter
+
+DEPENDENCIES:
+ - app_links (from `.symlinks/plugins/app_links/ios`)
+ - Flutter (from `Flutter`)
+ - flutter_appauth (from `.symlinks/plugins/flutter_appauth/ios`)
+ - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
+ - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
+ - sign_in_with_apple (from `.symlinks/plugins/sign_in_with_apple/ios`)
+ - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
+ - webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
+
+SPEC REPOS:
+ trunk:
+ - AppAuth
+
+EXTERNAL SOURCES:
+ app_links:
+ :path: ".symlinks/plugins/app_links/ios"
+ Flutter:
+ :path: Flutter
+ flutter_appauth:
+ :path: ".symlinks/plugins/flutter_appauth/ios"
+ path_provider_foundation:
+ :path: ".symlinks/plugins/path_provider_foundation/darwin"
+ shared_preferences_foundation:
+ :path: ".symlinks/plugins/shared_preferences_foundation/darwin"
+ sign_in_with_apple:
+ :path: ".symlinks/plugins/sign_in_with_apple/ios"
+ url_launcher_ios:
+ :path: ".symlinks/plugins/url_launcher_ios/ios"
+ webview_flutter_wkwebview:
+ :path: ".symlinks/plugins/webview_flutter_wkwebview/ios"
+
+SPEC CHECKSUMS:
+ app_links: 5ef33d0d295a89d9d16bb81b0e3b0d5f70d6c875
+ AppAuth: 3bb1d1cd9340bd09f5ed189fb00b1cc28e1e8570
+ Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
+ flutter_appauth: cf9b928962105b2a64a9802585d1c8adaf3e0f46
+ path_provider_foundation: eaf5b3e458fc0e5fbb9940fb09980e853fe058b8
+ shared_preferences_foundation: e2dae3258e06f44cc55f49d42024fd8dd03c590c
+ sign_in_with_apple: f3bf75217ea4c2c8b91823f225d70230119b8440
+ url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4
+ webview_flutter_wkwebview: 2e2d318f21a5e036e2c3f26171342e95908bd60a
+
+PODFILE CHECKSUM: 70d9d25280d0dd177a5f637cdb0f0b0b12c6a189
+
+COCOAPODS: 1.11.3
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.pbxproj b/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.pbxproj
new file mode 100644
index 00000000000..d607a3d4697
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.pbxproj
@@ -0,0 +1,723 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 54;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
+ 3304FB9E97805348E2562BE0 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B564902DECB04C26DF5C1990 /* Pods_Runner.framework */; };
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
+ DEA8302A70C9ACD2650F9B7C /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 828A241E8FA8208665D3EB86 /* Pods_RunnerTests.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 97C146E61CF9000F007C117D /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 97C146ED1CF9000F007C117D;
+ remoteInfo = Runner;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 10;
+ files = (
+ );
+ name = "Embed Frameworks";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
+ 27BEFA69E5DA94D046EFBE00 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; };
+ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; };
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+ 38E30A4AF317B140613697D2 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; };
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
+ 426FE104D430BF3CD70AF9E2 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; };
+ 472D51D7E326E44047EEC5F0 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; };
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; };
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
+ 828A241E8FA8208665D3EB86 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
+ 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ B564902DECB04C26DF5C1990 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+ D0870FF5D39BE2F0E613C78C /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; };
+ F00CBB189671F834144DE713 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 97C146EB1CF9000F007C117D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 3304FB9E97805348E2562BE0 /* Pods_Runner.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ F0B9F11E87752367F31C27C8 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DEA8302A70C9ACD2650F9B7C /* Pods_RunnerTests.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 331C8082294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXGroup;
+ children = (
+ 331C807B294A618700263BE5 /* RunnerTests.swift */,
+ );
+ path = RunnerTests;
+ sourceTree = "";
+ };
+ 4147D33225043F42F09814E7 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ D0870FF5D39BE2F0E613C78C /* Pods-Runner.debug.xcconfig */,
+ 38E30A4AF317B140613697D2 /* Pods-Runner.release.xcconfig */,
+ F00CBB189671F834144DE713 /* Pods-Runner.profile.xcconfig */,
+ 27BEFA69E5DA94D046EFBE00 /* Pods-RunnerTests.debug.xcconfig */,
+ 472D51D7E326E44047EEC5F0 /* Pods-RunnerTests.release.xcconfig */,
+ 426FE104D430BF3CD70AF9E2 /* Pods-RunnerTests.profile.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "";
+ };
+ 83C49BB5102259C76EED0D53 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ B564902DECB04C26DF5C1990 /* Pods_Runner.framework */,
+ 828A241E8FA8208665D3EB86 /* Pods_RunnerTests.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ 9740EEB11CF90186004384FC /* Flutter */ = {
+ isa = PBXGroup;
+ children = (
+ 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
+ 9740EEB21CF90195004384FC /* Debug.xcconfig */,
+ 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
+ 9740EEB31CF90195004384FC /* Generated.xcconfig */,
+ );
+ name = Flutter;
+ sourceTree = "";
+ };
+ 97C146E51CF9000F007C117D = {
+ isa = PBXGroup;
+ children = (
+ 9740EEB11CF90186004384FC /* Flutter */,
+ 97C146F01CF9000F007C117D /* Runner */,
+ 97C146EF1CF9000F007C117D /* Products */,
+ 331C8082294A63A400263BE5 /* RunnerTests */,
+ 4147D33225043F42F09814E7 /* Pods */,
+ 83C49BB5102259C76EED0D53 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ 97C146EF1CF9000F007C117D /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146EE1CF9000F007C117D /* Runner.app */,
+ 331C8081294A63A400263BE5 /* RunnerTests.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 97C146F01CF9000F007C117D /* Runner */ = {
+ isa = PBXGroup;
+ children = (
+ 97C146FA1CF9000F007C117D /* Main.storyboard */,
+ 97C146FD1CF9000F007C117D /* Assets.xcassets */,
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
+ 97C147021CF9000F007C117D /* Info.plist */,
+ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
+ 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
+ 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
+ 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
+ );
+ path = Runner;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 331C8080294A63A400263BE5 /* RunnerTests */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
+ buildPhases = (
+ 42C78DCFB35050844813EE93 /* [CP] Check Pods Manifest.lock */,
+ 331C807D294A63A400263BE5 /* Sources */,
+ 331C807F294A63A400263BE5 /* Resources */,
+ F0B9F11E87752367F31C27C8 /* Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */,
+ );
+ name = RunnerTests;
+ productName = RunnerTests;
+ productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+ 97C146ED1CF9000F007C117D /* Runner */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
+ buildPhases = (
+ 72352E8546CF6F5BA1AA1932 /* [CP] Check Pods Manifest.lock */,
+ 9740EEB61CF901F6004384FC /* Run Script */,
+ 97C146EA1CF9000F007C117D /* Sources */,
+ 97C146EB1CF9000F007C117D /* Frameworks */,
+ 97C146EC1CF9000F007C117D /* Resources */,
+ 9705A1C41CF9048500538489 /* Embed Frameworks */,
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
+ D5C0C78971716833C4CC4F79 /* [CP] Embed Pods Frameworks */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Runner;
+ productName = Runner;
+ productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 97C146E61CF9000F007C117D /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ LastUpgradeCheck = 1300;
+ ORGANIZATIONNAME = "";
+ TargetAttributes = {
+ 331C8080294A63A400263BE5 = {
+ CreatedOnToolsVersion = 14.0;
+ TestTargetID = 97C146ED1CF9000F007C117D;
+ };
+ 97C146ED1CF9000F007C117D = {
+ CreatedOnToolsVersion = 7.3.1;
+ LastSwiftMigration = 1100;
+ };
+ };
+ };
+ buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
+ compatibilityVersion = "Xcode 9.3";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 97C146E51CF9000F007C117D;
+ productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 97C146ED1CF9000F007C117D /* Runner */,
+ 331C8080294A63A400263BE5 /* RunnerTests */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 331C807F294A63A400263BE5 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EC1CF9000F007C117D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
+ 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
+ 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
+ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
+ );
+ name = "Thin Binary";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
+ };
+ 42C78DCFB35050844813EE93 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 72352E8546CF6F5BA1AA1932 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+ 9740EEB61CF901F6004384FC /* Run Script */ = {
+ isa = PBXShellScriptBuildPhase;
+ alwaysOutOfDate = 1;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputPaths = (
+ );
+ name = "Run Script";
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
+ };
+ D5C0C78971716833C4CC4F79 /* [CP] Embed Pods Frameworks */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Embed Pods Frameworks";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 331C807D294A63A400263BE5 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 97C146EA1CF9000F007C117D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
+ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 97C146ED1CF9000F007C117D /* Runner */;
+ targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin PBXVariantGroup section */
+ 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C146FB1CF9000F007C117D /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "";
+ };
+ 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 97C147001CF9000F007C117D /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 249021D3217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Profile;
+ };
+ 249021D4217E4FDB00AE95B9 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = Z6UYZY8QU4;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.myauthapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Profile;
+ };
+ 331C8088294A63A400263BE5 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 27BEFA69E5DA94D046EFBE00 /* Pods-RunnerTests.debug.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.myAuthApp.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Debug;
+ };
+ 331C8089294A63A400263BE5 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 472D51D7E326E44047EEC5F0 /* Pods-RunnerTests.release.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.myAuthApp.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Release;
+ };
+ 331C808A294A63A400263BE5 /* Profile */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 426FE104D430BF3CD70AF9E2 /* Pods-RunnerTests.profile.xcconfig */;
+ buildSettings = {
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.myAuthApp.RunnerTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_VERSION = 5.0;
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
+ };
+ name = Profile;
+ };
+ 97C147031CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 97C147041CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
+ CLANG_CXX_LIBRARY = "libc++";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu99;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ SDKROOT = iphoneos;
+ SUPPORTED_PLATFORMS = iphoneos;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ SWIFT_OPTIMIZATION_LEVEL = "-O";
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 97C147061CF9000F007C117D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = Z6UYZY8QU4;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.myauthapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Debug;
+ };
+ 97C147071CF9000F007C117D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ CLANG_ENABLE_MODULES = YES;
+ CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
+ DEVELOPMENT_TEAM = Z6UYZY8QU4;
+ ENABLE_BITCODE = NO;
+ INFOPLIST_FILE = Runner/Info.plist;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ PRODUCT_BUNDLE_IDENTIFIER = com.example.myauthapp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
+ VERSIONING_SYSTEM = "apple-generic";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 331C8088294A63A400263BE5 /* Debug */,
+ 331C8089294A63A400263BE5 /* Release */,
+ 331C808A294A63A400263BE5 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147031CF9000F007C117D /* Debug */,
+ 97C147041CF9000F007C117D /* Release */,
+ 249021D3217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 97C147061CF9000F007C117D /* Debug */,
+ 97C147071CF9000F007C117D /* Release */,
+ 249021D4217E4FDB00AE95B9 /* Profile */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 97C146E61CF9000F007C117D /* Project object */;
+}
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000000..919434a6254
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000000..18d981003d6
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000000..f9b0d7c5ea1
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
new file mode 100644
index 00000000000..e42adcb34c2
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner.xcworkspace/contents.xcworkspacedata b/examples/auth/flutter-native-google-auth/ios/Runner.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 00000000000..21a3cc14c74
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/examples/auth/flutter-native-google-auth/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 00000000000..18d981003d6
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/examples/auth/flutter-native-google-auth/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
new file mode 100644
index 00000000000..f9b0d7c5ea1
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
@@ -0,0 +1,8 @@
+
+
+
+
+ PreviewsEnabled
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/AppDelegate.swift b/examples/auth/flutter-native-google-auth/ios/Runner/AppDelegate.swift
new file mode 100644
index 00000000000..70693e4a8c1
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner/AppDelegate.swift
@@ -0,0 +1,13 @@
+import UIKit
+import Flutter
+
+@UIApplicationMain
+@objc class AppDelegate: FlutterAppDelegate {
+ override func application(
+ _ application: UIApplication,
+ didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
+ ) -> Bool {
+ GeneratedPluginRegistrant.register(with: self)
+ return super.application(application, didFinishLaunchingWithOptions: launchOptions)
+ }
+}
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000000..d36b1fab2d9
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,122 @@
+{
+ "images" : [
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-20x20@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-29x29@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-40x40@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "60x60",
+ "idiom" : "iphone",
+ "filename" : "Icon-App-60x60@3x.png",
+ "scale" : "3x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "20x20",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-20x20@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "29x29",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-29x29@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "40x40",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-40x40@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@1x.png",
+ "scale" : "1x"
+ },
+ {
+ "size" : "76x76",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-76x76@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "83.5x83.5",
+ "idiom" : "ipad",
+ "filename" : "Icon-App-83.5x83.5@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "size" : "1024x1024",
+ "idiom" : "ios-marketing",
+ "filename" : "Icon-App-1024x1024@1x.png",
+ "scale" : "1x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
new file mode 100644
index 00000000000..dc9ada4725e
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
new file mode 100644
index 00000000000..7353c41ecf9
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
new file mode 100644
index 00000000000..797d452e458
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
new file mode 100644
index 00000000000..6ed2d933e11
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
new file mode 100644
index 00000000000..4cd7b0099ca
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
new file mode 100644
index 00000000000..fe730945a01
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
new file mode 100644
index 00000000000..321773cd857
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
new file mode 100644
index 00000000000..797d452e458
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
new file mode 100644
index 00000000000..502f463a9bc
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
new file mode 100644
index 00000000000..0ec30343922
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
new file mode 100644
index 00000000000..0ec30343922
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
new file mode 100644
index 00000000000..e9f5fea27c7
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
new file mode 100644
index 00000000000..84ac32ae7d9
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
new file mode 100644
index 00000000000..8953cba0906
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
new file mode 100644
index 00000000000..0467bf12aa4
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
new file mode 100644
index 00000000000..0bedcf2fd46
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage.png",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@2x.png",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "filename" : "LaunchImage@3x.png",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
new file mode 100644
index 00000000000..9da19eacad3
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
new file mode 100644
index 00000000000..9da19eacad3
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
new file mode 100644
index 00000000000..9da19eacad3
Binary files /dev/null and b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png differ
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
new file mode 100644
index 00000000000..89c2725b70f
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
@@ -0,0 +1,5 @@
+# Launch Screen Assets
+
+You can customize the launch screen with your own desired assets by replacing the image files in this directory.
+
+You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images.
\ No newline at end of file
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Base.lproj/LaunchScreen.storyboard b/examples/auth/flutter-native-google-auth/ios/Runner/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 00000000000..f2e259c7c93
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Base.lproj/Main.storyboard b/examples/auth/flutter-native-google-auth/ios/Runner/Base.lproj/Main.storyboard
new file mode 100644
index 00000000000..f3c28516fb3
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner/Base.lproj/Main.storyboard
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Info.plist b/examples/auth/flutter-native-google-auth/ios/Runner/Info.plist
new file mode 100644
index 00000000000..41a71962ac3
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner/Info.plist
@@ -0,0 +1,51 @@
+
+
+
+
+ CADisableMinimumFrameDurationOnPhone
+
+ CFBundleDevelopmentRegion
+ $(DEVELOPMENT_LANGUAGE)
+ CFBundleDisplayName
+ My Auth App
+ CFBundleExecutable
+ $(EXECUTABLE_NAME)
+ CFBundleIdentifier
+ $(PRODUCT_BUNDLE_IDENTIFIER)
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundleName
+ Supabase Auth
+ CFBundlePackageType
+ APPL
+ CFBundleShortVersionString
+ $(FLUTTER_BUILD_NAME)
+ CFBundleSignature
+ ????
+ CFBundleVersion
+ $(FLUTTER_BUILD_NUMBER)
+ LSRequiresIPhoneOS
+
+ UIApplicationSupportsIndirectInputEvents
+
+ UILaunchStoryboardName
+ LaunchScreen
+ UIMainStoryboardFile
+ Main
+ UISupportedInterfaceOrientations
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UISupportedInterfaceOrientations~ipad
+
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
+ UIInterfaceOrientationLandscapeLeft
+ UIInterfaceOrientationLandscapeRight
+
+ UIViewControllerBasedStatusBarAppearance
+
+
+
diff --git a/examples/auth/flutter-native-google-auth/ios/Runner/Runner-Bridging-Header.h b/examples/auth/flutter-native-google-auth/ios/Runner/Runner-Bridging-Header.h
new file mode 100644
index 00000000000..308a2a560b4
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/Runner/Runner-Bridging-Header.h
@@ -0,0 +1 @@
+#import "GeneratedPluginRegistrant.h"
diff --git a/examples/auth/flutter-native-google-auth/ios/RunnerTests/RunnerTests.swift b/examples/auth/flutter-native-google-auth/ios/RunnerTests/RunnerTests.swift
new file mode 100644
index 00000000000..86a7c3b1b61
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/ios/RunnerTests/RunnerTests.swift
@@ -0,0 +1,12 @@
+import Flutter
+import UIKit
+import XCTest
+
+class RunnerTests: XCTestCase {
+
+ func testExample() {
+ // If you add code to the Runner application, consider adding tests here.
+ // See https://developer.apple.com/documentation/xctest for more information about using XCTest.
+ }
+
+}
diff --git a/examples/auth/flutter-native-google-auth/lib/main.dart b/examples/auth/flutter-native-google-auth/lib/main.dart
new file mode 100644
index 00000000000..a7be2ac3f15
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/lib/main.dart
@@ -0,0 +1,31 @@
+import 'package:flutter/material.dart';
+import 'package:myauthapp/screens/login_screen.dart';
+import 'package:supabase_flutter/supabase_flutter.dart';
+
+void main() async {
+ /// TODO: update Supabase credentials with your own
+ await Supabase.initialize(
+ url: 'YOUR_SUPABASE_URL',
+ anonKey: 'YOUR_ANON_KEY',
+ );
+ runApp(const MyApp());
+}
+
+final supabase = Supabase.instance.client;
+
+class MyApp extends StatelessWidget {
+ const MyApp({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ return MaterialApp(
+ debugShowCheckedModeBanner: false,
+ title: 'Flutter Auth',
+ theme: ThemeData(
+ colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
+ useMaterial3: true,
+ ),
+ home: const LoginScreen(),
+ );
+ }
+}
diff --git a/examples/auth/flutter-native-google-auth/lib/screens/login_screen.dart b/examples/auth/flutter-native-google-auth/lib/screens/login_screen.dart
new file mode 100644
index 00000000000..562e3d8376b
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/lib/screens/login_screen.dart
@@ -0,0 +1,127 @@
+import 'dart:convert';
+import 'dart:io';
+import 'dart:math';
+
+import 'package:crypto/crypto.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_appauth/flutter_appauth.dart';
+import 'package:myauthapp/main.dart';
+import 'package:myauthapp/screens/profile_screen.dart';
+import 'package:supabase_flutter/supabase_flutter.dart';
+
+class LoginScreen extends StatefulWidget {
+ const LoginScreen({super.key});
+
+ @override
+ State createState() => _LoginScreenState();
+}
+
+class _LoginScreenState extends State {
+ @override
+ void initState() {
+ _setupAuthListener();
+ super.initState();
+ }
+
+ void _setupAuthListener() {
+ supabase.auth.onAuthStateChange.listen((data) {
+ final event = data.event;
+ if (event == AuthChangeEvent.signedIn) {
+ Navigator.of(context).pushReplacement(
+ MaterialPageRoute(
+ builder: (context) => const ProfileScreen(),
+ ),
+ );
+ }
+ });
+ }
+
+ /// Function to generate a random 16 character string.
+ String _generateRandomString() {
+ final random = Random.secure();
+ return base64Url.encode(List.generate(16, (_) => random.nextInt(256)));
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text('Login'),
+ ),
+ body: Center(
+ child: ElevatedButton(
+ onPressed: () async {
+ const appAuth = FlutterAppAuth();
+
+ // Just a random string
+ final rawNonce = _generateRandomString();
+ final hashedNonce =
+ sha256.convert(utf8.encode(rawNonce)).toString();
+
+ /// TODO: update the iOS and Android client ID with your own.
+ ///
+ /// Client ID that you registered with Google Cloud.
+ /// You will have two different values for iOS and Android.
+ final clientId =
+ Platform.isIOS ? 'IOS_CLIENT_ID' : 'ANDROID_CLIENT_ID';
+
+ /// Set as reversed DNS form of Google Client ID + `:/` for Google login
+ final redirectUrl = '${clientId.split('.').reversed.join('.')}:/';
+
+ /// Fixed value for google login
+ const discoveryUrl =
+ 'https://accounts.google.com/.well-known/openid-configuration';
+
+ // authorize the user by opening the concent page
+ final result = await appAuth.authorize(
+ AuthorizationRequest(
+ clientId,
+ redirectUrl,
+ discoveryUrl: discoveryUrl,
+ nonce: hashedNonce,
+ scopes: [
+ 'openid',
+ 'email',
+ 'profile',
+ ],
+ ),
+ );
+
+ if (result == null) {
+ throw 'No result';
+ }
+
+ // Request the access and id token to google
+ final tokenResult = await appAuth.token(
+ TokenRequest(
+ clientId,
+ redirectUrl,
+ authorizationCode: result.authorizationCode,
+ discoveryUrl: discoveryUrl,
+ codeVerifier: result.codeVerifier,
+ nonce: result.nonce,
+ scopes: [
+ 'openid',
+ 'email',
+ ],
+ ),
+ );
+
+ final idToken = tokenResult?.idToken;
+
+ if (idToken == null) {
+ throw 'No idToken';
+ }
+
+ await supabase.auth.signInWithIdToken(
+ provider: Provider.google,
+ idToken: idToken,
+ nonce: rawNonce,
+ );
+ },
+ child: const Text('Google login'),
+ ),
+ ),
+ );
+ }
+}
diff --git a/examples/auth/flutter-native-google-auth/lib/screens/profile_screen.dart b/examples/auth/flutter-native-google-auth/lib/screens/profile_screen.dart
new file mode 100644
index 00000000000..b3c73dce36b
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/lib/screens/profile_screen.dart
@@ -0,0 +1,54 @@
+import 'package:flutter/material.dart';
+import 'package:myauthapp/main.dart';
+import 'package:myauthapp/screens/login_screen.dart';
+
+class ProfileScreen extends StatelessWidget {
+ const ProfileScreen({super.key});
+
+ @override
+ Widget build(BuildContext context) {
+ final user = supabase.auth.currentUser;
+ final profileImageUrl = user?.userMetadata?['avatar_url'];
+ final fullName = user?.userMetadata?['full_name'];
+ return Scaffold(
+ appBar: AppBar(
+ title: const Text('Profile'),
+ actions: [
+ TextButton(
+ onPressed: () async {
+ await supabase.auth.signOut();
+ if (context.mounted) {
+ Navigator.of(context).pushReplacement(
+ MaterialPageRoute(builder: (context) => const LoginScreen()),
+ );
+ }
+ },
+ child: const Text('Sign out'),
+ )
+ ],
+ ),
+ body: Center(
+ child: Column(
+ mainAxisSize: MainAxisSize.min,
+ children: [
+ if (profileImageUrl != null)
+ ClipOval(
+ child: Image.network(
+ profileImageUrl,
+ width: 100,
+ height: 100,
+ fit: BoxFit.cover,
+ ),
+ ),
+ const SizedBox(height: 16),
+ Text(
+ fullName ?? '',
+ style: Theme.of(context).textTheme.headlineMedium,
+ ),
+ const SizedBox(height: 32),
+ ],
+ ),
+ ),
+ );
+ }
+}
diff --git a/examples/auth/flutter-native-google-auth/pubspec.lock b/examples/auth/flutter-native-google-auth/pubspec.lock
new file mode 100644
index 00000000000..8af39a793f2
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/pubspec.lock
@@ -0,0 +1,658 @@
+# Generated by pub
+# See https://dart.dev/tools/pub/glossary#lockfile
+packages:
+ app_links:
+ dependency: transitive
+ description:
+ name: app_links
+ sha256: "16725e716afd0634a5441654b1dda2b6c5557aa230884b5e1f41a5aa546a4cb6"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.4.3"
+ async:
+ dependency: transitive
+ description:
+ name: async
+ sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.11.0"
+ boolean_selector:
+ dependency: transitive
+ description:
+ name: boolean_selector
+ sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ characters:
+ dependency: transitive
+ description:
+ name: characters
+ sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.0"
+ clock:
+ dependency: transitive
+ description:
+ name: clock
+ sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.1"
+ collection:
+ dependency: transitive
+ description:
+ name: collection
+ sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.17.1"
+ crypto:
+ dependency: "direct main"
+ description:
+ name: crypto
+ sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.3"
+ cupertino_icons:
+ dependency: "direct main"
+ description:
+ name: cupertino_icons
+ sha256: e35129dc44c9118cee2a5603506d823bab99c68393879edb440e0090d07586be
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.5"
+ fake_async:
+ dependency: transitive
+ description:
+ name: fake_async
+ sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.1"
+ ffi:
+ dependency: transitive
+ description:
+ name: ffi
+ sha256: ed5337a5660c506388a9f012be0288fb38b49020ce2b45fe1f8b8323fe429f99
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.2"
+ file:
+ dependency: transitive
+ description:
+ name: file
+ sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.1.4"
+ flutter:
+ dependency: "direct main"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_appauth:
+ dependency: "direct main"
+ description:
+ name: flutter_appauth
+ sha256: a047019b525ab0e260776d1b0da1000b7416b45b9e8dd02d124c9da571fc1918
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.0.0"
+ flutter_appauth_platform_interface:
+ dependency: transitive
+ description:
+ name: flutter_appauth_platform_interface
+ sha256: "44feaa7058191b5d3cd7c9ff195262725773643121bcada172d49c2ddcff71cb"
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.0.0"
+ flutter_lints:
+ dependency: "direct dev"
+ description:
+ name: flutter_lints
+ sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.1"
+ flutter_test:
+ dependency: "direct dev"
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ flutter_web_plugins:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.0"
+ functions_client:
+ dependency: transitive
+ description:
+ name: functions_client
+ sha256: "3b157b4d3ae9e38614fd80fab76d1ef1e0e39ff3412a45de2651f27cecb9d2d2"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.2"
+ gotrue:
+ dependency: transitive
+ description:
+ name: gotrue
+ sha256: "3639beedcbf3d63d9b2a6ca856138aff03d9e09bddd4c5477de77c58f36c83ae"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.9.0"
+ hive:
+ dependency: transitive
+ description:
+ name: hive
+ sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.3"
+ hive_flutter:
+ dependency: transitive
+ description:
+ name: hive_flutter
+ sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ http:
+ dependency: transitive
+ description:
+ name: http
+ sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.0"
+ http_parser:
+ dependency: transitive
+ description:
+ name: http_parser
+ sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.0.2"
+ js:
+ dependency: transitive
+ description:
+ name: js
+ sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.6.7"
+ jwt_decode:
+ dependency: transitive
+ description:
+ name: jwt_decode
+ sha256: d2e9f68c052b2225130977429d30f187aa1981d789c76ad104a32243cfdebfbb
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.3.1"
+ lints:
+ dependency: transitive
+ description:
+ name: lints
+ sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ matcher:
+ dependency: transitive
+ description:
+ name: matcher
+ sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.12.15"
+ material_color_utilities:
+ dependency: transitive
+ description:
+ name: material_color_utilities
+ sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.2.0"
+ meta:
+ dependency: transitive
+ description:
+ name: meta
+ sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.9.1"
+ mime:
+ dependency: transitive
+ description:
+ name: mime
+ sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.4"
+ path:
+ dependency: transitive
+ description:
+ name: path
+ sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.8.3"
+ path_provider:
+ dependency: transitive
+ description:
+ name: path_provider
+ sha256: "3087813781ab814e4157b172f1a11c46be20179fcc9bea043e0fba36bc0acaa2"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.15"
+ path_provider_android:
+ dependency: transitive
+ description:
+ name: path_provider_android
+ sha256: "2cec049d282c7f13c594b4a73976b0b4f2d7a1838a6dd5aaf7bd9719196bee86"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.27"
+ path_provider_foundation:
+ dependency: transitive
+ description:
+ name: path_provider_foundation
+ sha256: "1995d88ec2948dac43edf8fe58eb434d35d22a2940ecee1a9fefcd62beee6eb3"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.3"
+ path_provider_linux:
+ dependency: transitive
+ description:
+ name: path_provider_linux
+ sha256: ffbb8cc9ed2c9ec0e4b7a541e56fd79b138e8f47d2fb86815f15358a349b3b57
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.11"
+ path_provider_platform_interface:
+ dependency: transitive
+ description:
+ name: path_provider_platform_interface
+ sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.6"
+ path_provider_windows:
+ dependency: transitive
+ description:
+ name: path_provider_windows
+ sha256: "1cb68ba4cd3a795033de62ba1b7b4564dace301f952de6bfb3cd91b202b6ee96"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.7"
+ platform:
+ dependency: transitive
+ description:
+ name: platform
+ sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.0"
+ plugin_platform_interface:
+ dependency: transitive
+ description:
+ name: plugin_platform_interface
+ sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
+ postgrest:
+ dependency: transitive
+ description:
+ name: postgrest
+ sha256: "78fd180ecd2274df7b04c406746495b5c627248856458f8f537bf5348de9c817"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.2"
+ process:
+ dependency: transitive
+ description:
+ name: process
+ sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.2.4"
+ realtime_client:
+ dependency: transitive
+ description:
+ name: realtime_client
+ sha256: "0342f73f42345f3547e3cdcc804a0ed108fcd9142d1537d159aead94a213e248"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.1"
+ retry:
+ dependency: transitive
+ description:
+ name: retry
+ sha256: "822e118d5b3aafed083109c72d5f484c6dc66707885e07c0fbcb8b986bba7efc"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.1.2"
+ rxdart:
+ dependency: transitive
+ description:
+ name: rxdart
+ sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb"
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.27.7"
+ shared_preferences:
+ dependency: transitive
+ description:
+ name: shared_preferences
+ sha256: "396f85b8afc6865182610c0a2fc470853d56499f75f7499e2a73a9f0539d23d0"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.2"
+ shared_preferences_android:
+ dependency: transitive
+ description:
+ name: shared_preferences_android
+ sha256: "6478c6bbbecfe9aced34c483171e90d7c078f5883558b30ec3163cf18402c749"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
+ shared_preferences_foundation:
+ dependency: transitive
+ description:
+ name: shared_preferences_foundation
+ sha256: e014107bb79d6d3297196f4f2d0db54b5d1f85b8ea8ff63b8e8b391a02700feb
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.2"
+ shared_preferences_linux:
+ dependency: transitive
+ description:
+ name: shared_preferences_linux
+ sha256: "9d387433ca65717bbf1be88f4d5bb18f10508917a8fa2fb02e0fd0d7479a9afa"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.0"
+ shared_preferences_platform_interface:
+ dependency: transitive
+ description:
+ name: shared_preferences_platform_interface
+ sha256: "23b052f17a25b90ff2b61aad4cc962154da76fb62848a9ce088efe30d7c50ab1"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.0"
+ shared_preferences_web:
+ dependency: transitive
+ description:
+ name: shared_preferences_web
+ sha256: "74083203a8eae241e0de4a0d597dbedab3b8fef5563f33cf3c12d7e93c655ca5"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.0"
+ shared_preferences_windows:
+ dependency: transitive
+ description:
+ name: shared_preferences_windows
+ sha256: "5e588e2efef56916a3b229c3bfe81e6a525665a454519ca51dbcc4236a274173"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.0"
+ sign_in_with_apple:
+ dependency: transitive
+ description:
+ name: sign_in_with_apple
+ sha256: ac3b113767dfdd765078c507dad9d4d9fe96b669cc7bd88fc36fc15376fb3400
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.3.0"
+ sign_in_with_apple_platform_interface:
+ dependency: transitive
+ description:
+ name: sign_in_with_apple_platform_interface
+ sha256: a5883edee09ed6be19de19e7d9f618a617fe41a6fa03f76d082dfb787e9ea18d
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
+ sign_in_with_apple_web:
+ dependency: transitive
+ description:
+ name: sign_in_with_apple_web
+ sha256: "44b66528f576e77847c14999d5e881e17e7223b7b0625a185417829e5306f47a"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.1"
+ sky_engine:
+ dependency: transitive
+ description: flutter
+ source: sdk
+ version: "0.0.99"
+ source_span:
+ dependency: transitive
+ description:
+ name: source_span
+ sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.9.1"
+ stack_trace:
+ dependency: transitive
+ description:
+ name: stack_trace
+ sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.11.0"
+ storage_client:
+ dependency: transitive
+ description:
+ name: storage_client
+ sha256: a3024569213b064587d616827747b766f9bc796e80cec99bd5ffb597b8aeb018
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.5.1"
+ stream_channel:
+ dependency: transitive
+ description:
+ name: stream_channel
+ sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.1"
+ string_scanner:
+ dependency: transitive
+ description:
+ name: string_scanner
+ sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.0"
+ supabase:
+ dependency: transitive
+ description:
+ name: supabase
+ sha256: d854acbcfcfe0b3b703854aedd05858d684b2e46f8dca70b262665d7f70ad3d8
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.9.5"
+ supabase_flutter:
+ dependency: "direct main"
+ description:
+ name: supabase_flutter
+ sha256: "2a32140420a3bd1a9e8c093c08d12bbd93ee9fbb8fc373397ef5a3ad9d93f55c"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.10.6"
+ term_glyph:
+ dependency: transitive
+ description:
+ name: term_glyph
+ sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.2.1"
+ test_api:
+ dependency: transitive
+ description:
+ name: test_api
+ sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb
+ url: "https://pub.dev"
+ source: hosted
+ version: "0.5.1"
+ typed_data:
+ dependency: transitive
+ description:
+ name: typed_data
+ sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.3.2"
+ universal_io:
+ dependency: transitive
+ description:
+ name: universal_io
+ sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.2.2"
+ url_launcher:
+ dependency: transitive
+ description:
+ name: url_launcher
+ sha256: eb1e00ab44303d50dd487aab67ebc575456c146c6af44422f9c13889984c00f3
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.1.11"
+ url_launcher_android:
+ dependency: transitive
+ description:
+ name: url_launcher_android
+ sha256: "15f5acbf0dce90146a0f5a2c4a002b1814a6303c4c5c075aa2623b2d16156f03"
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.0.36"
+ url_launcher_ios:
+ dependency: transitive
+ description:
+ name: url_launcher_ios
+ sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2"
+ url: "https://pub.dev"
+ source: hosted
+ version: "6.1.4"
+ url_launcher_linux:
+ dependency: transitive
+ description:
+ name: url_launcher_linux
+ sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.5"
+ url_launcher_macos:
+ dependency: transitive
+ description:
+ name: url_launcher_macos
+ sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.5"
+ url_launcher_platform_interface:
+ dependency: transitive
+ description:
+ name: url_launcher_platform_interface
+ sha256: bfdfa402f1f3298637d71ca8ecfe840b4696698213d5346e9d12d4ab647ee2ea
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.3"
+ url_launcher_web:
+ dependency: transitive
+ description:
+ name: url_launcher_web
+ sha256: "6bb1e5d7fe53daf02a8fee85352432a40b1f868a81880e99ec7440113d5cfcab"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.0.17"
+ url_launcher_windows:
+ dependency: transitive
+ description:
+ name: url_launcher_windows
+ sha256: "254708f17f7c20a9c8c471f67d86d76d4a3f9c1591aad1e15292008aceb82771"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.0.6"
+ vector_math:
+ dependency: transitive
+ description:
+ name: vector_math
+ sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.1.4"
+ web_socket_channel:
+ dependency: transitive
+ description:
+ name: web_socket_channel
+ sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.4.0"
+ webview_flutter:
+ dependency: transitive
+ description:
+ name: webview_flutter
+ sha256: "789d52bd789373cc1e100fb634af2127e86c99cf9abde09499743270c5de8d00"
+ url: "https://pub.dev"
+ source: hosted
+ version: "4.2.2"
+ webview_flutter_android:
+ dependency: transitive
+ description:
+ name: webview_flutter_android
+ sha256: "532135f6f6b8030cd039f30eab23f340d650350e29f38e9b37d2eaad028f1018"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.8.0"
+ webview_flutter_platform_interface:
+ dependency: transitive
+ description:
+ name: webview_flutter_platform_interface
+ sha256: "656e2aeaef318900fffd21468b6ddc7958c7092a642f0e7220bac328b70d4a81"
+ url: "https://pub.dev"
+ source: hosted
+ version: "2.3.1"
+ webview_flutter_wkwebview:
+ dependency: transitive
+ description:
+ name: webview_flutter_wkwebview
+ sha256: "7b203961d6830f3e5ed1df4c4f0493fea8388a46c4d43716167c4a8ba8ecbe83"
+ url: "https://pub.dev"
+ source: hosted
+ version: "3.6.0"
+ win32:
+ dependency: transitive
+ description:
+ name: win32
+ sha256: dfdf0136e0aa7a1b474ea133e67cb0154a0acd2599c4f3ada3b49d38d38793ee
+ url: "https://pub.dev"
+ source: hosted
+ version: "5.0.5"
+ xdg_directories:
+ dependency: transitive
+ description:
+ name: xdg_directories
+ sha256: ee1505df1426458f7f60aac270645098d318a8b4766d85fde75f76f2e21807d1
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.0.0"
+ yet_another_json_isolate:
+ dependency: transitive
+ description:
+ name: yet_another_json_isolate
+ sha256: "86fad76026c4241a32831d6c7febd8f9bded5019e2cd36c5b148499808d8307d"
+ url: "https://pub.dev"
+ source: hosted
+ version: "1.1.1"
+sdks:
+ dart: ">=3.0.5 <4.0.0"
+ flutter: ">=3.3.0"
diff --git a/examples/auth/flutter-native-google-auth/pubspec.yaml b/examples/auth/flutter-native-google-auth/pubspec.yaml
new file mode 100644
index 00000000000..50025acda2c
--- /dev/null
+++ b/examples/auth/flutter-native-google-auth/pubspec.yaml
@@ -0,0 +1,27 @@
+name: myauthapp
+description: A new Flutter project.
+
+publish_to: 'none'
+
+version: 1.0.0+1
+
+environment:
+ sdk: '>=3.0.5 <4.0.0'
+
+dependencies:
+ flutter:
+ sdk: flutter
+
+ cupertino_icons: ^1.0.2
+ supabase_flutter: ^1.10.6
+ flutter_appauth: ^6.0.0
+ crypto: ^3.0.3
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+
+ flutter_lints: ^2.0.0
+
+flutter:
+ uses-material-design: true
diff --git a/examples/todo-list/nextjs-todo-list/README.md b/examples/todo-list/nextjs-todo-list/README.md
index 5a97dbd8e56..5d9f9cd51a2 100644
--- a/examples/todo-list/nextjs-todo-list/README.md
+++ b/examples/todo-list/nextjs-todo-list/README.md
@@ -11,7 +11,7 @@
The Vercel deployment will guide you through creating a Supabase account and project. After installation of the Supabase integration, all relevant environment variables will be set up so that the project is usable immediately after deployment 🚀
-[](https://vercel.com/new/git/external?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fexamples%2Ftree%2Fmain%2Fsupabase-js-v1%2Ftodo-list%2Fnextjs-todo-list&project-name=supabase-todo-list&repository-name=supabase-todo-list&demo-title=Todo%20list&demo-description=An%20example%20web%20app%20using%20Supabase%20and%20Next.js&demo-url=https%3A%2F%2Fsupabase-nextjs-todo-list.vercel.app&demo-image=https%3A%2F%2Fi.imgur.com%2FGJauPlN.png&integration-ids=oac_jUduyjQgOyzev1fjrW83NYOv&external-id=supabase-todo-list)
+[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Ftodo-list%2Fnextjs-todo-list&project-name=supabase-nextjs-todo-list&repository-name=supabase-nextjs-todo-list&integration-ids=oac_VqOgBHqhEoFTPzGkPd7L0iH6&external-id=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Ftodo-list%2Fnextjs-todo-list)
## Build from scratch
diff --git a/examples/todo-list/nextjs-todo-list/supabase/.gitignore b/examples/todo-list/nextjs-todo-list/supabase/.gitignore
new file mode 100644
index 00000000000..773c7c3e0a1
--- /dev/null
+++ b/examples/todo-list/nextjs-todo-list/supabase/.gitignore
@@ -0,0 +1,3 @@
+# Supabase
+.branches
+.temp
diff --git a/examples/todo-list/nextjs-todo-list/supabase/config.toml b/examples/todo-list/nextjs-todo-list/supabase/config.toml
new file mode 100644
index 00000000000..1a1fc154f7c
--- /dev/null
+++ b/examples/todo-list/nextjs-todo-list/supabase/config.toml
@@ -0,0 +1,87 @@
+# A string used to distinguish different Supabase projects on the same host. Defaults to the working
+# directory name when running `supabase init`.
+project_id = "nextjs-todo-list"
+
+[api]
+# Port to use for the API URL.
+port = 54321
+# Schemas to expose in your API. Tables, views and stored procedures in this schema will get API
+# endpoints. public and storage are always included.
+schemas = ["public", "storage", "graphql_public"]
+# Extra schemas to add to the search_path of every request. public is always included.
+extra_search_path = ["public", "extensions"]
+# The maximum number of rows returns from a view, table, or stored procedure. Limits payload size
+# for accidental or malicious requests.
+max_rows = 1000
+
+[db]
+# Port to use for the local database URL.
+port = 54322
+# The database major version to use. This has to be the same as your remote database's. Run `SHOW
+# server_version;` on the remote database to check.
+major_version = 15
+
+[studio]
+# Port to use for Supabase Studio.
+port = 54323
+
+[kong]
+# Number of nginx workers for handling requests. Set this to 1 to minimize memory usage.
+# Omitting it or setting it to 0 will autodetect based on the number of CPU cores.
+nginx_worker_processes = 1
+
+# Email testing server. Emails sent with the local dev setup are not actually sent - rather, they
+# are monitored, and you can view the emails that would have been sent from the web interface.
+[inbucket]
+# Port to use for the email testing server web interface.
+port = 54324
+smtp_port = 54325
+pop3_port = 54326
+
+[storage]
+# The maximum file size allowed (e.g. "5MB", "500KB").
+file_size_limit = "50MiB"
+
+[auth]
+# The base URL of your website. Used as an allow-list for redirects and for constructing URLs used
+# in emails.
+site_url = "http://localhost:3000"
+# A list of *exact* URLs that auth providers are permitted to redirect to post authentication.
+additional_redirect_urls = ["https://localhost:3000"]
+# How long tokens are valid for, in seconds. Defaults to 3600 (1 hour), maximum 604,800 seconds (one
+# week).
+jwt_expiry = 3600
+# Allow/disallow new user signups to your project.
+enable_signup = true
+
+[auth.email]
+# Allow/disallow new user signups via email to your project.
+enable_signup = true
+# If enabled, a user will be required to confirm any email change on both the old, and new email
+# addresses. If disabled, only the new email is required to confirm.
+double_confirm_changes = true
+# If enabled, users need to confirm their email address before signing in.
+enable_confirmations = false
+
+# Use an external OAuth provider. The full list of providers are: `apple`, `azure`, `bitbucket`,
+# `discord`, `facebook`, `github`, `gitlab`, `google`, `keycloak`, `linkedin`, `notion`, `twitch`,
+# `twitter`, `slack`, `spotify`, `workos`, `zoom`.
+[auth.external.apple]
+enabled = false
+client_id = ""
+secret = ""
+# Overrides the default auth redirectUrl.
+redirect_uri = ""
+# Overrides the default auth provider URL. Used to support self-hosted gitlab, single-tenant Azure,
+# or any other third-party OIDC providers.
+url = ""
+
+[analytics]
+enabled = false
+port = 54327
+vector_port = 54328
+# Setup BigQuery project to enable log viewer on local development stack.
+# See: https://supabase.com/docs/guides/getting-started/local-development#enabling-local-logging
+gcp_project_id = ""
+gcp_project_number = ""
+gcp_jwt_path = "supabase/gcloud.json"
diff --git a/examples/todo-list/nextjs-todo-list/supabase/migrations/20230712094349_init.sql b/examples/todo-list/nextjs-todo-list/supabase/migrations/20230712094349_init.sql
new file mode 100644
index 00000000000..1b1a98ace2e
--- /dev/null
+++ b/examples/todo-list/nextjs-todo-list/supabase/migrations/20230712094349_init.sql
@@ -0,0 +1,16 @@
+create table todos (
+ id bigint generated by default as identity primary key,
+ user_id uuid references auth.users not null,
+ task text check (char_length(task) > 3),
+ is_complete boolean default false,
+ inserted_at timestamp with time zone default timezone('utc'::text, now()) not null
+);
+alter table todos enable row level security;
+create policy "Individuals can create todos." on todos for
+ insert with check (auth.uid() = user_id);
+create policy "Individuals can view their own todos. " on todos for
+ select using (auth.uid() = user_id);
+create policy "Individuals can update their own todos." on todos for
+ update using (auth.uid() = user_id);
+create policy "Individuals can delete their own todos." on todos for
+ delete using (auth.uid() = user_id);
\ No newline at end of file
diff --git a/examples/todo-list/nextjs-todo-list/supabase/seed.sql b/examples/todo-list/nextjs-todo-list/supabase/seed.sql
new file mode 100644
index 00000000000..e69de29bb2d
diff --git a/examples/user-management/nextjs-user-management/README.md b/examples/user-management/nextjs-user-management/README.md
index ece27d41a1d..c3609f3d5d5 100644
--- a/examples/user-management/nextjs-user-management/README.md
+++ b/examples/user-management/nextjs-user-management/README.md
@@ -25,7 +25,7 @@ This demonstrates how to use:
The Vercel deployment will guide you through creating a Supabase account and project. After installation of the Supabase integration, all relevant environment variables will be set up so that the project is usable immediately after deployment 🚀.
-[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Fuser-management%2Fnextjs-user-management&project-name=nextjs-user-management&repository-name=nextjs-user-management&integration-ids=oac_jUduyjQgOyzev1fjrW83NYOv&external-id=nextjs-user-management)
+[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Fuser-management%2Fnextjs-user-management&project-name=supabase-nextjs-user-management&repository-name=supabase-nextjs-user-management&integration-ids=oac_VqOgBHqhEoFTPzGkPd7L0iH6&external-id=https%3A%2F%2Fgithub.com%2Fsupabase%2Fsupabase%2Ftree%2Fmaster%2Fexamples%2Fuser-management%2Fnextjs-user-management)
### 1. Create new project
diff --git a/packages/common/Providers.tsx b/packages/common/Providers.tsx
index ac2b9b90c29..0312f11c17a 100644
--- a/packages/common/Providers.tsx
+++ b/packages/common/Providers.tsx
@@ -15,6 +15,7 @@ export interface UseThemeProps {
interface ThemeProviderProps {
children?: any
+ detectSystemColorPreference?: boolean
}
export const ThemeContext = createContext({
@@ -24,16 +25,23 @@ export const ThemeContext = createContext({
export const useTheme = () => useContext(ThemeContext)
-export const ThemeProvider = ({ children }: ThemeProviderProps) => {
+export const ThemeProvider = ({
+ detectSystemColorPreference = true,
+ children,
+}: ThemeProviderProps) => {
const [isDarkMode, setIsDarkMode] = useState(false)
useEffect(() => {
const key = localStorage.getItem('supabaseDarkMode')
- const mode = key === 'true'
+ // If no localStorage is set
+ // and detectSystemColorPreference is false
+ // default to dark mode
+ const hasNoKey = key === null
+ const isDarkMode = hasNoKey || key === 'true'
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches
- prefersDark ? toggleTheme(true) : toggleTheme(mode)
+ hasNoKey && detectSystemColorPreference ? toggleTheme(prefersDark) : toggleTheme(isDarkMode)
}, [])
const toggleTheme: UseThemeProps['toggleTheme'] = (darkMode) => {
diff --git a/packages/shared-data/index.ts b/packages/shared-data/index.ts
index ad135754ea8..07592bab736 100644
--- a/packages/shared-data/index.ts
+++ b/packages/shared-data/index.ts
@@ -2,6 +2,7 @@ import tweets from './tweets'
import logConstants from './logConstants'
import { plans, PricingInformation } from './plans'
import { pricing } from './pricing'
+import { products } from './products'
-export { tweets, logConstants, plans, pricing }
+export { tweets, logConstants, plans, pricing, products }
export type { PricingInformation }
diff --git a/packages/shared-data/plans.ts b/packages/shared-data/plans.ts
index 58c7bcf5f0c..33851d576b0 100644
--- a/packages/shared-data/plans.ts
+++ b/packages/shared-data/plans.ts
@@ -3,6 +3,7 @@ export interface PricingInformation {
name: string
nameBadge?: string
costUnit?: string
+ costUnitOrg?: string
href: string
priceLabel?: string
priceMonthly: number | string
@@ -10,6 +11,7 @@ export interface PricingInformation {
description: string
preface: string
features: string[]
+ featuresOrg?: string[]
footer?: string
cta: string
}
@@ -20,6 +22,7 @@ export const plans: PricingInformation[] = [
name: 'Free',
nameBadge: '',
costUnit: '/ month / project',
+ costUnitOrg: '/ month',
href: 'https://supabase.com/dashboard/new/new-project',
priceLabel: '',
priceMonthly: 0,
@@ -48,11 +51,27 @@ export const plans: PricingInformation[] = [
name: 'Pro',
nameBadge: '',
costUnit: '/ month / project',
+ costUnitOrg: '/ month',
href: 'https://supabase.com/dashboard/new/new-project',
priceLabel: 'From',
warning: 'Usage-based plan',
priceMonthly: 25,
description: 'For production applications with the option to scale.',
+ featuresOrg: [
+ '$10 Compute Credits',
+ 'No project pausing',
+ 'Daily backups stored for 7 days',
+ '8GB database space included',
+ '100GB file storage included',
+ '50GB bandwidth included',
+ '5GB file uploads included',
+ '100,000 monthly active users included',
+ '2M Edge Function invocations included',
+ '500 concurrent Realtime connections included',
+ '5 million Realtime messages included',
+ '7-day log retention',
+ 'Email support',
+ ],
features: [
'No project pausing',
'Daily backups stored for 7 days',
@@ -77,6 +96,7 @@ export const plans: PricingInformation[] = [
name: 'Team',
nameBadge: 'New',
costUnit: '/ month',
+ costUnitOrg: '/ month',
href: 'https://forms.supabase.com/team',
priceLabel: 'From',
warning: 'Usage-based plan',
diff --git a/packages/shared-data/products.ts b/packages/shared-data/products.ts
new file mode 100644
index 00000000000..034d8bfab4a
--- /dev/null
+++ b/packages/shared-data/products.ts
@@ -0,0 +1,92 @@
+export type PRODUCT =
+ | PRODUCT_SHORTNAMES.DATABASE
+ | PRODUCT_SHORTNAMES.AUTHENTICATION
+ | PRODUCT_SHORTNAMES.STORAGE
+ | PRODUCT_SHORTNAMES.FUNCTIONS
+ | PRODUCT_SHORTNAMES.REALTIME
+ | PRODUCT_SHORTNAMES.VECTOR
+
+export enum PRODUCT_NAMES {
+ DATABASE = 'Database',
+ AUTHENTICATION = 'Authentication',
+ STORAGE = 'Storage',
+ FUNCTIONS = 'Edge Functions',
+ REALTIME = 'Realtime',
+ VECTOR = 'Vector',
+}
+
+export enum PRODUCT_SHORTNAMES {
+ DATABASE = 'database',
+ AUTHENTICATION = 'authentication',
+ STORAGE = 'storage',
+ FUNCTIONS = 'functions',
+ REALTIME = 'realtime',
+ VECTOR = 'vector',
+}
+
+// icon can be 16px, 18px or 24px
+interface Icon {
+ '16': string
+ '18': string
+ '24': string
+}
+
+interface ProductProps {
+ name: PRODUCT_NAMES
+ icon: Icon
+}
+
+type Products = {
+ [product in PRODUCT]: ProductProps
+}
+
+export const products: Products = {
+ database: {
+ name: PRODUCT_NAMES.DATABASE,
+ icon: {
+ '16': 'M3.502 6h8.996v4H3.502V6ZM3 10.002h10v4H3v-4ZM3 2h10v4H3V2Z',
+ '18': 'M3.00829 6.33225H15.1778V11.6648H3.00829V6.33225Z M2 13.0839C2 12.3016 2.63418 11.6674 3.41647 11.6674H14.7483C15.5306 11.6674 16.1648 12.3016 16.1648 13.0839V15.5835C16.1648 16.3658 15.5306 17 14.7483 17H3.41647C2.63418 17 2 16.3658 2 15.5835V13.0839Z M2 2.41647C2 1.63418 2.63418 1 3.41647 1H14.7483C15.5306 1 16.1648 1.63418 16.1648 2.41647V4.9161C16.1648 5.6984 15.5306 6.33257 14.7483 6.33257H3.41647C2.63418 6.33257 2 5.6984 2 4.9161V2.41647Z',
+ '24': 'M5.18625 8.66531H19.5035V15.331H5.18625V8.66531Z M4 17.0007C4 16.0804 4.7461 15.3343 5.66645 15.3343H18.9984C19.9187 15.3343 20.6648 16.0804 20.6648 17.0007V20.3335C20.6648 21.2539 19.9187 22 18.9984 22H5.66646C4.7461 22 4 21.2539 4 20.3335V17.0007Z M4 3.66646C4 2.7461 4.7461 2 5.66645 2H18.9984C19.9187 2 20.6648 2.7461 20.6648 3.66645V6.99926C20.6648 7.91962 19.9187 8.66572 18.9984 8.66572H5.66646C4.7461 8.66572 4 7.91962 4 6.99926V3.66646Z',
+ },
+ },
+ authentication: {
+ name: PRODUCT_NAMES.AUTHENTICATION,
+ icon: {
+ '16': 'M3.494 9.975h5m-5 0v2h5v-2m-5 0v-2h5v2M10 5V3a2 2 0 1 0-4 0v2m6.473 0v9h-9V5h9Z',
+ '18': 'M3.02644 12.0457H9.18048M3.02644 12.0457V14.5072H9.18048V12.0457M3.02644 12.0457V9.58414H9.18048V12.0457M11.0339 5.92308V3.46154C11.0339 2.10207 9.93179 1 8.57228 1C7.21277 1 6.11067 2.10207 6.11067 3.46154V5.92308M3 8.38465L3 14.5384C3 15.8979 4.10208 17 5.46157 17H11.6157C12.9752 17 14.0773 15.8979 14.0773 14.5384V8.38465C14.0773 7.02516 12.9752 5.92308 11.6157 5.92308L5.46158 5.92308C4.10209 5.92308 3 7.02516 3 8.38465Z',
+ '24': 'M5.03305 15.8071H12.7252M5.03305 15.8071V18.884H12.7252V15.8071M5.03305 15.8071V12.7302H12.7252V15.8071M15.0419 8.15385V5.07692C15.0419 3.37759 13.6643 2 11.965 2C10.2657 2 8.88814 3.37759 8.88814 5.07692V8.15385M5 11.2307L5 18.9231C5 20.6224 6.37757 22 8.07689 22H15.769C17.4683 22 18.8459 20.6224 18.8459 18.9231V11.2307C18.8459 9.53142 17.4683 8.15385 15.769 8.15385L8.07689 8.15385C6.37757 8.15385 5 9.53142 5 11.2307Z',
+ },
+ },
+ storage: {
+ name: PRODUCT_NAMES.STORAGE,
+ icon: {
+ '16': 'M13 7.616V5.6l-3.618-3.6H3v4.03m9.964-.447L9.38 2v3.584h3.584ZM1.974 6v8h12V7.509h-7.59l-1.533-1.51H1.974Z',
+ '18': 'M15.7014 8.34507V5.80169L10.8772 1.00033H3.7014C2.96501 1.00033 2.36805 1.59728 2.36805 2.33367V6.33312M15.6545 5.77939L10.8752 1L10.8752 4.44605C10.8752 5.18243 11.4722 5.77939 12.2086 5.77939L15.6545 5.77939ZM4.29028 6.33312H2.33335C1.59696 6.33312 1 6.93008 1 7.66647V14.3333C1 15.8061 2.19392 17 3.66669 17H14.3333C15.8061 17 17 15.8061 17 14.3333V9.67842C17 8.94203 16.403 8.34507 15.6667 8.34507H7.42712C7.07725 8.34507 6.7414 8.20755 6.492 7.96218L5.2254 6.71601C4.976 6.47063 4.64015 6.33312 4.29028 6.33312Z',
+ '24': 'M20.4997 12.1386V9.15811L14.8463 3.53163H6.43717C5.57423 3.53163 4.87467 4.23119 4.87467 5.09413V9.78087M20.4447 9.13199L14.844 3.53125L14.844 7.56949C14.844 8.43243 15.5436 9.13199 16.4065 9.13199L20.4447 9.13199ZM7.12729 9.78087H4.83398C3.97104 9.78087 3.27148 10.4804 3.27148 11.3434V19.1559C3.27148 20.8818 4.67059 22.2809 6.39648 22.2809H18.8965C20.6224 22.2809 22.0215 20.8818 22.0215 19.1559V13.7011C22.0215 12.8381 21.3219 12.1386 20.459 12.1386H10.8032C10.3933 12.1386 9.99969 11.9774 9.70743 11.6899L8.22312 10.2296C7.93086 9.94202 7.53729 9.78087 7.12729 9.78087Z',
+ },
+ },
+ functions: {
+ name: PRODUCT_NAMES.FUNCTIONS,
+ icon: {
+ '16': 'M1.857 11.36a7 7 0 0 1 9.41-9.551M4.774 14.212a7 7 0 0 0 9.41-9.497m-8.812 7.845a2 2 0 1 1-4 0 2 2 0 0 1 4 0Zm9.296-9.13a2 2 0 1 1-4 0 2 2 0 0 1 4 0ZM12.5 8a4.5 4.5 0 1 1-9 0 4.5 4.5 0 0 1 9 0Z',
+ '18': 'M5.31216 16.101C6.41582 16.6754 7.67021 17 9.00043 17C13.419 17 17.0009 13.4183 17.0009 9C17.0009 7.66622 16.6744 6.40868 16.0971 5.30289M12.7352 1.92336C11.6203 1.33382 10.3494 1 9.00043 1C4.58192 1 1 4.58172 1 9C1 10.3615 1.34015 11.6436 1.94012 12.766M1.94012 12.766C1.61762 13.16 1.42413 13.6637 1.42413 14.2126C1.42413 15.475 2.44753 16.4983 3.70997 16.4983C4.9724 16.4983 5.99581 15.475 5.99581 14.2126C5.99581 12.9502 4.9724 11.9269 3.70997 11.9269C2.99646 11.9269 2.35931 12.2538 1.94012 12.766ZM16.6199 3.7793C16.6199 5.04166 15.5965 6.06501 14.3341 6.06501C13.0716 6.06501 12.0482 5.04166 12.0482 3.7793C12.0482 2.51693 13.0716 1.49358 14.3341 1.49358C15.5965 1.49358 16.6199 2.51693 16.6199 3.7793ZM14.1436 9C14.1436 11.8403 11.8409 14.1429 9.00043 14.1429C6.15996 14.1429 3.8573 11.8403 3.8573 9C3.8573 6.15968 6.15996 3.85714 9.00043 3.85714C11.8409 3.85714 14.1436 6.15968 14.1436 9Z',
+ '24': 'M6.6594 21.8201C8.10788 22.5739 9.75418 23 11.5 23C17.299 23 22 18.299 22 12.5C22 10.7494 21.5716 9.09889 20.8139 7.64754M16.4016 3.21191C14.9384 2.43814 13.2704 2 11.5 2C5.70101 2 1 6.70101 1 12.5C1 14.287 1.44643 15.9698 2.23384 17.4428M2.23384 17.4428C1.81058 17.96 1.55664 18.6211 1.55664 19.3416C1.55664 20.9984 2.89979 22.3416 4.55664 22.3416C6.21349 22.3416 7.55664 20.9984 7.55664 19.3416C7.55664 17.6847 6.21349 16.3416 4.55664 16.3416C3.62021 16.3416 2.78399 16.7706 2.23384 17.4428ZM21.5 5.64783C21.5 7.30468 20.1569 8.64783 18.5 8.64783C16.8432 8.64783 15.5 7.30468 15.5 5.64783C15.5 3.99097 16.8432 2.64783 18.5 2.64783C20.1569 2.64783 21.5 3.99097 21.5 5.64783ZM18.25 12.5C18.25 16.2279 15.2279 19.25 11.5 19.25C7.77208 19.25 4.75 16.2279 4.75 12.5C4.75 8.77208 7.77208 5.75 11.5 5.75C15.2279 5.75 18.25 8.77208 18.25 12.5Z',
+ },
+ },
+ realtime: {
+ name: PRODUCT_NAMES.REALTIME,
+ icon: {
+ '16': 'M5.362.984v2.35m-1.866.144L1.365 1.282m2.052 3.92H1.052m8.023 9.653L4.557 4.523 15 9.115l-4.748 1.182-1.177 4.558Z',
+ '18': 'M5.94415 1V3.85995M3.80348 3.85995L1.35903 1.34096M3.80348 5.83876H1M11.5534 11.6817L15.3703 10.7317C15.901 10.5996 15.9633 9.87023 15.4626 9.6501L6.36613 5.65053C5.8879 5.44026 5.40048 5.92671 5.60979 6.40536L9.53793 15.3879C9.75628 15.8872 10.4825 15.8291 10.6187 15.3015L11.5534 11.6817Z',
+ '24': 'M9.15928 1.94531V5.84117M6.24345 5.84117L2.91385 2.40977M6.24345 8.53673H2.4248M16.7998 16.496L21.9988 15.2019C22.7217 15.022 22.8065 14.0285 22.1246 13.7286L9.73411 8.28034C9.08269 7.99391 8.41873 8.65652 8.70383 9.30851L14.0544 21.5445C14.3518 22.2247 15.341 22.1456 15.5266 21.4269L16.7998 16.496Z',
+ },
+ },
+ vector: {
+ name: PRODUCT_NAMES.VECTOR,
+ icon: {
+ '16': 'M7.99886 7.63216V14.4892M7.99886 7.63216L14.0488 4.11804M7.99886 7.63216L1.94922 4.11819M1.94922 4.11819V8.32332M1.94922 4.11819V4.08217L5.57319 1.97717M14.049 8.36007V4.08217L10.4251 1.97717M11.8165 12.4072L7.99913 14.6245L4.18177 12.4072',
+ '18': 'M8.61033 8.15404V16.8287M8.61033 8.15404L16.264 3.70838M8.61033 8.15404L0.957031 3.70858M0.957031 3.70858V9.02842M0.957031 3.70858V3.66301L5.54166 1M16.2643 9.07491V3.66301L11.6797 1M13.44 14.1949L8.61068 17L3.7814 14.1949',
+ '24': 'M11.9983 11.4482V21.7337M11.9983 11.4482L21.0732 6.17699M11.9983 11.4482L2.92383 6.17723M2.92383 6.17723V12.4849M2.92383 6.17723V6.1232L8.35978 2.9657M21.0736 12.54V6.1232L15.6376 2.9657M17.7247 18.6107L11.9987 21.9367L6.27265 18.6107',
+ },
+ },
+}
diff --git a/spec/cli_v1_commands.yaml b/spec/cli_v1_commands.yaml
index 119059724e3..c53031c982c 100644
--- a/spec/cli_v1_commands.yaml
+++ b/spec/cli_v1_commands.yaml
@@ -1,7 +1,7 @@
clispec: '001'
info:
id: cli
- version: 1.75.3
+ version: 1.77.6
title: Supabase CLI
language: sh
source: https://github.com/supabase/cli
@@ -2101,14 +2101,23 @@ commands:
usage: supabase db diff [flags]
subcommands: []
flags:
+ - id: db-url
+ name: --db-url
+ description: |
+ Diffs local migration files against the database specified by the connection string (must be percent-encoded).
+ default_value: ''
- id: file
name: -f, --file
description: Saves schema diff to a new migration file.
default_value: ''
- id: linked
name: --linked
- description: Diffs local schema against the linked project.
+ description: Diffs local migration files against the linked project.
default_value: 'false'
+ - id: local
+ name: --local
+ description: Diffs local migration files against the local database.
+ default_value: 'true'
- id: schema
name: -s, --schema
description: List of schema to include.
@@ -2121,10 +2130,6 @@ commands:
name: --use-pgadmin
description: Use pgAdmin to generate schema diff.
default_value: 'false'
- - id: db-url
- name: --db-url
- description: connect using the specified database url
- default_value: ''
- id: supabase-completion
title: supabase completion
summary: Generate the autocompletion script for the specified shell
diff --git a/spec/supabase_dart_v1.yml b/spec/supabase_dart_v1.yml
index a79cf7c84b5..4e978f752b2 100644
--- a/spec/supabase_dart_v1.yml
+++ b/spec/supabase_dart_v1.yml
@@ -448,13 +448,13 @@ functions:
```
- id: select
description: |
- Performs vertical filtering with SELECT.
+ Perform a SELECT query on the table or view.
title: 'Fetch data: select()'
notes: |
- By default, Supabase projects will return a maximum of 1,000 rows. This setting can be changed in Project API Settings. It's recommended that you keep it low to limit the payload size of accidental or malicious requests. You can use `range()` queries to paginate through your data.
- - `select()` can be combined with [Modifiers](/docs/reference/dart/using-modifiers)
- `select()` can be combined with [Filters](/docs/reference/dart/using-filters)
- - If using the Supabase hosted platform `apikey` is technically a reserved keyword, since the API gateway will pluck it out for authentication. [It should be avoided as a column name](https://github.com/supabase/supabase/issues/5465).
+ - `select()` can be combined with [Modifiers](/docs/reference/dart/using-modifiers)
+ - `apikey` is a reserved keyword if you're using the [Supabase Platform](/docs/guides/platform) and [should be avoided as a column name](https://github.com/supabase/supabase/issues/5465).
examples:
- id: getting-your-data
name: Getting your data
@@ -568,7 +568,7 @@ functions:
- id: insert
description: |
- Performs an INSERT into the table.
+ Perform an INSERT into the table or view.
title: 'Create data: insert()'
examples:
- id: create-a-record
@@ -602,7 +602,7 @@ functions:
- id: update
description: |
- Performs an UPDATE on the table.
+ Perform an UPDATE on the table or view.
title: 'Modify data: update()'
notes: |
- `update()` should always be combined with [Filters](/docs/reference/dart/using-filters) to target the item(s) you wish to update.
@@ -651,11 +651,10 @@ functions:
- id: upsert
description: |
- Performs an UPSERT into the table.
+ Perform an UPSERT on the table or view. Depending on the column(s) passed to `onConflict`, `.upsert()` allows you to perform the equivalent of `.insert()` if a row with the corresponding `onConflict` columns doesn't exist, or if it does exist, perform an alternative action depending on `ignoreDuplicates`.
title: 'Upsert data: upsert()'
notes: |
- - Primary keys should be included in the data payload in order for an update to work correctly.
- - Primary keys must be natural, not surrogate. There are however, [workarounds](https://github.com/PostgREST/postgrest/issues/1118) for surrogate primary keys.
+ - Primary keys must be included in `values` to use upsert.
examples:
- id: upsert-your-data
name: Upsert your data
@@ -696,10 +695,11 @@ functions:
- id: delete
description: |
- Performs a DELETE on the table.
+ Perform a DELETE on the table or view.
title: 'Delete data: delete()'
notes: |
- `delete()` should always be combined with [Filters](/docs/reference/dart/using-filters) to target the item(s) you wish to delete.
+ - If you use `delete()` with filters and you have RLS enabled, only rows visible through `SELECT` policies are deleted. Note that by default no rows are visible, so you need at least one `SELECT`/`ALL` policy that makes the rows visible.
examples:
- id: delete-records
name: Delete records
diff --git a/studio/components/interfaces/BillingV2/Subscription/CostControl/SpendCapSidePanel.tsx b/studio/components/interfaces/BillingV2/Subscription/CostControl/SpendCapSidePanel.tsx
index 06c93eb02cb..f1437f84e29 100644
--- a/studio/components/interfaces/BillingV2/Subscription/CostControl/SpendCapSidePanel.tsx
+++ b/studio/components/interfaces/BillingV2/Subscription/CostControl/SpendCapSidePanel.tsx
@@ -80,6 +80,7 @@ const SpendCapSidePanel = () => {
title: 'Spend cap',
section: 'Cost Control',
},
+ projectRef,
},
router
)
@@ -231,6 +232,7 @@ const SpendCapSidePanel = () => {
section: 'Cost Control',
option: option.name,
},
+ projectRef,
},
router
)
diff --git a/studio/components/interfaces/BillingV2/Subscription/Tier/TierUpdateSidePanel.tsx b/studio/components/interfaces/BillingV2/Subscription/Tier/TierUpdateSidePanel.tsx
index d3050342aa2..07b826a5118 100644
--- a/studio/components/interfaces/BillingV2/Subscription/Tier/TierUpdateSidePanel.tsx
+++ b/studio/components/interfaces/BillingV2/Subscription/Tier/TierUpdateSidePanel.tsx
@@ -71,6 +71,7 @@ const TierUpdateSidePanel = () => {
title: 'Change Subscription Plan',
section: 'Subscription plan',
},
+ projectRef,
},
router
)
@@ -209,6 +210,7 @@ const TierUpdateSidePanel = () => {
: 'Upgrade' + ' to ' + plan.name,
section: 'Subscription plan',
},
+ projectRef,
},
router
)
diff --git a/studio/components/interfaces/BillingV2/Usage/Infrastructure.tsx b/studio/components/interfaces/BillingV2/Usage/Infrastructure.tsx
index b46e60bd771..e0b7f6f935e 100644
--- a/studio/components/interfaces/BillingV2/Usage/Infrastructure.tsx
+++ b/studio/components/interfaces/BillingV2/Usage/Infrastructure.tsx
@@ -85,6 +85,13 @@ const Infrastructure = ({
dateFormat,
})
+ const hasLatest = dayjs(endDate!).isAfter(dayjs().startOf('day'))
+
+ const latestIoBudgetConsumption =
+ hasLatest && ioBudgetData?.data?.slice(-1)
+ ? Number(ioBudgetData.data.slice(-1)[0].disk_io_consumption)
+ : 0
+
const highestIoBudgetConsumption = Math.max(
...(ioBudgetData?.data || []).map((x) => Number(x.disk_io_consumption) ?? 0),
0
@@ -118,10 +125,10 @@ const Infrastructure = ({
{attribute.key === 'disk_io_consumption' && (
<>
- {currentBillingCycleSelected && highestIoBudgetConsumption >= 100 ? (
-
+ {hasLatest && latestIoBudgetConsumption >= 100 ? (
+
- Your workload has used up all the burst IO throughput minutes and ran at the
+ Your workload has used up all your Disk IO Budget and is now running at the
baseline performance. If you need consistent disk performance, consider
upgrading to a larger compute add-on.
- Your workload is about to use up all the burst IO throughput minutes during
- the day. Once this is completely used up, your workload will run at the
- baseline performance. If you need consistent disk performance, consider
+ Your workload has consumed {latestIoBudgetConsumption}% of your Disk IO
+ Budget. If you use up all your Disk IO Budget, your instance will reverted
+ to baseline performance. If you need consistent disk performance, consider
upgrading to a larger compute add-on.
+ Your workload has used up all your Disk IO Budget and reverted to baseline
+ performance at least once during this billing cycle. If you need consistent
+ disk performance, consider upgrading to a larger compute add-on.
+
+ Your workload has consumed {highestIoBudgetConsumption}% of your Disk IO
+ budget during this billing cycle. If you use up all your Disk IO Budget,
+ your instance will reverted to baseline performance. If you need consistent
+ disk performance, consider upgrading to a larger compute add-on.
+
- This is heavy Work-In-Progress and not customer facing yet, use with caution!
- This organization will use the new org level billing, instead of having
- individual subscriptions per project. There are still a lot of open ends that
- may be restrictive for you, follow #team-billing for updates.
-
+ This organization will use the new organization level billing, which gives you a
+ single subscription for your entire organization, instead of having individual
+ subscriptions per project.{' '}
+
- This is heavy Work-In-Progress and not customer facing yet, use with
- caution! This organization uses the new org level billing, instead of having
- individual subscriptions per project.
-
+ This organization uses organization level billing and is on the{' '}
+ {orgSubscription?.plan?.name} plan.
+
+
+ {orgSubscription?.plan?.id !== 'free' && (
+
+ Your plan comes with $10 of Compute Credits. Launching another project
+ incurs additional compute costs - if you exhaust your Compute Credits, the
+ additional compute hours result in additional usage charges.
+