diff --git a/about/docs/careers/data-engineers.mdx b/about/docs/careers/data-engineers.mdx index f80603924f6..93930089f6c 100644 --- a/about/docs/careers/data-engineers.mdx +++ b/about/docs/careers/data-engineers.mdx @@ -16,8 +16,8 @@ import Process from '@site/docs/careers/snippets/process.mdx' - Be the business intelligence star player at Supabase by helping dig deep into the data we are generating. Deep knowledge of SQL and relevant tooling is a must. - Help customer success & sales team by working to identify and monitor: - Usage Insights - - Find and segment cohorts based around account level data, behaviour, traffic sources, and measure their subsequent behaviours - - Find and monitor product qualified leads based around account and behaviour characteristics + - Find and segment cohorts based around account level data, behavior, traffic sources, and measure their subsequent behaviours + - Find and monitor product qualified leads based around account and behavior characteristics - Customer health segmentation into actionable cohorts (e.g. healthy, churn, at risk) - Help identify opportunities high touch, low touch, & tech touch customer success & sales approaches - Help sales & customer success identify opportunity for unscheduled outreach diff --git a/about/vercel.json b/about/vercel.json deleted file mode 100644 index 646faa1b094..00000000000 --- a/about/vercel.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "rewrites": [ - { "source": "/", "destination": "https://www-internal.supabase.io/new" }, - { "source": "/beta", "destination": "https://www-internal.supabase.io/new/beta" } - ], - "trailingSlash": false -} diff --git a/examples/nextjs-auth-tailwind/components/Header/index.js b/examples/nextjs-auth-tailwind/components/Header/index.js index f1e85dd7bf1..6f14a825ba1 100644 --- a/examples/nextjs-auth-tailwind/components/Header/index.js +++ b/examples/nextjs-auth-tailwind/components/Header/index.js @@ -29,7 +29,7 @@ export default function Header() {
supabase
diff --git a/vercel-local.json b/vercel-local.json deleted file mode 100644 index 96e33eb9956..00000000000 --- a/vercel-local.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "headers": [ - { - "source": "/(.*)", - "headers": [ - { - "key": "Strict-Transport-Security", - "value": "" - } - ] - } - ], - "rewrites": [ - { "source": "/new/:match*", "destination": "http://localhost:3000/new/:match*" }, - { "source": "/", "destination": "http://localhost:3000/new" }, - { "source": "/beta", "destination": "http://localhost:3000/new/beta" }, - { "source": "/blog", "destination": "http://localhost:3000/new/blog" }, - { "source": "/database", "destination": "http://localhost:3000/new/database" }, - { "source": "/auth", "destination": "http://localhost:3000/new/auth" }, - { - "source": "/blog/:match*", - "destination": "http://localhost:3000/new/blog/:match*" - }, - { "source": "/rss", "destination": "http://localhost:3000/new/rss.xml" }, - { "source": "/:name.:extension", "destination": "http://localhost:3005/:name.:extension" }, - { - "source": "/:asset/:name.:extension", - "destination": "http://localhost:3005/:asset/:name.:extension" - }, - { "source": "/:match*", "destination": "http://localhost:3005/:match*/" } - ], - "redirects": [ - { - "source": "/blog/2020/07/10/surviving-hacker-news", - "destination": "/blog/2020/07/10/alpha-launch-postmortem" - }, - { - "source": "/docs/common/_CommonResponses", - "destination": "/docs" - }, - { "source": "/docs/common/_DummyData", "destination": "/docs" }, - { "source": "/docs/common/_FromFunction", "destination": "/docs" }, - { "source": "/docs/common/filters/_adj", "destination": "/docs/client/ajv" }, - { "source": "/docs/common/filters/_cd", "destination": "/docs/client/cd" }, - { "source": "/docs/common/filters/_cs", "destination": "/docs/client/cs" }, - { "source": "/docs/common/filters/_eq", "destination": "/docs/client/eq" }, - { "source": "/docs/common/filters/_filter", "destination": "/docs/client/filter" }, - { "source": "/docs/common/filters/_gt", "destination": "/docs/client/gt" }, - { "source": "/docs/common/filters/_gte", "destination": "/docs/client/gte" }, - { "source": "/docs/common/filters/_ilike", "destination": "/docs/client/ilike" }, - { "source": "/docs/common/filters/_in", "destination": "/docs/client/in" }, - { "source": "/docs/common/filters/_is", "destination": "/docs/client/is" }, - { "source": "/docs/common/filters/_like", "destination": "/docs/client/like" }, - { "source": "/docs/common/filters/_lt", "destination": "/docs/client/lt" }, - { "source": "/docs/common/filters/_lte", "destination": "/docs/client/lte" }, - { "source": "/docs/common/filters/_match", "destination": "/docs/client/match" }, - { "source": "/docs/common/filters/_neq", "destination": "/docs/client/neq" }, - { "source": "/docs/common/filters/_not", "destination": "/docs/client/not" }, - { "source": "/docs/common/filters/_nxl", "destination": "/docs/client/nxl" }, - { "source": "/docs/common/filters/_nxr", "destination": "/docs/client/nxr" }, - { "source": "/docs/common/filters/_or", "destination": "/docs/client/or" }, - { "source": "/docs/common/filters/_ova", "destination": "/docs/client/ov" }, - { "source": "/docs/common/filters/_ovr", "destination": "/docs/client/ov" }, - { "source": "/docs/common/filters/_sl", "destination": "/docs/client/sl" }, - { "source": "/docs/common/filters/_sr", "destination": "/docs/client/sr" }, - { "source": "/docs/library/authentication", "destination": "/docs/guides/auth" }, - { "source": "/docs/library/delete", "destination": "/docs/client/delete" }, - { "source": "/docs/library/get", "destination": "/docs/client/select" }, - { "source": "/docs/library/getting-started", "destination": "/docs/client/supabase-client" }, - { "source": "/docs/library/patch", "destination": "/docs/client/update" }, - { "source": "/docs/library/post", "destination": "/docs/client/insert" }, - { "source": "/docs/library/stored-procedures", "destination": "/docs/client/rpc" }, - { "source": "/docs/library/subscribe", "destination": "/docs/client/subscribe" }, - { "source": "/docs/library/user-management", "destination": "/docs/guides/auth" }, - { "source": "/docs/postgres/postgres-intro", "destination": "/docs/postgres/server/about" }, - { "source": "/docs/realtime/about", "destination": "/docs/realtime/server/about" }, - { "source": "/docs/realtime/aws", "destination": "/docs/postgres/server/aws" }, - { - "source": "/docs/realtime/digitalocean", - "destination": "/docs/postgres/server/digitalocean" - }, - { "source": "/docs/realtime/docker", "destination": "/docs/postgres/server/docker" }, - - { "source": "/docs/realtime/source", "destination": "/docs/postgres/server/about" } - ], - "trailingSlash": false -} diff --git a/vercel.json b/vercel.json deleted file mode 100644 index 179bba4a461..00000000000 --- a/vercel.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "headers": [ - { - "source": "/(.*)", - "headers": [ - { - "key": "Strict-Transport-Security", - "value": "" - }, - { - "key": "X-Robots-Tag", - "value": "all" - }, - { - "key": "X-Frame-Options", - "value": "DENY" - } - ] - } - ], - "rewrites": [ - { - "source": "/new/_next/image:match*", - "destination": "https://www-internal.supabase.io/_next/image:match*" - }, - { "source": "/new/:match*", "destination": "https://www-internal.supabase.io/new/:match*" }, - { "source": "/", "destination": "https://www-internal.supabase.io/new" }, - { "source": "/blog", "destination": "https://www-internal.supabase.io/new/blog" }, - { - "source": "/blog/:match*", - "destination": "https://www-internal.supabase.io/new/blog/:match*" - }, - { "source": "/rss", "destination": "https://www-internal.supabase.io/new/rss.xml" }, - { "source": "/rss.xml", "destination": "https://www-internal.supabase.io/new/rss.xml" }, - { "source": "/blog/rss.xml", "destination": "https://www-internal.supabase.io/new/rss.xml" }, - { "source": "/blog/rss", "destination": "https://www-internal.supabase.io/new/rss.xml" }, - { "source": "/beta", "destination": "https://www-internal.supabase.io/new/beta" }, - { "source": "/pricing", "destination": "https://www-internal.supabase.io/new/pricing" }, - { "source": "/database", "destination": "https://www-internal.supabase.io/new/database" }, - { "source": "/auth", "destination": "https://www-internal.supabase.io/new/auth" }, - { "source": "/storage", "destination": "https://www-internal.supabase.io/new/storage" }, - { "source": "/support", "destination": "https://www-internal.supabase.io/new/support" }, - { - "source": "/brand-assets", - "destination": "https://www-internal.supabase.io/new/brand-assets" - }, - { "source": "/:match*", "destination": "https://docs-rose.vercel.app/:match*" } - ], - "redirects": [ - { - "source": "/blog/2021/03/08/toad-a-link-shorterner-with-simple-apis-for-low-coders", - "destination": "/blog/2021/03/08/toad-a-link-shortener-with-simple-apis-for-low-coders" - }, - { - "source": "/blog/2020/07/10/surviving-hacker-news", - "destination": "/blog/2020/07/10/alpha-launch-postmortem" - }, - { - "source": "/docs/common/_CommonResponses", - "destination": "/docs" - }, - { "source": "/docs/common/_DummyData", "destination": "/docs" }, - { "source": "/docs/common/_FromFunction", "destination": "/docs" }, - { - "source": "/docs/common/filters/_adj", - "destination": "/docs/reference/javascript/rangeAdjacent" - }, - { - "source": "/docs/common/filters/_cd", - "destination": "/docs/reference/javascript/containedBy" - }, - { "source": "/docs/common/filters/_cs", "destination": "/docs/reference/javascript/contains" }, - { "source": "/docs/common/filters/_eq", "destination": "/docs/reference/javascript/eq" }, - { - "source": "/docs/common/filters/_filter", - "destination": "/docs/reference/javascript/filter" - }, - { "source": "/docs/common/filters/_gt", "destination": "/docs/reference/javascript/gt" }, - { "source": "/docs/common/filters/_gte", "destination": "/docs/reference/javascript/gte" }, - { "source": "/docs/common/filters/_ilike", "destination": "/docs/reference/javascript/ilike" }, - { "source": "/docs/common/filters/_in", "destination": "/docs/reference/javascript/in" }, - { "source": "/docs/common/filters/_is", "destination": "/docs/reference/javascript/is" }, - { "source": "/docs/common/filters/_like", "destination": "/docs/reference/javascript/like" }, - { "source": "/docs/common/filters/_lt", "destination": "/docs/reference/javascript/lt" }, - { "source": "/docs/common/filters/_lte", "destination": "/docs/reference/javascript/lte" }, - { "source": "/docs/common/filters/_match", "destination": "/docs/reference/javascript/match" }, - { "source": "/docs/common/filters/_neq", "destination": "/docs/reference/javascript/neq" }, - { "source": "/docs/common/filters/_not", "destination": "/docs/reference/javascript/not" }, - { "source": "/docs/common/filters/_nxl", "destination": "/docs/reference/javascript/rangeGte" }, - { "source": "/docs/common/filters/_nxr", "destination": "/docs/reference/javascript/rangeLte" }, - { "source": "/docs/common/filters/_or", "destination": "/docs/reference/javascript/or" }, - { "source": "/docs/common/filters/_ova", "destination": "/docs/reference/javascript/overlaps" }, - { "source": "/docs/common/filters/_ovr", "destination": "/docs/reference/javascript/overlaps" }, - { "source": "/docs/common/filters/_sl", "destination": "/docs/reference/javascript/rangeLt" }, - { "source": "/docs/common/filters/_sr", "destination": "/docs/reference/javascript/rangeGt" }, - { "source": "/docs/library/authentication", "destination": "/docs/guides/auth" }, - { "source": "/docs/library/delete", "destination": "/docs/reference/javascript/delete" }, - { "source": "/docs/library/get", "destination": "/docs/reference/javascript/select" }, - { - "source": "/docs/library/getting-started", - "destination": "/docs/reference/javascript/supabase-client" - }, - { "source": "/docs/library/patch", "destination": "/docs/reference/javascript/update" }, - { "source": "/docs/library/post", "destination": "/docs/reference/javascript/insert" }, - { - "source": "/docs/library/stored-procedures", - "destination": "/docs/reference/javascript/rpc" - }, - { "source": "/docs/library/subscribe", "destination": "/docs/reference/javascript/subscribe" }, - { "source": "/docs/library/user-management", "destination": "/docs/guides/auth" }, - { "source": "/docs/postgres/postgres-intro", "destination": "/docs/postgres/server/about" }, - { "source": "/docs/realtime/about", "destination": "/docs/realtime/server/about" }, - { "source": "/docs/realtime/aws", "destination": "/docs/postgres/server/aws" }, - { - "source": "/docs/realtime/digitalocean", - "destination": "/docs/postgres/server/digitalocean" - }, - { "source": "/docs/realtime/docker", "destination": "/docs/postgres/server/docker" }, - { "source": "/docs/realtime/source", "destination": "/docs/postgres/server/about" }, - { - "source": "/docs/client/supabase-client", - "destination": "/docs/reference/javascript/supabase-client" - }, - { "source": "/docs/client/installing", "destination": "/docs/reference/javascript/installing" }, - { - "source": "/docs/client/initializing", - "destination": "/docs/reference/javascript/initializing" - }, - { - "source": "/docs/client/generating-types", - "destination": "/docs/reference/javascript/generating-types" - }, - { - "source": "/docs/client/auth-signup", - "destination": "/docs/reference/javascript/auth-signup" - }, - { - "source": "/docs/client/auth-signin", - "destination": "/docs/reference/javascript/auth-signin" - }, - { - "source": "/docs/client/auth-signout", - "destination": "/docs/reference/javascript/auth-signout" - }, - { - "source": "/docs/client/auth-session", - "destination": "/docs/reference/javascript/auth-session" - }, - { "source": "/docs/client/auth-user", "destination": "/docs/reference/javascript/auth-user" }, - { - "source": "/docs/client/auth-update", - "destination": "/docs/reference/javascript/auth-update" - }, - { - "source": "/docs/client/auth-onauthstatechange", - "destination": "/docs/reference/javascript/auth-onauthstatechange" - }, - { - "source": "/docs/client/reset-password-email", - "destination": "/docs/reference/javascript/reset-password-email" - }, - { "source": "/docs/client/select", "destination": "/docs/reference/javascript/select" }, - { "source": "/docs/client/insert", "destination": "/docs/reference/javascript/insert" }, - { "source": "/docs/client/update", "destination": "/docs/reference/javascript/update" }, - { "source": "/docs/client/delete", "destination": "/docs/reference/javascript/delete" }, - { "source": "/docs/client/rpc", "destination": "/docs/reference/javascript/rpc" }, - { "source": "/docs/client/subscribe", "destination": "/docs/reference/javascript/subscribe" }, - { - "source": "/docs/client/removesubscription", - "destination": "/docs/reference/javascript/removesubscription" - }, - { - "source": "/docs/client/getsubscriptions", - "destination": "/docs/reference/javascript/getsubscriptions" - }, - { - "source": "/docs/client/using-modifiers", - "destination": "/docs/reference/javascript/using-modifiers" - }, - { "source": "/docs/client/limit", "destination": "/docs/reference/javascript/limit" }, - { "source": "/docs/client/order", "destination": "/docs/reference/javascript/order" }, - { "source": "/docs/client/range", "destination": "/docs/reference/javascript/range" }, - { "source": "/docs/client/single", "destination": "/docs/reference/javascript/single" }, - { - "source": "/docs/client/using-filters", - "destination": "/docs/reference/javascript/using-filters" - }, - { "source": "/docs/client/filter", "destination": "/docs/reference/javascript/filter" }, - { "source": "/docs/client/or", "destination": "/docs/reference/javascript/or" }, - { "source": "/docs/client/not", "destination": "/docs/reference/javascript/not" }, - { "source": "/docs/client/match", "destination": "/docs/reference/javascript/match" }, - { "source": "/docs/client/eq", "destination": "/docs/reference/javascript/eq" }, - { "source": "/docs/client/neq", "destination": "/docs/reference/javascript/neq" }, - { "source": "/docs/client/gt", "destination": "/docs/reference/javascript/gt" }, - { "source": "/docs/client/gte", "destination": "/docs/reference/javascript/gte" }, - { "source": "/docs/client/lt", "destination": "/docs/reference/javascript/lt" }, - { "source": "/docs/client/lte", "destination": "/docs/reference/javascript/lte" }, - { "source": "/docs/client/like", "destination": "/docs/reference/javascript/like" }, - { "source": "/docs/client/ilike", "destination": "/docs/reference/javascript/ilike" }, - { "source": "/docs/client/is", "destination": "/docs/reference/javascript/is" }, - { "source": "/docs/client/in", "destination": "/docs/reference/javascript/in" }, - { "source": "/docs/client/gte", "destination": "/docs/reference/javascript/gte" }, - { "source": "/docs/client/cs", "destination": "/docs/reference/javascript/contains" }, - { "source": "/docs/client/cd", "destination": "/docs/reference/javascript/containedBy" }, - { "source": "/docs/client/sl", "destination": "/docs/reference/javascript/rangeLt" }, - { "source": "/docs/client/sr", "destination": "/docs/reference/javascript/rangeGt" }, - { "source": "/docs/client/nxl", "destination": "/docs/reference/javascript/rangeGte" }, - { "source": "/docs/client/nxr", "destination": "/docs/reference/javascript/rangeLte" }, - { "source": "/docs/client/adj", "destination": "/docs/reference/javascript/rangeAdjacent" }, - { "source": "/docs/client/ov", "destination": "/docs/reference/javascript/overlaps" }, - { "source": "/docs/client/ova", "destination": "/docs/reference/javascript/overlaps" }, - { "source": "/docs/client/fts", "destination": "/docs/reference/javascript/textSearch" }, - { "source": "/docs/client/plfts", "destination": "/docs/reference/javascript/textSearch" }, - { "source": "/docs/client/phfts", "destination": "/docs/reference/javascript/textSearch" }, - { "source": "/docs/client/wfts", "destination": "/docs/reference/javascript/textSearch" }, - { "source": "/blog/page/:number", "destination": "/blog" }, - { "source": "/blog/tags", "destination": "/blog" }, - { "source": "/docs/pricing", "destination": "/pricing" }, - - { "source": "/docs/careers", "destination": "https://about.supabase.com/careers" }, - { "source": "/docs/careers/:match*", "destination": "https://about.supabase.com/careers//:match*" }, - - { "source": "/docs/resources", "destination": "/docs/guides" }, - - { "source": "/docs/reference/postgres/getting-started", "destination": "/docs/guides/database/introduction" }, - { "source": "/reference/postgres/connection-strings", "destination": "/docs/guides/database/connecting/connecting-to-postgres" }, - { "source": "/docs/reference/postgres/schemas", "destination": "/docs/guides/database/tables" }, - { "source": "/docs/reference/postgres/tables", "destination": "/docs/guides/database/tables" }, - { "source": "/docs/guides/database/resource-management", "destination": "/docs/guides/database/timeouts" }, - { "source": "/docs/reference/postgres/database-passwords", "destination": "/docs/guides/database/managing-passwords" }, - { "source": "/docs/reference/postgres/changing-timezones", "destination": "/docs/guides/database/managing-timezones" }, - { "source": "/docs/reference/postgres/publications", "destination": "/docs/guides/database/replication" }, - - { "source": "/docs/guides/platform", "destination": "/docs/guides/hosting/platform" }, - { "source": "/docs/guides/self-hosting", "destination": "/docs/guides/hosting/overview" } - - - ], - "trailingSlash": false -} diff --git a/web/docs/about.mdx b/web/docs/about.mdx index 593a71598a1..8f6ed1c6df2 100755 --- a/web/docs/about.mdx +++ b/web/docs/about.mdx @@ -6,6 +6,7 @@ slug: / hide_table_of_contents: true --- +import useBaseUrl from '@docusaurus/useBaseUrl' import Link from '@docusaurus/Link' import Tabs from '@theme/Tabs' import TabItem from '@theme/TabItem' @@ -90,7 +91,12 @@ Supabase is just Postgres, which makes it compatible with a large number of tool
{x.logo && ( - {x.name} + {x.name} )}

{x.name}

diff --git a/web/docs/company/privacy.md b/web/docs/company/privacy.md index 8768b645610..308381bef3b 100644 --- a/web/docs/company/privacy.md +++ b/web/docs/company/privacy.md @@ -164,15 +164,15 @@ The criteria used to determine the period for which personal information about y 4. **Legal Obligation.** Where we are processing personal information based on a legal obligation, we generally will retain the information for the period of time necessary to fulfill the legal obligation. 5. **Legal Claim.** We may need to apply a "legal hold" that retains information beyond our typical retention period where we face threat of legal claim.  In that case, we will retain the information until the hold is removed, which typically means the claim or threat of claim has been resolved. -In all cases, in addition to the purposes and legal bases, we consider the amount, nature and sensitivity of the personal information, as well as the potential risk of harm from unauthorised use or disclosure of your personal information. +In all cases, in addition to the purposes and legal bases, we consider the amount, nature and sensitivity of the personal information, as well as the potential risk of harm from unauthorized use or disclosure of your personal information. ### 4. Recipients of Personal Information In addition to the recipients listed in Annexes 1 and 2, we may also share your personal information with the following (as required in accordance with the uses set out in Annexes 1 and 2): 1. **Service providers and advisors**: we may share your personal information with third party vendors and other service providers that perform services for us or on our behalf, which may include providing professional services, such as legal and accounting services, mailing, email or chat services, fraud prevention, web hosting, or providing analytic services. -2. **Affiliates**. Other companies owned by or under common ownership as Supabase, including our subsidiaries (i.e., any organisation we own or control) and our ultimate holding company (i.e., any organisation that owns or controls us) and any subsidiaries it owns. These companies will use your personal information in the same way as we can under these Privacy Disclosures. -3. **Purchasers and third parties in connection with a business transaction**: your personal information may be disclosed to third parties in connection with a transaction, such as a merger, sale of assets or shares, reorganisation, financing, change of control or acquisition of all or a portion of our business. +2. **Affiliates**. Other companies owned by or under common ownership as Supabase, including our subsidiaries (i.e., any organization we own or control) and our ultimate holding company (i.e., any organization that owns or controls us) and any subsidiaries it owns. These companies will use your personal information in the same way as we can under these Privacy Disclosures. +3. **Purchasers and third parties in connection with a business transaction**: your personal information may be disclosed to third parties in connection with a transaction, such as a merger, sale of assets or shares, reorganization, financing, change of control or acquisition of all or a portion of our business. 4. **Law enforcement, regulators and other parties for legal reasons**: we may share your personal information with third parties as required by law or if we reasonably believe that such action is necessary to (i) comply with the law and the reasonable requests of law enforcement; (ii) detect and investigate illegal activities and breaches of agreements, including our Terms; and/or (iii) exercise or protect the rights, property, or personal safety of Supabase, its users or others. ### 5. Marketing and Advertising @@ -183,11 +183,11 @@ We will only send you marketing messages if you have given us your consent to do ### 6. Storing and transferring your personal information -**Security**. We implement appropriate technical and organisational measures to protect your personal information against accidental or unlawful destruction, loss, change or damage. All personal information we collect will be stored by our cloud hosting provider on secure servers. We will never send you unsolicited emails or contact you by phone requesting credit or debit card information or national identification numbers. +**Security**. We implement appropriate technical and organizational measures to protect your personal information against accidental or unlawful destruction, loss, change or damage. All personal information we collect will be stored by our cloud hosting provider on secure servers. We will never send you unsolicited emails or contact you by phone requesting credit or debit card information or national identification numbers. **International Transfers of your Personal Information**. The personal information we collect may be transferred to and stored in countries outside of the jurisdiction you are in where we and our third party service providers have operations. If you are located in the EEA, United Kingdom or Switzerland, your personal information may be processed outside of those regions, including in the United States. -In the event of such a transfer, we ensure that: (i) the personal information is transferred to countries recognised as offering an equivalent level of protection; or (ii) the transfer is made pursuant to appropriate safeguards, such as standard data protection clauses adopted by the European Commission. +In the event of such a transfer, we ensure that: (i) the personal information is transferred to countries recognized as offering an equivalent level of protection; or (ii) the transfer is made pursuant to appropriate safeguards, such as standard data protection clauses adopted by the European Commission. If you wish to enquire further about these safeguards used, please contact us using the details set out at the end of these Privacy Disclosures. @@ -222,7 +222,7 @@ Due to the confidential nature of data processing we may ask you to provide proo Our European Services uses cookies and similar technologies such as pixels and Local Storage Objects (LSOs) like HTML5 (together "**_cookies_**") to distinguish you from other users of our European Services. This helps us to provide you with a good experience when you browse our European Services and also allows us to monitor and analyse how you use and interact with our European Services so that we can continue to improve our European Services. -Cookies are pieces of code that allow for personalisation of our European Services experience by saving your information such as user ID and other preferences. A cookie is a small data file that we transfer to your computer's hard disk for record-keeping purposes. +Cookies are pieces of code that allow for personalization of our European Services experience by saving your information such as user ID and other preferences. A cookie is a small data file that we transfer to your computer's hard disk for record-keeping purposes. We use the following types of cookies: diff --git a/web/docs/going-into-prod.mdx b/web/docs/going-into-prod.mdx index 9ee933d0012..74533325aba 100644 --- a/web/docs/going-into-prod.mdx +++ b/web/docs/going-into-prod.mdx @@ -1,7 +1,7 @@ --- id: going-into-prod title: Going into Prod Checklist -description: 'Things to do before making your app publicaly available' +description: 'Things to do before making your app publicly available' --- After developing your project, and deciding it's time to Go Live With Real Users, you should run through this checklist to ensure that your project is: diff --git a/web/docs/guides.md b/web/docs/guides.md index dbcbc80404c..07cb02a102e 100644 --- a/web/docs/guides.md +++ b/web/docs/guides.md @@ -15,8 +15,7 @@ These guides help you unleash the power of PostgreSQL, the world's most advanced Authenticating users isn't the most exciting job for most developers, so Supabase makes it quick and simple, while maintaining security and performance. - - A Redwood application is split into two parts: a frontend and a backend. This is represented as two node projects within a single monorepo. -The frontend project is called **web** and the backend project is called **api**. For clarity, we will refer to these in prose as **"sides"**, i.e. the "web side" and the "api side". -They are separate projects because code on the web side will end up running in the user's browser while code on the api side will run on a server somewhere. +The frontend project is called **`web`** and the backend project is called **`api`**. For clarity, we will refer to these in prose as **"sides"**, i.e. the "web side" and the "api side". +They are separate projects because code on the `web side` will end up running in the user's browser while code on the `api side` will run on a server somewhere. :::note -Important: When this guide refers to "API", that means the Supabase API and when it refers to "api side", that means the RedwoodJS api side. +Important: When this guide refers to "API", that means the Supabase API and when it refers to "api side", that means the RedwoodJS `api side`. ::: -The **api side** is an implementation of a GraphQL API. The business logic is organized into "services" that represent their own internal API and can be called both from external GraphQL requests and other internal services. +The **`api side`** is an implementation of a GraphQL API. The business logic is organized into "services" that represent their own internal API and can be called both from external GraphQL requests and other internal services. -The **web side** is built with React. Redwood's router makes it simple to map URL paths to React "Page" components (and automatically code-split your app on each route). +The **`web side`** is built with React. Redwood's router makes it simple to map URL paths to React "Page" components (and automatically code-split your app on each route). Pages may contain a "Layout" component to wrap content. They also contain "Cells" and regular React components. Cells allow you to declaratively manage the lifecycle of a component that fetches and displays data. :::note -FYI: For the sake of consistency with the other framework Quickstart examples, we'll build a RedwoodJS a little differently than normal. +For the sake of consistency with the other framework Quickstart examples, we'll build a RedwoodJS a little differently than normal. We **_won't use_** use Prisma to connect to the Supabase Postgres database or [Prisma migrations](https://redwoodjs.com/docs/cli-commands#prisma-migrate) as one typically might in a Redwood app. -Instead, we'll rely on the Supabase client to do some of the work on the **web** side and use the client again on the **api** side to do data fetching as well. +Instead, we'll rely on the Supabase client to do some of the work on the **`web`** side and use the client again on the **`api`** side to do data fetching as well. ::: ## Project set up @@ -79,7 +90,7 @@ Before we start building we're going to set up our Database and API. This is as and then creating a "schema" inside the database. :::note -Note: When setting up Supabase, you'll interact with your project dashboard. However, most of the RedwoodJS setup steps will interact with the [Redwood CLI](https://redwoodjs.com/docs/cli-commands) to generate routes, pages, components and more. +When setting up Supabase, you'll interact with your project dashboard. However, most of the RedwoodJS setup steps will interact with the [Redwood CLI](https://redwoodjs.com/docs/cli-commands) to generate routes, pages, components and more. So be sure to have a terminal at the ready and in your project directory. ::: @@ -110,7 +121,7 @@ values={[ ``` @@ -168,6 +179,12 @@ create policy "Anyone can upload an avatar." +#### Important Note about Prisma and Migrations + +:::note +Because this Quick Start does not use Prisma to manage the database schema, seed it, or run mgrations, you **need** to take extra care when running some of the typical Redwood CLI commands. +::: + ### Get the API Keys Now that you've created some database tables, you are ready to insert data using the auto-generated API. @@ -188,7 +205,7 @@ values={[ ``` @@ -199,7 +216,7 @@ values={[ Let's start building the RedwoodJS app from scratch. :::note -**Note:** RedwoodJS requires Node.js (=14.x) and Yarn (>=1.15). +RedwoodJS requires Node.js (>=14.x <=16.x) and Yarn (>=1.15). ::: Make sure you have installed yarn since RedwoodJS relies on it to [manage its packages in workspaces](https://classic.yarnpkg.com/lang/en/docs/workspaces/) for its `web` and `api` "sides". @@ -236,7 +253,6 @@ yarn redwood setup auth supabase When prompted: -:::note Overwrite existing /api/src/lib/auth.[jt]s? ::: @@ -264,7 +280,7 @@ SUPABASE_KEY=YOUR_SUPABASE_ANON_KEY SUPABASE_JWT_SECRET=YOUR_SUPABASE_JWT_SECRET ``` -And finally, you will also need to save **just** the web side environment variables to the `redwood.toml`. +And finally, you will also need to save **just** the `web side` environment variables to the `redwood.toml`. ```bash title="redwood.toml" [web] diff --git a/web/docs/guides/with-svelte.mdx b/web/docs/guides/with-svelte.mdx index f74686ff9c0..528a60e0d67 100644 --- a/web/docs/guides/with-svelte.mdx +++ b/web/docs/guides/with-svelte.mdx @@ -53,11 +53,11 @@ values={[ ```sh 1. Go to the "SQL" section. 2. Click "User Management Starter". -4. Click "Run". +3. Click "Run". ``` @@ -137,7 +137,7 @@ values={[ ``` diff --git a/web/docs/guides/with-vue-3.mdx b/web/docs/guides/with-vue-3.mdx index 231f7b6c642..1674c8d0fe1 100644 --- a/web/docs/guides/with-vue-3.mdx +++ b/web/docs/guides/with-vue-3.mdx @@ -53,11 +53,11 @@ values={[ ```sh 1. Go to the "SQL" section. 2. Click "User Management Starter". -4. Click "Run". +3. Click "Run". ``` @@ -137,7 +137,7 @@ values={[ ``` diff --git a/web/docusaurus.config.js b/web/docusaurus.config.js index 20ddd145884..b359a21afa0 100755 --- a/web/docusaurus.config.js +++ b/web/docusaurus.config.js @@ -8,10 +8,11 @@ module.exports = { title: 'Supabase', tagline: 'The open source Firebase alternative.', url: 'https://supabase.io', - baseUrl: '/', + baseUrl: '/docs/', favicon: '/favicon.ico', organizationName: 'supabase', // Usually your GitHub org/user name. - projectName: 'supabase', // Usually your repo name. + projectName: 'Supabase Docs', // Usually your repo name. + onBrokenLinks: 'ignore', themeConfig: { colorMode: { // "light" | "dark" @@ -56,8 +57,9 @@ module.exports = { items: [ { label: 'Overview', - to: '/docs', - activeBaseRegex: '(^/docs$)|(/docs/faq)|(^/docs/guides/examples)', + to: '/', + activeBaseRegex: + '.*.docs/$|^/docs/architecture|(^/docs/guides/(database|auth|storage|api|examples!))|(^/docs/guides/(examples|with-angular|with-flutter|with-nextjs|with-react|with-redwoodjs|with-svelte|with-vue-3)|^/docs/faq|^/docs/going-into-prod|^/docs/handbook|^/docs/company)', position: 'left', }, { @@ -160,10 +162,10 @@ module.exports = { label: 'RSS', href: 'https://supabase.io/rss.xml', }, - // { - // label: "Discord", - // href: "https://discordapp.com/invite/docusaurus" - // } + { + label: 'Discord', + href: 'https://discord.supabase.com', + }, ], }, { @@ -184,7 +186,7 @@ module.exports = { '@docusaurus/preset-classic', { docs: { - // sidebarCollapsible: true, + routeBasePath: '/', sidebarPath: require.resolve('./sidebars.js'), editUrl: 'https://github.com/supabase/supabase/edit/master/web', }, diff --git a/web/sidebars.js b/web/sidebars.js index 925ce56c7bb..bdeaad781d4 100755 --- a/web/sidebars.js +++ b/web/sidebars.js @@ -94,6 +94,7 @@ module.exports = { items: [ 'guides/database/introduction', 'guides/database/tables', + 'guides/database/functions', 'guides/database/full-text-search', // 'guides/database/json', // 'guides/database/arrays', diff --git a/web/spec/combined.json b/web/spec/combined.json index 0eab563f5ae..358c02d9c86 100644 --- a/web/spec/combined.json +++ b/web/spec/combined.json @@ -2142,7 +2142,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -2357,7 +2357,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -2489,7 +2489,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -2758,7 +2758,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -3037,6 +3037,14 @@ { "type": "stringLiteral", "value": "twitch" + }, + { + "type": "stringLiteral", + "value": "spotify" + }, + { + "type": "stringLiteral", + "value": "slack" } ] } @@ -3264,7 +3272,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -3484,7 +3492,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -3868,7 +3876,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -4078,7 +4086,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -4462,7 +4470,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -16352,6 +16360,14 @@ { "type": "stringLiteral", "value": "twitch" + }, + { + "type": "stringLiteral", + "value": "spotify" + }, + { + "type": "stringLiteral", + "value": "slack" } ] } @@ -20660,7 +20676,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 100, + "line": 102, "character": 8 } ], @@ -20690,7 +20706,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 98, + "line": 100, "character": 10 } ], @@ -20720,7 +20736,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 96, + "line": 98, "character": 6 } ], @@ -20750,7 +20766,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 101, + "line": 103, "character": 6 } ], @@ -20780,7 +20796,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 103, + "line": 105, "character": 10 } ], @@ -20815,7 +20831,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 94, + "line": 96, "character": 30 } ] @@ -20840,7 +20856,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 22, + "line": 24, "character": 14 } ], @@ -20864,7 +20880,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 30, + "line": 32, "character": 12 } ], @@ -20897,7 +20913,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 26, + "line": 28, "character": 12 } ], @@ -20927,7 +20943,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 21, + "line": 23, "character": 16 } ], @@ -20957,7 +20973,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 31, + "line": 33, "character": 15 } ], @@ -20986,7 +21002,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 32, + "line": 34, "character": 12 } ], @@ -21006,7 +21022,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 33, + "line": 35, "character": 6 } ], @@ -21044,7 +21060,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 20, + "line": 22, "character": 24 } ] @@ -21072,7 +21088,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 87, + "line": 89, "character": 10 } ], @@ -21143,7 +21159,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 87, + "line": 89, "character": 11 } ] @@ -21164,7 +21180,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 83, + "line": 85, "character": 4 } ], @@ -21187,7 +21203,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 91, + "line": 93, "character": 13 } ], @@ -21219,7 +21235,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 91, + "line": 93, "character": 14 } ] @@ -21241,7 +21257,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 79, + "line": 81, "character": 29 } ] @@ -21267,7 +21283,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 47, + "line": 49, "character": 13 } ], @@ -21296,7 +21312,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 37, + "line": 39, "character": 14 } ], @@ -21353,7 +21369,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 38, + "line": 40, "character": 12 } ], @@ -21384,7 +21400,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 37, + "line": 39, "character": 15 } ] @@ -21402,7 +21418,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 44, + "line": 46, "character": 5 } ], @@ -21423,7 +21439,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 45, + "line": 47, "character": 22 } ], @@ -21453,7 +21469,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 51, + "line": 53, "character": 14 } ], @@ -21482,7 +21498,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 50, + "line": 52, "character": 12 } ], @@ -21503,7 +21519,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 48, + "line": 50, "character": 7 } ], @@ -21533,7 +21549,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 52, + "line": 54, "character": 20 } ], @@ -21562,7 +21578,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 36, + "line": 38, "character": 4 } ], @@ -21583,7 +21599,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 54, + "line": 56, "character": 17 } ], @@ -21613,7 +21629,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 49, + "line": 51, "character": 7 } ], @@ -21643,7 +21659,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 53, + "line": 55, "character": 20 } ], @@ -21673,7 +21689,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 46, + "line": 48, "character": 18 } ], @@ -21703,7 +21719,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 55, + "line": 57, "character": 6 } ], @@ -21733,7 +21749,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 56, + "line": 58, "character": 12 } ], @@ -21762,7 +21778,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 41, + "line": 43, "character": 15 } ], @@ -21809,7 +21825,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 41, + "line": 43, "character": 16 } ] @@ -21844,7 +21860,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 35, + "line": 37, "character": 21 } ] @@ -21873,7 +21889,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 76, + "line": 78, "character": 6 } ], @@ -21906,7 +21922,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 63, + "line": 65, "character": 7 } ], @@ -21939,7 +21955,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 71, + "line": 73, "character": 20 } ], @@ -21972,7 +21988,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 67, + "line": 69, "character": 10 } ], @@ -22006,7 +22022,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 59, + "line": 61, "character": 31 } ] @@ -22032,7 +22048,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 107, + "line": 109, "character": 7 } ], @@ -22062,7 +22078,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 109, + "line": 111, "character": 10 } ], @@ -22092,7 +22108,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 108, + "line": 110, "character": 7 } ], @@ -22122,7 +22138,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 112, + "line": 114, "character": 10 } ], @@ -22144,7 +22160,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 110, + "line": 112, "character": 14 } ], @@ -22179,7 +22195,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 106, + "line": 108, "character": 32 } ] @@ -22204,7 +22220,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 116, + "line": 118, "character": 7 } ], @@ -22224,7 +22240,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 117, + "line": 119, "character": 7 } ], @@ -22247,7 +22263,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 115, + "line": 117, "character": 32 } ] @@ -22263,7 +22279,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 13, + "line": 15, "character": 27 } ], @@ -22350,6 +22366,14 @@ { "type": "stringLiteral", "value": "twitch" + }, + { + "type": "stringLiteral", + "value": "spotify" + }, + { + "type": "stringLiteral", + "value": "slack" } ] } diff --git a/web/spec/dart.yml b/web/spec/dart.yml index 3cf061573f0..7e57a8fe768 100644 --- a/web/spec/dart.yml +++ b/web/spec/dart.yml @@ -637,7 +637,7 @@ pages: subscribe(): description: | - Subscribe to realtime changes in your databse. + Subscribe to realtime changes in your database. title: 'on().subscribe()' notes: | - Realtime is disabled by default for new Projects for better database performance and security. You can turn it on by [managing replication](/docs/guides/api#managing-realtime). diff --git a/web/spec/gotrue.json b/web/spec/gotrue.json index afe546f9493..701dc3f067d 100644 --- a/web/spec/gotrue.json +++ b/web/spec/gotrue.json @@ -7257,6 +7257,14 @@ { "type": "stringLiteral", "value": "twitch" + }, + { + "type": "stringLiteral", + "value": "spotify" + }, + { + "type": "stringLiteral", + "value": "slack" } ] } @@ -11565,7 +11573,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 100, + "line": 102, "character": 8 } ], @@ -11595,7 +11603,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 98, + "line": 100, "character": 10 } ], @@ -11625,7 +11633,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 96, + "line": 98, "character": 6 } ], @@ -11655,7 +11663,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 101, + "line": 103, "character": 6 } ], @@ -11685,7 +11693,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 103, + "line": 105, "character": 10 } ], @@ -11720,7 +11728,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 94, + "line": 96, "character": 30 } ] @@ -11745,7 +11753,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 22, + "line": 24, "character": 14 } ], @@ -11769,7 +11777,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 30, + "line": 32, "character": 12 } ], @@ -11802,7 +11810,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 26, + "line": 28, "character": 12 } ], @@ -11832,7 +11840,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 21, + "line": 23, "character": 16 } ], @@ -11862,7 +11870,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 31, + "line": 33, "character": 15 } ], @@ -11891,7 +11899,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 32, + "line": 34, "character": 12 } ], @@ -11911,7 +11919,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 33, + "line": 35, "character": 6 } ], @@ -11949,7 +11957,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 20, + "line": 22, "character": 24 } ] @@ -11977,7 +11985,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 87, + "line": 89, "character": 10 } ], @@ -12048,7 +12056,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 87, + "line": 89, "character": 11 } ] @@ -12069,7 +12077,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 83, + "line": 85, "character": 4 } ], @@ -12092,7 +12100,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 91, + "line": 93, "character": 13 } ], @@ -12124,7 +12132,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 91, + "line": 93, "character": 14 } ] @@ -12146,7 +12154,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 79, + "line": 81, "character": 29 } ] @@ -12172,7 +12180,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 47, + "line": 49, "character": 13 } ], @@ -12201,7 +12209,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 37, + "line": 39, "character": 14 } ], @@ -12258,7 +12266,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 38, + "line": 40, "character": 12 } ], @@ -12289,7 +12297,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 37, + "line": 39, "character": 15 } ] @@ -12307,7 +12315,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 44, + "line": 46, "character": 5 } ], @@ -12328,7 +12336,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 45, + "line": 47, "character": 22 } ], @@ -12358,7 +12366,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 51, + "line": 53, "character": 14 } ], @@ -12387,7 +12395,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 50, + "line": 52, "character": 12 } ], @@ -12408,7 +12416,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 48, + "line": 50, "character": 7 } ], @@ -12438,7 +12446,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 52, + "line": 54, "character": 20 } ], @@ -12467,7 +12475,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 36, + "line": 38, "character": 4 } ], @@ -12488,7 +12496,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 54, + "line": 56, "character": 17 } ], @@ -12518,7 +12526,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 49, + "line": 51, "character": 7 } ], @@ -12548,7 +12556,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 53, + "line": 55, "character": 20 } ], @@ -12578,7 +12586,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 46, + "line": 48, "character": 18 } ], @@ -12608,7 +12616,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 55, + "line": 57, "character": 6 } ], @@ -12638,7 +12646,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 56, + "line": 58, "character": 12 } ], @@ -12667,7 +12675,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 41, + "line": 43, "character": 15 } ], @@ -12714,7 +12722,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 41, + "line": 43, "character": 16 } ] @@ -12749,7 +12757,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 35, + "line": 37, "character": 21 } ] @@ -12778,7 +12786,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 76, + "line": 78, "character": 6 } ], @@ -12811,7 +12819,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 63, + "line": 65, "character": 7 } ], @@ -12844,7 +12852,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 71, + "line": 73, "character": 20 } ], @@ -12877,7 +12885,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 67, + "line": 69, "character": 10 } ], @@ -12911,7 +12919,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 59, + "line": 61, "character": 31 } ] @@ -12937,7 +12945,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 107, + "line": 109, "character": 7 } ], @@ -12967,7 +12975,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 109, + "line": 111, "character": 10 } ], @@ -12997,7 +13005,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 108, + "line": 110, "character": 7 } ], @@ -13027,7 +13035,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 112, + "line": 114, "character": 10 } ], @@ -13049,7 +13057,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 110, + "line": 112, "character": 14 } ], @@ -13084,7 +13092,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 106, + "line": 108, "character": 32 } ] @@ -13109,7 +13117,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 116, + "line": 118, "character": 7 } ], @@ -13129,7 +13137,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 117, + "line": 119, "character": 7 } ], @@ -13152,7 +13160,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 115, + "line": 117, "character": 32 } ] @@ -13168,7 +13176,7 @@ "sources": [ { "fileName": "lib/types.ts", - "line": 13, + "line": 15, "character": 27 } ], @@ -13255,6 +13263,14 @@ { "type": "stringLiteral", "value": "twitch" + }, + { + "type": "stringLiteral", + "value": "spotify" + }, + { + "type": "stringLiteral", + "value": "slack" } ] } diff --git a/web/spec/supabase.json b/web/spec/supabase.json index 565be61b750..fc69b64f7bc 100644 --- a/web/spec/supabase.json +++ b/web/spec/supabase.json @@ -2139,7 +2139,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -2354,7 +2354,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -2486,7 +2486,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -2755,7 +2755,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -3034,6 +3034,14 @@ { "type": "stringLiteral", "value": "twitch" + }, + { + "type": "stringLiteral", + "value": "spotify" + }, + { + "type": "stringLiteral", + "value": "slack" } ] } @@ -3261,7 +3269,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -3481,7 +3489,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -3865,7 +3873,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -4075,7 +4083,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", @@ -4459,7 +4467,7 @@ "types": [ { "type": "reference", - "name": "Error" + "name": "ApiError" }, { "type": "intrinsic", diff --git a/web/spec/supabase.yml b/web/spec/supabase.yml index dc1d8deee81..2e996ce3b98 100644 --- a/web/spec/supabase.yml +++ b/web/spec/supabase.yml @@ -150,17 +150,35 @@ pages: import { createClient } from '@supabase/supabase-js' // Create a single supabase client for interacting with your database - const supabase = createClient("https://xyzcompany.supabase.co", "public-anon-key") + const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key') ``` - name: With additional parameters js: | ```js import { createClient } from '@supabase/supabase-js' - const options = { } + const options = { + schema: 'public', + headers: { 'x-my-custom-header': 'my-app-name' }, + autoRefreshToken: true, + persistSession: true, + detectSessionInUrl: true + } const supabase = createClient("https://xyzcompany.supabase.co", "public-anon-key", options) ``` + - name: API schemas + js: | + ```js + import { createClient } from '@supabase/supabase-js' + const options = { schema: 'other_schema' } + const supabase = createClient('https://xyzcompany.supabase.co', 'public-anon-key', options) + ``` + + By default the API server points to the `public` schema. You can enable others database schemas within the Dashboard. + Go to `Settings > API > Schema` and add the schema which you want to expose to on the API. + + Note: each client connection can only access a single schema, so the code above can access the `other_schema` schema but cannot access the `public` schema. Generating Types: description: | Supabase will soon release native type generators that dump your database types for various languages. For now, we support TypeScript through a third-party tool. @@ -307,6 +325,23 @@ pages: password: 'example-password', }) ``` + - name: Sign up with additional user meta data. + isSpotlight: true + js: | + ```js + const { user, session, error } = await supabase.auth.signUp( + { + email: 'example@email.com', + password: 'example-password', + }, + { + data: { + first_name: 'John', + age: 27, + } + } + ) + ``` - name: Sign up with third-party providers. hideCodeBlock: true description: | diff --git a/web/src/css/custom.css b/web/src/css/custom.css index ce0ef0713ef..55eae960ded 100755 --- a/web/src/css/custom.css +++ b/web/src/css/custom.css @@ -1315,4 +1315,8 @@ h4.method-list-item-label .method-list-item-validation { font-family: 'office code pro'; border: 1px solid var(--custom-border-color); padding: 2px 6px; +} + +details summary:hover { + cursor: pointer; } \ No newline at end of file diff --git a/web/src/pages/index.js b/web/src/pages/index_old.js similarity index 99% rename from web/src/pages/index.js rename to web/src/pages/index_old.js index 4c22a207478..57c1009e250 100755 --- a/web/src/pages/index.js +++ b/web/src/pages/index_old.js @@ -1,3 +1,14 @@ +/* + * + * please note: + * + * This file was renamed from 'index' so the docs/about page + * can be properly served as the homepage + * + * @MildTomato + * + */ + import React, { useState } from 'react' import clsx from 'clsx' import Layout from '@theme/Layout' diff --git a/web/vercel.json b/web/vercel.json deleted file mode 100644 index 646faa1b094..00000000000 --- a/web/vercel.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "rewrites": [ - { "source": "/", "destination": "https://www-internal.supabase.io/new" }, - { "source": "/beta", "destination": "https://www-internal.supabase.io/new/beta" } - ], - "trailingSlash": false -} diff --git a/www/README.md b/www/README.md index aef2d0383d7..a55b9e336d8 100644 --- a/www/README.md +++ b/www/README.md @@ -4,11 +4,9 @@ This is a single repository for two different websites. Our documents were created with docusaurus and are stored in the web folder. Our beta website can be found in the www folder. This is a standard Next.js website. -The beta website has a `basePath` of `new` and is built with `vercel.json`. This is done to distinguish between HTTP requests from both websites. Any request with a path that begins with `/new/` will be routed to the beta website. - Install the [Vercel CLI](https://vercel.com/cli). -To execute this locally, run the following commands. This will launch the website at http://localhost:8080/, and requests will be automatically proxied (through vercel rewrites) to the docs website (running at http://localhost:3005/) and the beta website (running at http://localhost:3000). +You will need to run the marketing website and docs website seperately. ``` # tab 1 @@ -27,10 +25,12 @@ npm run gen:supabase npm run start ``` -In production, this setup is deployed as three different vercel websites (`docs`, `www` and `main`). +In production, this setup is deployed as two different vercel websites (`docs` and `www`) ## Known issues -- Some hardcoding of `/new` in `www`. Should be fine as long as the basePath doesn't change. - Referencing resources in nested folders may not work for `web` (eg `/web/static/folder/nestedfolder/asset`) may not work. -- Don't use `Link` since that adds `/new` to the links. Use plain `a` tags when possible. +- Possibly need to prepend all images/assets in docs site with baseUrl. + + + diff --git a/www/_blog/2020-07-10-alpha-launch-postmortem.mdx b/www/_blog/2020-07-10-alpha-launch-postmortem.mdx index 4e46ac61cc5..e360d80f8da 100644 --- a/www/_blog/2020-07-10-alpha-launch-postmortem.mdx +++ b/www/_blog/2020-07-10-alpha-launch-postmortem.mdx @@ -25,15 +25,15 @@ Before we get into the details, here are some high-level numbers for the week fo We had 30,000 new website visitors to [supabase.io](http://supabase.io): -![This graph shows the traffic to our website, that peaks at 15,000 the first day and tails off throughout the week. We had a total of 30,000 visitors to our site. That's according to Google Analytics though, and everyone on HN blocks GA so who knows what the real number is.](/new/images/blog/supabase-traffic-may.png) +![This graph shows the traffic to our website, that peaks at 15,000 the first day and tails off throughout the week. We had a total of 30,000 visitors to our site. That's according to Google Analytics though, and everyone on HN blocks GA so who knows what the real number is.](/images/blog/supabase-traffic-may.png)
We had over 1400 signups in 7 days: -![This graph shows our signups. Before the launch we had around 100 signups. After the launch it sky-rocketed to 600 in the first day, 900 by the second, and 1000 by the third day. By the end of the week we had over 1400 signups.](/new/images/blog/hn-launch.png) +![This graph shows our signups. Before the launch we had around 100 signups. After the launch it sky-rocketed to 600 in the first day, 900 by the second, and 1000 by the third day. By the end of the week we had over 1400 signups.](/images/blog/hn-launch.png) Github stars rocketed for our two main repos, [supabase](https://github.com/supabase/supabase) and [realtime](https://github.com/supabase/realtime). -![This graph shows our github stars. It's basically a vertical line. Our main repo went from 300 stars to 1300 overnight.](/new/images/blog/supabase-github-stars-june.png) +![This graph shows our github stars. It's basically a vertical line. Our main repo went from 300 stars to 1300 overnight.](/images/blog/supabase-github-stars-june.png) ## The good @@ -43,7 +43,7 @@ Here are the things that survived well. This was the most surprising survivor. Our middleware was served from a single Ubuntu server with 4 CPUs and 8GB of RAM. This server was running our middleware using `docker-compose up`: -![This image shows in middleware architecture. We used docker-compose to pull up 5 open source tools: Kong, Realtime, PostgREST, PG-API, and PG-BOSS.](/new/images/blog/supabase-middleware-docker.png) +![This image shows in middleware architecture. We used docker-compose to pull up 5 open source tools: Kong, Realtime, PostgREST, PG-API, and PG-BOSS.](/images/blog/supabase-middleware-docker.png) In case you're wondering why any sane company would use that in production, it's because we weren't planning to launch - the HackerNews post was created by an early GitHub follower, while we were alpha testing, and it was too scary to migrate the middleware while it was servicing the thundering herd. All Supabase projects use the same middleware stack (sans docker-compose), so I guess this counts as as a successful load test. @@ -77,7 +77,7 @@ Let me start by saying that Digital Ocean have been great for getting up and run The first sign of problems were the frequent production errors. This is a screenshot of emails from Digital ocean for the month of June. -![This image shows all the emails I was receiving from Digital Ocean. I was receiving an email every other day about servers which needed to be migrated.](/new/images/blog/digital-ocean-emails-errors.png) +![This image shows all the emails I was receiving from Digital Ocean. I was receiving an email every other day about servers which needed to be migrated.](/images/blog/digital-ocean-emails-errors.png) Each of these emails represents one or more servers that has a critical issue: diff --git a/www/_blog/2020-08-05-supabase-auth.mdx b/www/_blog/2020-08-05-supabase-auth.mdx index 71644d4c3e0..c7b7a19c6a2 100644 --- a/www/_blog/2020-08-05-supabase-auth.mdx +++ b/www/_blog/2020-08-05-supabase-auth.mdx @@ -18,7 +18,7 @@ Two months ago a developer discovered Supabase and (unexpectedly) [launched us o -![This image shows all of the top dev tool launches on Hacker news. The most popular is Stripe, with 1249 upvotes, the next popular is Supabase with 1120 upvotes, and third is Fly.io with 626 upvotes.](/new/images/blog/supabase-hn-launch.png) +![This image shows all of the top dev tool launches on Hacker news. The most popular is Stripe, with 1249 upvotes, the next popular is Supabase with 1120 upvotes, and third is Fly.io with 626 upvotes.](/images/blog/supabase-hn-launch.png) Developers were obviously excited about the prospect of an open source Firebase alternative, but the comments were dominated by one emphatic feature request: Auth. diff --git a/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx b/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx index 99122315fc4..9a9ae5f86ae 100644 --- a/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx +++ b/www/_blog/2020-09-03-supabase-alpha-august-2020.mdx @@ -56,7 +56,7 @@ You can now enable Email Confirmations for new users. This can be toggled on or The biggest communty contribution to date, [@thorwebdev](https://twitter.com/thorwebdev) added TypeScript support to Supabase. He even [live streamed the process](https://twitter.com/thorwebdev/status/1292722189788016641). -![This git shows how TypeScript makes it even easier to use Supabase, through VSCode's intellisense.](/new/images/blog/typescript-support.gif) +![This git shows how TypeScript makes it even easier to use Supabase, through VSCode's intellisense.](/images/blog/typescript-support.gif) ### Kaizen @@ -70,7 +70,7 @@ We have a number of small improvements: The release of Auth last month accelerated our community growth, based on [Orbit Levels.](https://github.com/orbit-love/orbit-model) -![This image shows our community growth. In August we had about 250 active members across GitHub and Twitter.](/new/images/blog/community-august.png) +![This image shows our community growth. In August we had about 250 active members across GitHub and Twitter.](/images/blog/community-august.png) - We received our first enterprise sponsor. Thanks to [@briannekimmel](https://twitter.com/briannekimmel) from [@WorkLifeVC](https://twitter.com/WorkLifeVC) for becoming an [Enterprise Sponsor](https://github.com/sponsors/supabase). - [@amorriscode](https://github.com/amorriscode) added Redwood support! [[Pull Request](https://github.com/redwoodjs/redwood/pull/1033)] diff --git a/www/_blog/2020-09-11-supabase-hacktoberfest-2020.mdx b/www/_blog/2020-09-11-supabase-hacktoberfest-2020.mdx index f8b0692f909..134608f899f 100644 --- a/www/_blog/2020-09-11-supabase-hacktoberfest-2020.mdx +++ b/www/_blog/2020-09-11-supabase-hacktoberfest-2020.mdx @@ -51,7 +51,7 @@ Tune in to our online events. We've created a [GitHub project board](https://github.com/orgs/supabase/projects/5) to keep track of what's happening and can enjoy collaborating and hacking together 🥳 -You can contribute to one of the existing `hacktoberfest` issue, or you can grab one of the ideas from the notes in the project board and [open a new issue](https://github.com/supabase/supabase/issues/new/choose) for it. Make sure to tag the newly created issue with the `hacktoberfest` label. This will be important for you to have a chance at getting the limited edition Hacktoberfest T-Shirt. See the [participation rules](https://hacktoberfest.digitalocean.com/details/#rules) for more details. +You can contribute to one of the existing `hacktoberfest` issue, or you can grab one of the ideas from the notes in the project board and [open a new issue](https://github.com/supabase/supabase/issues/choose) for it. Make sure to tag the newly created issue with the `hacktoberfest` label. This will be important for you to have a chance at getting the limited edition Hacktoberfest T-Shirt. See the [participation rules](https://hacktoberfest.digitalocean.com/details/#rules) for more details. ### I'm a Developer @@ -71,4 +71,4 @@ We'd love to see you at one of our events and have you contribute to Supabase th ## Questions / ideas / feedback? -We'd love to hear it, just [tweet at us](https://twitter.com/supabase), or [open an issue](https://github.com/supabase/supabase/issues/new/choose). +We'd love to hear it, just [tweet at us](https://twitter.com/supabase), or [open an issue](https://github.com/supabase/supabase/issues/choose). diff --git a/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx b/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx index 0b4cdec7475..49bfe53e038 100644 --- a/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx +++ b/www/_blog/2020-10-03-supabase-alpha-september-2020.mdx @@ -33,7 +33,7 @@ Watch a full demo: We've released OAuth logins! You can now enable third-party logins on your app for Bitbucket, GitHub, GitLab, or Google. -![This is a picture of the supabase dashboard with OAuth logins](/new/images/blog/supabase-oauth-logins.png) +![This is a picture of the supabase dashboard with OAuth logins](/images/blog/supabase-oauth-logins.png) ### Clone tables @@ -63,7 +63,7 @@ The SQL editor now stores your query history in your browser. You can also save Supabase was given access to [GitHub Discussions](https://github.com/supabase/supabase/discussions)! This is the place for you to ask questions or show off what you've built with Supabase. -![This is a screenshot of our GitHub Discussions, a new feature by GitHub.](/new/images/blog/supabase-github-discussions.png) +![This is a screenshot of our GitHub Discussions, a new feature by GitHub.](/images/blog/supabase-github-discussions.png) ### Kaizen @@ -84,7 +84,7 @@ Supabase was given access to [GitHub Discussions](https://github.com/supabase/su There's been [plenty of drama](https://hacktoberfest.digitalocean.com/hacktoberfest-update) during Hacktoberfest, but Supabase is committed to helping new contributors get started with open source. We've already seen a lot of issues closed by new members to our community and first-time contributors. If you're looking for ways to get involved, read our Hacktoberfest [blog post](https://supabase.io/blog/2020/09/11/supabase-hacktoberfest-2020), check our our [live stream](https://www.youtube.com/watch?v=3_xRLTjvEiE&t=60s), and then dive into our [project board](https://github.com/orgs/supabase/projects/5). -![This is an image of our hacktoberfest project board on GitHub.](/new/images/blog/supabase-hacktoberfest-board.png) +![This is an image of our hacktoberfest project board on GitHub.](/images/blog/supabase-hacktoberfest-board.png) ### Coming next diff --git a/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx b/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx index ce5d980112d..ba5b169e3b6 100644 --- a/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx +++ b/www/_blog/2020-11-02-supabase-alpha-october-2020.mdx @@ -40,19 +40,19 @@ Check out the [blog post](https://supabase.io/blog/2020/10/30/improved-dx) to le Although it was only intended to be a temporary feature, the SQL Editor has become one of the most useful features of Supabase. This month we decided to make give it some attention, adding Tabs and making it full-screen. This is the first of many updates, we've got some exciting things planned for the SQL Editor. -![This image shows a SQL Editor with tabs. Originally our SQL editor was very basic, but we're moving towards something very powerful.](/new/images/blog/sql-editor.png) +![This image shows a SQL Editor with tabs. Originally our SQL editor was very basic, but we're moving towards something very powerful.](/images/blog/sql-editor.png) ### Key commands for Power Users For the heavy table editor users, we've gone ahead and added a bunch of key commands and keyboard shortcuts so you can zip around and manipulate your tables faster than ever. -![This image shows some of the keyboard shortcuts we introduced on the table editor.](/new/images/blog/keyboard-shortcuts.png) +![This image shows some of the keyboard shortcuts we introduced on the table editor.](/images/blog/keyboard-shortcuts.png) ### Magic Links One of the most requested Auth features was the ability to send magic links that your users can use to log in. You can use this with new or existing users, and alongside passwords or stand alone. -![This image shows a template where developers can edit the magic links email which is sent to their users on sign up.](/new/images/blog/magic-links.png) +![This image shows a template where developers can edit the magic links email which is sent to their users on sign up.](/images/blog/magic-links.png) ### Kaizen diff --git a/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx b/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx index 9804061f1df..260e67d71e9 100644 --- a/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx +++ b/www/_blog/2020-12-01-supabase-alpha-november-2020.mdx @@ -34,25 +34,25 @@ Watch a full demo: You can now add users manually from your dashboard. -![This image shows how to invite a new user directly from the dashboard.](/new/images/blog/invite-users.gif) +![This image shows how to invite a new user directly from the dashboard.](/images/blog/invite-users.gif) ### User admin You can also perform admin functions on existing users - send password reset emails, magic links, and delete users. -![This image shows how to delete a user directly from the dashboard.](/new/images/blog/delete-users.gif) +![This image shows how to delete a user directly from the dashboard.](/images/blog/delete-users.gif) ### Even more powerful SQL Editor Last month we [announced](/blog/2020/11/02/supabase-alpha-october-2020#more-powerful-sql-editor) an improved SQL Editor, and this month we've taken it even further. The SQL Editor is now a full Monaco editor, like you'd find in VS Code. Build your database directly from the browser. -![This image shows our improved SQL Editor.](/new/images/blog/supabase-monaco-editor.png) +![This image shows our improved SQL Editor.](/images/blog/supabase-monaco-editor.png) ### Status page We added a [Status Page](https://status.supabase.io/) which tracks the uptime and latency of the Supabase platform. -![This image shows our new status page.](/new/images/blog/status-page.png) +![This image shows our new status page.](/images/blog/status-page.png) ### Kaizen diff --git a/www/_blog/2020-12-02-case-study-monitoro.mdx b/www/_blog/2020-12-02-case-study-monitoro.mdx index be2ee738639..975941491b9 100644 --- a/www/_blog/2020-12-02-case-study-monitoro.mdx +++ b/www/_blog/2020-12-02-case-study-monitoro.mdx @@ -23,7 +23,7 @@ Learn how Monitoro was able to build fast, ensure reliability, and keep scaling In one month, Monitoro scaled from nothing to nearly one million API requests per day. -![This image Monitoro's API requests every day for a month. They went from zero to 800 thousand daily requests.](/new/images/blog/monitoro-requests.png) +![This image Monitoro's API requests every day for a month. They went from zero to 800 thousand daily requests.](/images/blog/monitoro-requests.png) ### Customer discovery to development @@ -39,7 +39,7 @@ Within a couple of days, the team had a version ready they could deploy. Monitor Fast forward to today, and Monitoro's user base has been ramping up, as they use Monitoro to monitor changes to websites all over the world. Despite how fast their user base has grown, the Monitoro team have peace of mind as they scale because they used Supabase, knowing it will just work without worrying about DevOps. -![Quote from Omar - Supabase was exactly the solution I needed so when I saw it on Hacker News I was instantly excited. Supabase allowed us to go further, faster, with our product functionality. We had a fast-growing user base which would have been challenging to support without being able to depend on Supabase.](/new/images/blog/omar-monitoro.png) +![Quote from Omar - Supabase was exactly the solution I needed so when I saw it on Hacker News I was instantly excited. Supabase allowed us to go further, faster, with our product functionality. We had a fast-growing user base which would have been challenging to support without being able to depend on Supabase.](/images/blog/omar-monitoro.png) ### Prototype fast, and keep going diff --git a/www/_blog/2020-12-02-case-study-tayfa.mdx b/www/_blog/2020-12-02-case-study-tayfa.mdx index c86a82b3070..008abc304ed 100644 --- a/www/_blog/2020-12-02-case-study-tayfa.mdx +++ b/www/_blog/2020-12-02-case-study-tayfa.mdx @@ -21,7 +21,7 @@ date: '12-02-2020' Sarup's background is in open-source, web frontends, and devtools. In the summer of 2020, he was rapidly building MVPs as he explored different problem spaces. Sarup found that reusing his frontend work across projects, wasn't as simple as he'd have liked. -![This image shows a quote from Sarup - Frontends should be as simple as: Sign-up, drag & drop, publish.](/new/images/blog/sarup-tayfa.png) +![This image shows a quote from Sarup - Frontends should be as simple as: Sign-up, drag & drop, publish.](/images/blog/sarup-tayfa.png) - Zero to MVP: **7 Days** - Idea to 1st Payment: **30 Days** @@ -39,7 +39,7 @@ One option was to do it the "old-school" way: Postgres on a custom server, or Mo Luckily, Sarup discovered Supabase through the Vercel community. Open-source and built on top of Postgres, it was perfect for his future self-hosting needs and also offered him an API out of the box. The current version of TAYFA is the third iteration, and also takes advantage of Supabase Auth, an out of the box auth layer. -![This image shows a quote from his customers - The speed at which TAYFA is evolving is crazy. I've seen ideas translate into live features 10 minutes after speaking on the phone.](/new/images/blog/tanmai-tayfa.png) +![This image shows a quote from his customers - The speed at which TAYFA is evolving is crazy. I've seen ideas translate into live features 10 minutes after speaking on the phone.](/images/blog/tanmai-tayfa.png) > _"If my product helps customers move fast, then I need to move fast._ > diff --git a/www/_blog/2020-12-02-supabase-striveschool.mdx b/www/_blog/2020-12-02-supabase-striveschool.mdx index 2f8c1f8cb10..dc01b94ecf8 100644 --- a/www/_blog/2020-12-02-supabase-striveschool.mdx +++ b/www/_blog/2020-12-02-supabase-striveschool.mdx @@ -20,7 +20,7 @@ date: '12-02-2020' We are proud to announce we are teaming up with fellow YC Summer 20 Alumni [Strive School](https://strive.school/), to help teach the next generation of software developers about open source software development. -![Supabase and Strive are partnering up to teach OSS.](/new/images/blog/strive-supabase.png) +![Supabase and Strive are partnering up to teach OSS.](/images/blog/strive-supabase.png) Strive School is on a mission to train the next generation of Computer Engineers, starting from Europe. diff --git a/www/_blog/2020-12-13-supabase-dashboard-performance.mdx b/www/_blog/2020-12-13-supabase-dashboard-performance.mdx index 4533fb1eed9..c608bbc9330 100644 --- a/www/_blog/2020-12-13-supabase-dashboard-performance.mdx +++ b/www/_blog/2020-12-13-supabase-dashboard-performance.mdx @@ -27,11 +27,11 @@ There was some low-hanging fruit to improve performance, but we had one importan Our dashboard is JavaScript heavy, so we started by setting up analytics to track our bundle sizes. [Next-bundle-analyzer](https://www.npmjs.com/package/@next/bundle-analyzer) (or [webpack-bundle-analyzer](https://www.npmjs.com/package/webpack-bundle-analyzer)) provides an interactive treemap of your generated JavaScript bundles. This is our treemap when we started. It gave us a clear indication what changes we needed to achieve the most impact. -![Nextjs tree analyzer](/new/images/blog/blog/nextjs-tree-analyzer.png) +![Nextjs tree analyzer](/images/blog/blog/nextjs-tree-analyzer.png) There are some great tools when it comes to Real User Monitoring (RUM). We chose the newly-launched [Sentry performance monitoring](https://sentry.io/for/performance/) product since we already use Sentry for error tracking and we wanted to minimize new tools in our stack. It also supports reporting [Core Web Vitals](https://web.dev/vitals/), the performance metrics created by Google to track initial loading performance, responsiveness and visual stability. Core Web Vitals come with recommended target values, giving us clear goals to hit. -![Core Web Vitals](/new/images/blog/blog/core-web-vitals.png) +![Core Web Vitals](/images/blog/blog/core-web-vitals.png) ## Improving our JavaScript bundle size @@ -45,7 +45,7 @@ We used [Bundlephobia](https://bundlephobia.com/) on our largest modules. This i We migrated from `Joi` to `ajv` for our schema validation which was 32% smaller. `ajv` was already bundled as a transitive dependency of other modules, making it a no-brainer. -![NPM dependencies](/new/images/blog/blog/npm-dependencies.png) +![NPM dependencies](/images/blog/blog/npm-dependencies.png) We reverted our [crypto-js](https://github.com/brix/crypto-js) module from version 4.0 to 3.3.0. Version 4.0 [injects more than 400kb code](https://github.com/brix/crypto-js/issues/276) when used in a browser context. The newer version replaces `Math.random` with node's implementation, injecting the entire node crypto module into the browser context. We use `crypto-js` for decrypting user's API keys and so we're not reliant on the randomness of the PRNG. We might move to a dedicated module like [aes-js](https://www.npmjs.com/package/aes-js) in the future since it has a much smaller surface area than `crypto-js` (in terms of security and performance). @@ -111,7 +111,7 @@ During our transition from Alpha to Beta, performance was one of the important f With these changes, we have a respectable Core Web Vitals score. This is a snapshot from Sentry with RUM data from the last week. We are within the recommended threshold for all the 3 Web Vitals. -![Sentry results](/new/images/blog/blog/sentry-results.png) +![Sentry results](/images/blog/blog/sentry-results.png) Our Next.js build output also shows that users download < 200 kb of JavaScript between any two page transitions. We're still improving too - even though we provide a lot of functionality in our dashboard, we will continue to reduce our bundle sizes. diff --git a/www/_blog/2021-01-02-supabase-beta-december-2020.mdx b/www/_blog/2021-01-02-supabase-beta-december-2020.mdx index 955c9abe3fd..9d1d1ac2820 100644 --- a/www/_blog/2021-01-02-supabase-beta-december-2020.mdx +++ b/www/_blog/2021-01-02-supabase-beta-december-2020.mdx @@ -33,7 +33,7 @@ Watch a full demo: We spent months working on Performance, Security, and Reliability. Read more on our [Beta Page](https://supabase.io/beta). -![This image shows our Beta Page.](/new/images/blog/blog/dec-beta.png) +![This image shows our Beta Page.](/images/blog/blog/dec-beta.png) ### Improve your docs inline @@ -80,7 +80,7 @@ We raised $6M from Y Combinator, Mozilla, and Coatue. You can read more on [Tech - [@ffbass](https://github.com/ffabss) started working on gotrue-java. [Link](https://github.com/supabase/gotrue-java). - We've grown more than 50% (GitHub star count) since moving into Beta. [Link](https://twitter.com/supabase/status/1345410714836594693) -![This image shows GitHub star growth.](/new/images/blog/blog/dec-starcount.png) +![This image shows GitHub star growth.](/images/blog/blog/dec-starcount.png) If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/channel/UCNTVzV1InxHV-YR0fSajqPQ) or [follow us on Twitter](https://twitter.com/supabase). diff --git a/www/_blog/2021-02-02-supabase-beta-january-2021.mdx b/www/_blog/2021-02-02-supabase-beta-january-2021.mdx index be92af606a1..ac10457887b 100644 --- a/www/_blog/2021-02-02-supabase-beta-january-2021.mdx +++ b/www/_blog/2021-02-02-supabase-beta-january-2021.mdx @@ -35,49 +35,49 @@ Watch a full demo: Anyone who has worked with Firebase long enough has become frustrated over the [lack](https://stackoverflow.com/questions/49979714/how-to-get-count-of-documents-in-a-collection) of `count` functionality. This isn't a problem with PostgreSQL! Our libraries now have support for PostgREST's [exact](https://postgrest.org/en/v7.0.0/api.html?highlight=count#exact-count), [planned](https://postgrest.org/en/v7.0.0/api.html?highlight=count#planned-count), and [estimated](https://postgrest.org/en/v7.0.0/api.html?highlight=count#estimated-count) counts. A massive thanks to [@dshukertjr](https://github.com/supabase/postgrest-js/issues/94#event-4210564301) for this adding support to our client library. -![Supabase now supports count functionality](/new/images/blog/blog/postgres-count.png) +![Supabase now supports count functionality](/images/blog/blog/postgres-count.png) ### New Auth Providers We enabled 2 new Auth providers - Facebook and Azure. Thanks to [@Levet](https://github.com/supabase/gotrue/pull/54) for the Azure plugin, and once again to [Netlify's amazing work](https://github.com/netlify/gotrue/issues/107) with GoTrue to implement Facebook. -![Supabase now supports Azure and Facebook Oauth providers](/new/images/blog/blog/auth-azure-and-facebook.png) +![Supabase now supports Azure and Facebook Oauth providers](/images/blog/blog/auth-azure-and-facebook.png) ### Auth Audit Trail We have exposed the audit trail directly in the dashboard, as well as the GoTrue logs. Great for security and debugging. -![Supabase exposes the Auth Audit trail on the dashboard](/new/images/blog/blog/auth-audit.png) +![Supabase exposes the Auth Audit trail on the dashboard](/images/blog/blog/auth-audit.png) ### Auth UI widget In case our Auth endpoints aren't easy enough already, we've built a React [Auth Widget](http://ui.supabase.com/?path=/story/auth-auth--default) for you to drop into your app and to get up-and-running in minutes. -![Supabase has released a React Auth widget](/new/images/blog/blog/auth-widget.png) +![Supabase has released a React Auth widget](/images/blog/blog/auth-widget.png) ### New `auth.email()` function We added a helper function for extracting the logged in user's email address. -![Supabase added an email function for using with Policies](/new/images/blog/blog/policies-email.png) +![Supabase added an email function for using with Policies](/images/blog/blog/policies-email.png) ### New Regions Launch your database in London or Sydney! -![Launch your database in London or Sydney](/new/images/blog/blog/regions-london-sydney.png) +![Launch your database in London or Sydney](/images/blog/blog/regions-london-sydney.png) ### Copy rows as Markdown You can now copy SQL results as Markdown - super useful for adding to blogs and issues. -![Copy query results as markdown](/new/images/blog/blog/countries.gif) +![Copy query results as markdown](/images/blog/blog/countries.gif) ### React server components If you're excited by React Server components then check out the Supabase + Server Components experimental repo. [https://github.com/supabase/next-server-components](https://github.com/supabase/next-server-components) -![Use supabase with React Server components](/new/images/blog/blog/react-server-components-supabase.png) +![Use supabase with React Server components](/images/blog/blog/react-server-components-supabase.png) ### Learn @@ -87,7 +87,7 @@ We know that Auth can be a bit daunting when you're just starting out, so we hav - [Supabase Auth Deep Dive Part 2: Restrict Table Access](https://youtu.be/qY_iQ10IUhs) - [Supabase Auth Deep Dive Part 3: User Based Access Policies](https://youtu.be/0LvCOlELs5U) -![We released a Auth Video Series](/new/images/blog/blog/supabase-auth-series.png) +![We released a Auth Video Series](/images/blog/blog/supabase-auth-series.png) ### Kaizen @@ -112,7 +112,7 @@ We know that Auth can be a bit daunting when you're just starting out, so we hav - The community has made some serious advances on the [Dart](https://github.com/supabase?q=dart&type=&language=), [C#](https://github.com/supabase?q=csharp&type=&language=), [Python](https://github.com/supabase?q=python&type=&language=), and [Kotlin](https://github.com/supabase?q=kotlin&type=&language=) libraries. - We were one of the fastest growing open source startups in Q4 last year: [Link](https://twitter.com/RunaCapital/status/1351122231791910916) -![This image shows the Supabase GitHub star growth.](/new/images/blog/blog/jan-21-starcount.png) +![This image shows the Supabase GitHub star growth.](/images/blog/blog/jan-21-starcount.png) Source: repository.surf/supabase diff --git a/www/_blog/2021-02-09-case-study-roboflow.mdx b/www/_blog/2021-02-09-case-study-roboflow.mdx index 3ed4255ea26..49e1814ed41 100644 --- a/www/_blog/2021-02-09-case-study-roboflow.mdx +++ b/www/_blog/2021-02-09-case-study-roboflow.mdx @@ -18,7 +18,7 @@ Brad Dwyer is the founder of [Roboflow](https://roboflow.com/?ref=supabase), a s Learn how Brad and Roboflow used Supabase to launch [Paint.wtf](https://paint.wtf), a product which survived traffic generated from the front page of Hacker News, Reddit, and Product Hunt. -![Supabase and Strive are partnering up to teach OSS.](/new/images/blog/roboflow-website.png) +![Supabase and Strive are partnering up to teach OSS.](/images/blog/roboflow-website.png) ## From idea to a launch in a weekend @@ -30,7 +30,7 @@ Roboflow settled on a straightforward concept: they prompt users to draw an imag Brad and the team needed a leaderboard to make this idea work. While their first intuition was to use Firebase, it lacks the built-in functionality for counting the number of documents in a collection - a critical function for implementing their leaderboard design. -![Supabase and Strive are partnering up to teach OSS.](/new/images/blog/roboflow-stat.png) +![Supabase and Strive are partnering up to teach OSS.](/images/blog/roboflow-stat.png) You might export data to BigQuery, or implement an increment function on collection change, however PostgreSQL has great built in support for counting and Brad felt like this would be the perfect opportunity to test out Supabase and get the functionality he needed for the leaderboards to work reliably and without implementing add-ons. @@ -40,7 +40,7 @@ Brad and the team built the product overnight and launched it on Hacker News. Pa Over 100K users submitted drawings in a 24 hour span. At this point, Brad knew he had picked the right setup for his leaderboard as even with this massive spike in usage it continued to perform reliably so his users could get accurate and up to date rankings for their submissions. -![Supabase and Strive are partnering up to teach OSS.](/new/images/blog/roboflow-gallery.png) +![Supabase and Strive are partnering up to teach OSS.](/images/blog/roboflow-gallery.png) Paint.Wtf has continued to get sustained coverage in the media and has continued to pick up new and unexpected use cases. For example, remote teams are using Paint.wtf as part of their daily ice breaker activities during COVID to keep up team social cohesion. @@ -52,7 +52,7 @@ Paint.Wtf has continued to get sustained coverage in the media and has continued > > Brad Dwyer, CTO Roboflow. --> -![Supabase and Strive are partnering up to teach OSS.](/new/images/blog/roboflow-quote.png) +![Supabase and Strive are partnering up to teach OSS.](/images/blog/roboflow-quote.png) ## Ship fast, and carry on scaling diff --git a/www/_blog/2021-03-02-supabase-beta-february-2021.mdx b/www/_blog/2021-03-02-supabase-beta-february-2021.mdx index 1bfa56cb743..56ec6029e6d 100644 --- a/www/_blog/2021-03-02-supabase-beta-february-2021.mdx +++ b/www/_blog/2021-03-02-supabase-beta-february-2021.mdx @@ -34,39 +34,39 @@ Watch a full demo: We've improved the UX of our Dashboard with sidebars in every section, including the Table view, the Auth section, and the SQL Editor. -![Our dashboard has sidebars](/new/images/blog/feb/sidebar-tables.png) +![Our dashboard has sidebars](/images/blog/feb/sidebar-tables.png) ### SQL Autocomplete Writing SQL just got 10x easier. We added autocomplete to the SQL editor, including table & column suggestions. ### Auth Redirects Redirect your users to specific route within your site on [`signIn()`](https://supabase.io/docs/reference/javascript/auth-signin#sign-in-with-redirect) and [`signUp()`](https://supabase.io/docs/reference/javascript/auth-signup#sign-up-with-redirect). -![Redirect your users after sign up](/new/images/blog/feb/auth-redirect.png) +![Redirect your users after sign up](/images/blog/feb/auth-redirect.png) ### Replication management We added a page to the Database section for managing Postgres Replication. It's still basic, but you can use it to manage your realtime API - choosing which tables are enabled, and which events to send. -![Replication management](/new/images/blog/feb/manage-replication.png) +![Replication management](/images/blog/feb/manage-replication.png) ### Learning Resources We've released a new [Resources](https://supabase.io/docs/resources) section in our docs, as well as two new Auth modules: [GoTrue Overview](https://supabase.io/docs/learn/auth-deep-dive/auth-gotrue) and [Google OAuth](https://supabase.io/docs/learn/auth-deep-dive/auth-google-oauth). -![Our dashboard has sidebars](/new/images/blog/feb/docs-resources.png) +![Our dashboard has sidebars](/images/blog/feb/docs-resources.png) ### New Region Launch your database in South Africa. -![Launch your database in South Africa](/new/images/blog/feb/new-region-south-africa.png) +![Launch your database in South Africa](/images/blog/feb/new-region-south-africa.png) ### Kaizen @@ -82,7 +82,7 @@ One of the community, [@ftonato](https://github.com/ftonato), has built an amazi [Check it out!](https://github.com/supabase/supabase/tree/master/examples/with-stencil) -![Supabase with Stencil](/new/images/blog/feb/supabase-stencil.png) +![Supabase with Stencil](/images/blog/feb/supabase-stencil.png) - @kiwicopple on the LogRocket Podcast. [Link](https://podrocket.logrocket.com/9) - @bdougie Livestream: More Fullstack React w RedwoodJS + Supabase. [Link](https://www.twitch.tv/videos/907698954) @@ -90,7 +90,7 @@ One of the community, [@ftonato](https://github.com/ftonato), has built an amazi We hit 6000 GitHub stars on [GitHub](https://github.com/supabase/supabase) -![This image shows the Supabase GitHub star growth.](/new/images/blog/feb/github-stars-feb-2021.png) +![This image shows the Supabase GitHub star growth.](/images/blog/feb/github-stars-feb-2021.png) Source: repository.surf/supabase @@ -100,7 +100,7 @@ We hit 6000 GitHub stars on [GitHub](https://github.com/supabase/supabase) Waiting for Supabase Storage? Here's a sneak peek for the upcoming Launch Week at the end of March. -![Supabase Storage coming soon](/new/images/blog/feb/supabase-storage.png) +![Supabase Storage coming soon](/images/blog/feb/supabase-storage.png) ### Get started diff --git a/www/_blog/2021-03-05-postgres-as-a-cron-server.mdx b/www/_blog/2021-03-05-postgres-as-a-cron-server.mdx index 020bb9123fc..411f23046a9 100644 --- a/www/_blog/2021-03-05-postgres-as-a-cron-server.mdx +++ b/www/_blog/2021-03-05-postgres-as-a-cron-server.mdx @@ -51,11 +51,12 @@ create extension if not exists pg_cron; If you're using Supabase you can also enable it in the Dashboard. -![This image shows that pg_cron is enabled in the Supabase Dashboard](/new/images/blog/supabase-extensions.png) +![This image shows that pg_cron is enabled in the Supabase Dashboard](/images/blog/supabase-extensions.png) #### Granting access to the extension If you're planning to use a `non-superuser` role to schedule jobs, ensure that they are granted access to the `cron` schema and its underlying objects beforehand. + ```sql grant usage on schema cron to {{DB user}}; grant all privileges on all tables in schema cron to {{DB user}}; @@ -105,7 +106,7 @@ select Now when we see that the payload is sent every minute, exactly on the minute. -![This image shows the website that receives our webhook every minute.](/new/images/blog/website-hook.jpeg) +![This image shows the website that receives our webhook every minute.](/images/blog/website-hook.jpeg) And that's it! We've built a cron webhook. Breaking down the code example above we have 2 key parts: diff --git a/www/_blog/2021-03-22-In-The-Loop.mdx b/www/_blog/2021-03-22-In-The-Loop.mdx index 4a36ff2d69c..4a2a6f2ac25 100644 --- a/www/_blog/2021-03-22-In-The-Loop.mdx +++ b/www/_blog/2021-03-22-In-The-Loop.mdx @@ -21,7 +21,7 @@ Intheloop.dev is a single point of entry for developers to stay up to date on th Kevin is launching with coverage on three packages - React, Kotlin and Vite. He is also part of the [#buildinpublic](https://twitter.com/search?q=%23buildinpublic&src=typed_query) movement, In The Loop is open-source - you can [check it out on Github](https://github.com/kevcodez/intheloop). Kevin also developed open-source [Gotrue](https://github.com/supabase/gotrue-kt) and [PostgREST](https://github.com/supabase/postgrest-kt) Kotlin clients for Supabase. -![intheloop.dev screenshot](/new/images/blog/intheloop-screenshot.jpg) +![intheloop.dev screenshot](/images/blog/intheloop-screenshot.jpg) ## Sometimes Firebase just isn't enough diff --git a/www/_blog/2021-03-25-angels-of-supabase.mdx b/www/_blog/2021-03-25-angels-of-supabase.mdx index aa2df1b72c0..11a1c0e6dd1 100644 --- a/www/_blog/2021-03-25-angels-of-supabase.mdx +++ b/www/_blog/2021-03-25-angels-of-supabase.mdx @@ -13,22 +13,25 @@ tags: date: '2021-03-25' --- -Supabase is an open source Firebase alternative. We're on a mission to build an incredible developer experience around +Supabase is an open source Firebase alternative. We're on a mission to build an incredible developer experience around the world's best open source tools. -To build an amazing developer experience, we need developers to guide us. So after finishing Y Combinator, we took a -deliberate approach to fundraising. We loaded our Seed round with developers, technical founders, and developer advocates: +To build an amazing developer experience, we need developers to guide us. So after finishing Y Combinator, we took a +deliberate approach to fundraising. We loaded our Seed round with developers, technical founders, and developer advocates: CTOs who have seen scale, community managers, and hackers. We amassed over 20 angel investors - almost all technical. -The Supabase Team is at full capacity preparing for [Launch Week](/blog/2021/03/25/launch-week) and since we're all short on time we decided - +The Supabase Team is at full capacity preparing for [Launch Week](/blog/2021/03/25/launch-week) and since we're all short on time we decided - why not ask our Angels to write a fundraising post with us? So here is our unconventional fundraising announcement, written with a few of the Angels of Supabase. - ## Mike Krieger (Instagram) -Mike Krieger Supabase +Mike Krieger Supabase Cofounder & CTO of Instagram. [@mikeyk](https://twitter.com/mikeyk) @@ -38,8 +41,8 @@ Cofounder & CTO of Instagram. [@mikeyk](https://twitter.com/mikeyk) #### Why did you invest in Supabase? -Supabase is building tools that are foundational to almost any interactive, modern app, and doing so in a way that's -really aligned with how I think of building tech stacks. For example, choosing Postgres (and deeply understanding +Supabase is building tools that are foundational to almost any interactive, modern app, and doing so in a way that's +really aligned with how I think of building tech stacks. For example, choosing Postgres (and deeply understanding Postgres' features) as the underlying datastore. #### Do you write SQL in uppercase or lowercase? @@ -52,7 +55,7 @@ A website that I built so I could skip out on writing a school paper instead — #### What's the worst programming error you've ever made? -On launch day for Instagram, the site was down for a good chunk of time because we hadn't set a favicon.ico *and* +On launch day for Instagram, the site was down for a good chunk of time because we hadn't set a favicon.ico _and_ we had Django set up to email us on all errors. Cue storm of email sends every time someone loaded our homepage…and a very unhappy web server. #### If you could only use one programming language for the rest of your life, what would it be? @@ -61,15 +64,18 @@ Python — though I am very intrigued by Rust. #### If someone wanted to do what you do, what's a piece of advice you'd give them? -Stay curious and don't feel like everything you build has to be "the next big thing"; so many times I've worked on a +Stay curious and don't feel like everything you build has to be "the next big thing"; so many times I've worked on a fun side project or exploration and ended up learning something I applied to more "serious" work. - ## Cassidy Williams (Netlify) -Cassidy Williams Supabase +Cassidy Williams Supabase -Principal Developer Experience Engineer at Netlify. Outside of that, makes memes, classes, talks, and content for +Principal Developer Experience Engineer at Netlify. Outside of that, makes memes, classes, talks, and content for developers. [@cassidoo](https://twitter.com/cassidoo) #### How many hours per week do you spend coding? @@ -94,7 +100,7 @@ Oh I was a kid, and definitely used it only for CD-ROM games in those dial-up da #### Would you rather fight 100 duck-sized horses or 1 horse-sized duck? -100 duck-sized horses, because I'm a weakling and could probably do better with the smaller things as long as +100 duck-sized horses, because I'm a weakling and could probably do better with the smaller things as long as they aren't too organized. #### If you could only use one programming language for the rest of your life, what would it be? @@ -105,11 +111,13 @@ Probably JavaScript. It's gotten to that level of power that I could apply it to Get a calendar you'll actually use and stick to your to-do lists! - - ## Thorsten Schaeff (Stripe) -Thorsten Schaeff Supabase +Thorsten Schaeff Supabase Helps developers grow the GDP of the Internet as a Developer Advocate at Stripe. [@thorwebdev](https://twitter.com/thorwebdev) @@ -127,7 +135,7 @@ lowercase - I prefer not to scream at my DB. #### What was the first program you wrote and what was it written with? -My first proper project was probably at uni, building an app to alert wind surfers of great wind conditions. +My first proper project was probably at uni, building an app to alert wind surfers of great wind conditions. Was built with Python on a Raspberry Pi, jQuery and PhoneGap #### When was the first time you used a computer and what did you do with it? @@ -136,7 +144,7 @@ When I was 9 years old my dad signed me up for an HTML summer camp. That's how i #### Would you rather fight 100 duck-sized horses or 1 horse-sized duck? -I think there's a market for duck-sized horses. Would capture and sell them. Also duck's have some nasty claws, +I think there's a market for duck-sized horses. Would capture and sell them. Also duck's have some nasty claws, wouldn't be a good idea to make them bigger! #### If you could only use one programming language for the rest of your life, what would it be? @@ -145,14 +153,16 @@ I'd do anything and everything in TypeScript if I could! #### If someone wanted to do what you do, what's a piece of advice you'd give them? -Get involved with and start contributing to open-source. Start creating content about your open-source contributions, +Get involved with and start contributing to open-source. Start creating content about your open-source contributions, and I'm certain that it will pay off! - - ## Brian Douglas (GitHub) -Brian Douglas Supabase +Brian Douglas Supabase Staff Developer Advocate at GitHub. [@bdougieyo](https://twitter.com/bdougieyo) @@ -162,8 +172,8 @@ Staff Developer Advocate at GitHub. [@bdougieyo](https://twitter.com/bdougieyo) #### Why did you invest in Supabase? -Supabase is scratching an itch for me as a developer. I see the value of having a manageable database based on SQL, -but I don't only have limited time to code during the week and I don't want that to get sucked into the maintenance +Supabase is scratching an itch for me as a developer. I see the value of having a manageable database based on SQL, +but I don't only have limited time to code during the week and I don't want that to get sucked into the maintenance and management of that data. I also was a big Firebase fan, and love the developer ergonomics if offered to me as an early user. #### Do you write SQL in uppercase or lowercase? @@ -172,27 +182,30 @@ Always uppercase, but don't ask me what the acronym stands for. #### What was the first program you wrote and what was it written with? -The first function programming was an Android app in Java that was just a picture of a cat. When you pet the cat it purred, -it was part of an Android tutorial when I thought I wanted to be an Android dev. I later got an iPhone and decided to never +The first function programming was an Android app in Java that was just a picture of a cat. When you pet the cat it purred, +it was part of an Android tutorial when I thought I wanted to be an Android dev. I later got an iPhone and decided to never write Java again when I found Ruby on Rails. I built a Yelp clone for churches, but bailed on that when I took a full time dev role. #### When was the first time you used a computer and what did you do with it? -My first time using a computer was in second grade and it was to play wolfenstein. We had a computer that we could use in -the office of the apartment complex I grew up in. One of the older kids installed the game and showed the other kids how +My first time using a computer was in second grade and it was to play wolfenstein. We had a computer that we could use in +the office of the apartment complex I grew up in. One of the older kids installed the game and showed the other kids how to run in from powershell. Probably not the best game to introduce to a 7 year old, but here we are. #### If someone wanted to do what you do, what's a piece of advice you'd give them? -I would tell them to start with creating short form content every day. It easier to make content on things you just +I would tell them to start with creating short form content every day. It easier to make content on things you just learned, so do that. It is also easier to get hired when you already have content. - ## Justin Gage (Retool) -Justin Gage Supabase +Justin Gage Supabase -Growth at Retool. Writes [a newsletter](https://technically.dev/) that helps people understand software engineering and tech. +Growth at Retool. Writes [a newsletter](https://technically.dev/) that helps people understand software engineering and tech. [@itunpredictable](https://twitter.com/itunpredictable) #### How many hours per week do you spend coding? @@ -201,8 +214,8 @@ It depends – some weeks I’m mostly writing and coordinating, other weeks I #### Why did you invest in Supabase? -I had been working on the Firebase integration at Retool for a bit, and kept wondering why it was (a) closed source -and (b) NoSQL only. Over the span of a week, something like 5 or 6 of my developer friends asked me what I thought +I had been working on the Firebase integration at Retool for a bit, and kept wondering why it was (a) closed source +and (b) NoSQL only. Over the span of a week, something like 5 or 6 of my developer friends asked me what I thought about Supabase, so I checked it out – after using the product for a side project, investing was an easy decision. #### Do you write SQL in uppercase or lowercase? @@ -217,17 +230,20 @@ SQL (particularly standard Postgres syntax) is the best language on the planet Eh, I can’t really give advice, I haven’t figured anything out myself yet! - ## Iheanyi Ekechukwu (PlanetScale) -Iheanyi Ekechukwu Supabase +Iheanyi Ekechukwu Supabase Senior Software Engineer at PlanetScale. [@kwuchu](https://twitter.com/kwuchu) #### How do you pronounce your name? #### How many hours per week do you spend coding? @@ -236,7 +252,7 @@ Pretty much, the majority of my week is spent coding. I'd say realistically, aro #### Why did you invest in Supabase? -The tagline about Supabase being an "open-source Firebase alternative" had me intrigued. As I looked more deeply into +The tagline about Supabase being an "open-source Firebase alternative" had me intrigued. As I looked more deeply into the product, I was impressed by the well-thought out design and also how easy it is to use the product as well. #### Do you write SQL in uppercase or lowercase? @@ -245,8 +261,8 @@ Uppercase. #### When was the first time you used a computer and what did you do with it? -During summers as a child, my dad would take me to work with him at the community college he taught at. I'd be sitting -in his office while he was in lectures and actually just use his computer to play that 3D Space Pinball game. I think +During summers as a child, my dad would take me to work with him at the community college he taught at. I'd be sitting +in his office while he was in lectures and actually just use his computer to play that 3D Space Pinball game. I think I was 5 or 6 years old at the time. #### If you could only use one programming language for the rest of your life, what would it be? @@ -255,13 +271,16 @@ Honestly, I would probably choose Go. It's a pretty dope language for building o #### If someone wanted to do what you do, what's a piece of advice you'd give them? -Always be learning. There's so many things to learn as an engineer and the job is constantly about learning new things. +Always be learning. There's so many things to learn as an engineer and the job is constantly about learning new things. Never settle, never get comfortable, learn as much as you can consistently. - ## Zach Waterfield (On Deck) -Zach Waterfield Supabase +Zach Waterfield Supabase Engineer at OnDeck, Network Leader at Village Global, Founder of Kopa (W19). [@zlwaterfield](https://twitter.com/zlwaterfield) @@ -271,9 +290,9 @@ Anywhere from 10 to 50 depending on the week #### Why did you invest in Supabase? -I have many ideas, and spinning up a backend, db, etc., is so daunting, so I started using Firebase, but it was very -frustrating. When I saw Supabase I instantly knew that was the solution. The ability to use Postgres directly from the -client with authentication built-in was a game-changer. I think it could become the go-to that early-stage companies +I have many ideas, and spinning up a backend, db, etc., is so daunting, so I started using Firebase, but it was very +frustrating. When I saw Supabase I instantly knew that was the solution. The ability to use Postgres directly from the +client with authentication built-in was a game-changer. I think it could become the go-to that early-stage companies build on to simplify their MVPs. #### Do you write SQL in uppercase or lowercase? @@ -282,18 +301,21 @@ UPPERCASE #### When was the first time you used a computer and what did you do with it? -Weirdly enough, I didn't own a computer until I was in grade 12 and didn't learn to code until I was in University. +Weirdly enough, I didn't own a computer until I was in grade 12 and didn't learn to code until I was in University. I was the only one in a class of 400+ freshman engineers that had never coded before. #### If someone wanted to do what you do, what's a piece of advice you'd give them? -Network, network, network. Everything I do and all my successes are based on my network. Whether that be from YC, my +Network, network, network. Everything I do and all my successes are based on my network. Whether that be from YC, my university peers, OnDeck, Twitter, etc. Focus on building your network, and good opportunities will start to pop up. - ## Shawn Wang (Temporal) -Shawn Wang Supabase +Shawn Wang Supabase Head of Developer Experience at Temporal. [@swyx](https://twitter.com/swyx) @@ -303,7 +325,7 @@ Head of Developer Experience at Temporal. [@swyx](https://twitter.com/swyx) #### Why did you invest in Supabase? -I was extremely impressed by the founders and love the idea of offering a beautiful, integrated developer experience atop +I was extremely impressed by the founders and love the idea of offering a beautiful, integrated developer experience atop of proven, scalable, open source foundations. #### Do you write SQL in uppercase or lowercase? @@ -312,8 +334,8 @@ Uppercase if formal, lowercase if lazy! #### What was the first program you wrote and what was it written with? -We had a computer class in middle school and we were assigned to write a pancake stacking program in BASIC. I was really -obsessed by it and was the only person to submit this assignment complete with a graphical user interface (in BASIC!). +We had a computer class in middle school and we were assigned to write a pancake stacking program in BASIC. I was really +obsessed by it and was the only person to submit this assignment complete with a graphical user interface (in BASIC!). Sadly I didn't see myself as a programmer until 20 years later. #### If someone wanted to do what you do, what's a piece of advice you'd give them? @@ -322,9 +344,9 @@ Sadly I didn't see myself as a programmer until 20 years later. ## By the way -We [raised](https://techcrunch.com/2020/12/15/supabase-raises-6m-for-its-open-source-firebase-alternative/) a $6M seed -round led by Coatue, Mozilla, and YC. +We [raised](https://techcrunch.com/2020/12/15/supabase-raises-6m-for-its-open-source-firebase-alternative/) a $6M seed +round led by Coatue, Mozilla, and YC. -Next week is [Launch Week](/blog/2021/03/25/launch-week) and we'll be launching one new thing every day for a week. +Next week is [Launch Week](/blog/2021/03/25/launch-week) and we'll be launching one new thing every day for a week. -[Check it out](/blog/2021/03/25/launch-week)! \ No newline at end of file +[Check it out](/blog/2021/03/25/launch-week)! diff --git a/www/_blog/2021-03-25-launch-week.mdx b/www/_blog/2021-03-25-launch-week.mdx index 81eb76c0bbb..a42ac7e8aa0 100644 --- a/www/_blog/2021-03-25-launch-week.mdx +++ b/www/_blog/2021-03-25-launch-week.mdx @@ -15,29 +15,28 @@ tags: date: '2021-03-25' --- -When we joined Y Combinator last summer, we spent the entire 3-month program building one (major) feature: Auth. +When we joined Y Combinator last summer, we spent the entire 3-month program building one (major) feature: Auth. Demo Day gave our team something to rally around. The looming deadline forced us to deliver a lot of complex functionality in a short amount of time. -After we finished YC, we recreated Demo Day conditions internally: we gave ourselves a 3-month timeline to move from Alpha to Beta. +After we finished YC, we recreated Demo Day conditions internally: we gave ourselves a 3-month timeline to move from Alpha to Beta. -It worked wonders. We made [giant leaps forward](https://supabase.io/beta) in the performance, security, and +It worked wonders. We made [giant leaps forward](https://supabase.io/beta) in the performance, security, and stability of the platform. -The day after our Beta announcement (still high on the adrenaline of the launch) we asked ourselves: +The day after our Beta announcement (still high on the adrenaline of the launch) we asked ourselves: what's the most ambitious thing we can hope to launch 3 months from now? -We decided not to settle for just one major feature. We wanted to fill an entire week with launches and announcements. +We decided not to settle for just one major feature. We wanted to fill an entire week with launches and announcements. -Looking at the list of features we planned, and with the relatively small team we have, this felt like a hugely ambitious idea. +Looking at the list of features we planned, and with the relatively small team we have, this felt like a hugely ambitious idea. But after another 3 months of building, we're happy to announce that... Starting on Monday 29th March, we'll be commencing our Launch Week! - ## What to expect -We don't want to spoil the surprise, so for now we'll give you a teaser of what to expect. Come back here each day to see what we launch, +We don't want to spoil the surprise, so for now we'll give you a teaser of what to expect. Come back here each day to see what we launch, or follow us on twitter to keep up to date: [@supabase](https://twitter.com/supabase) and follow the hashtag [#supalaunchweek](https://twitter.com/hashtag/supalaunchweek). ## Monday: Pricing @@ -60,7 +59,7 @@ We’re a startup ourselves, so we want to build a sustainable business. Even th If you aren’t confident in our business model though, we’re open source. You can [host it yourself](https://github.com/supabase/supabase/tree/master/docker). Even better, everything we build is centered around Postgres, so you can pretty much `pgdump` your database and take it to your favorite Postgres platform. -![Supabase Pricing](/new/images/blog/launch-week/bernie-1.png) +![Supabase Pricing](/images/blog/launch-week/bernie-1.png) ## Tuesday: Storage @@ -68,21 +67,21 @@ If you aren’t confident in our business model though, we’re open source. You Checkout the launch post here: [Supabase Storage](https://supabase.io/blog/2021/03/30/supabase-storage) -As with anything that we build in Supabase, Storage is fast, secure and scalable. It's integrated well with the rest of the Supabase ecosystem. +As with anything that we build in Supabase, Storage is fast, secure and scalable. It's integrated well with the rest of the Supabase ecosystem. **Security** 🔒 -The authentication is handled by Kong and the authorization policies are implemented via Row Level Security policies in Postgres. This way we didn't have to implement a new language for implementing authorization policies. Check out our blog post for more details on how this works. +The authentication is handled by Kong and the authorization policies are implemented via Row Level Security policies in Postgres. This way we didn't have to implement a new language for implementing authorization policies. Check out our blog post for more details on how this works. **Performance** ⚡️ -Our storage API is a thin layer built with Fastify, a [blazing fast](https://www.fastify.io/benchmarks/) Node.js framework. The security policies are directly evaluated in Postgres. The object explorer in dashboard makes navigation easy even when you have deeply nested folders or millions of objects in your buckets. +Our storage API is a thin layer built with Fastify, a [blazing fast](https://www.fastify.io/benchmarks/) Node.js framework. The security policies are directly evaluated in Postgres. The object explorer in dashboard makes navigation easy even when you have deeply nested folders or millions of objects in your buckets. **Scalability** 📈 You can use storage for your terabytes of ML training data, e-commerce product gallery, or just your growing collection of JPEGS featuring cat's playing synths in space. You can truly build in a weekend and scale to millions. -![Supabase Storage](/new/images/blog/launch-week/bernie-2.png) +![Supabase Storage](/images/blog/launch-week/bernie-2.png) ## Wednesday: CLI @@ -98,7 +97,7 @@ Today we launched the Supabase CLI which includes: Check out the announcement post here: [https://supabase.io/blog/2021/03/31/supabase-cli](https://supabase.io/blog/2021/03/31/supabase-cli) -![Supabase CLI](/new/images/blog/launch-week/bernie-3.png) +![Supabase CLI](/images/blog/launch-week/bernie-3.png) ## Thursday: UI (not an April Fool's joke, we promise) @@ -112,18 +111,18 @@ And now we're doing what we do best at Supabase and making it open source, so th Check out the demo and documentation website directly here: [ui.supabase.io](https://ui.supabase.io/) -![Supabase UI](/new/images/blog/launch-week/bernie-4.png) +![Supabase UI](/images/blog/launch-week/bernie-4.png) -## Friday: One more thing +## Friday: One more thing - 2 April 2021 It's the season finale of Supabase Launchweek! And we have THREE more things to share: -1) [Connection Pooling with PgBouncer](https://supabase.io/blog/2021/04/02/supabase-pgbouncer) - now you can connect directly to your Postgres instance without needing to worry that you'll cap out on connections. Perfect for use with Prisma. +1. [Connection Pooling with PgBouncer](https://supabase.io/blog/2021/04/02/supabase-pgbouncer) - now you can connect directly to your Postgres instance without needing to worry that you'll cap out on connections. Perfect for use with Prisma. -2) [Workflow Engine](https://supabase.io/blog/2021/04/02/supabase-workflows) - Our WIP states language will eventually enable a drag and drop workflow builder like Zapier inside the dashboard. Built with Elixir for scale! +2. [Workflow Engine](https://supabase.io/blog/2021/04/02/supabase-workflows) - Our WIP states language will eventually enable a drag and drop workflow builder like Zapier inside the dashboard. Built with Elixir for scale! -3) supabase.io is now supabase.com - check out our origin story here: [https://supabase.io/blog/2021/04/02/supabase-dot-com](https://supabase.io/blog/2021/04/02/supabase-dot-com) +3. supabase.io is now supabase.com - check out our origin story here: [https://supabase.io/blog/2021/04/02/supabase-dot-com](https://supabase.io/blog/2021/04/02/supabase-dot-com) -![moar](/new/images/blog/launch-week/bernie-5.png) +![moar](/images/blog/launch-week/bernie-5.png) diff --git a/www/_blog/2021-03-29-pricing.mdx b/www/_blog/2021-03-29-pricing.mdx index 61270515152..b3ebf1127d1 100644 --- a/www/_blog/2021-03-29-pricing.mdx +++ b/www/_blog/2021-03-29-pricing.mdx @@ -75,7 +75,7 @@ What does this mean for you as a developer? In the next few days, you will see your usage appear in the dashboard with an upgrade button. -Check back throughout the week to see what else we're launching [here](https://supabase.io/new/blog/2021/03/25/launch-week). +Check back throughout the week to see what else we're launching [here](https://supabase.io/blog/2021/03/25/launch-week). Sign up for the Supabase Beta [here](https://app.supabase.io). diff --git a/www/_blog/2021-03-30-supabase-storage.mdx b/www/_blog/2021-03-30-supabase-storage.mdx index 4e3b53edad2..dc7b1702a09 100644 --- a/www/_blog/2021-03-30-supabase-storage.mdx +++ b/www/_blog/2021-03-30-supabase-storage.mdx @@ -24,7 +24,7 @@ There are three key components to Supabase Storage: - Middleware (access and permissions). This consists of an API Server and Postgres. - Frontend (a nice UI). -![Storage Infrastructure](/new/images/blog/storage/infra.png) +![Storage Infrastructure](/images/blog/storage/infra.png) The Storage API server sits behind Kong, an API Gateway. It talks to different storage backends like S3, Backblaze, etc to retrieve and store objects. @@ -40,15 +40,15 @@ As avid Mac users, we've defaulted to using the column-based explorer in Finder We put in a lot of effort to make sure that the dashboard is fast and easy to navigate with our miller-based column view, allowing you to get to deeply nested folders quickly. If you're a fan of List Views though, don't worry! We have that option available too. The choice is yours. -![Frontend views](/new/images/blog/storage/ph-5.png) +![Frontend views](/images/blog/storage/ph-5.png) Our File Browser also has a rich preview for a wide set of file types including images, audio, and videos. -![Frontend preview](/new/images/blog/storage/ph-2.png) +![Frontend preview](/images/blog/storage/ph-2.png) And if you already know the location of a file but want to save a few clicks, you can paste the path into the location bar and navigate to it directly. -![Frontend navigation](/new/images/blog/storage/ph-4.png) +![Frontend navigation](/images/blog/storage/ph-4.png) ## Designing the storage middleware @@ -84,7 +84,7 @@ Our storage service sits behind [Kong](https://github.com/kong/kong) along with For Authorization, we wanted to avoid creating a new DSL like Firebase. Instead, we created one where you can write policies in the One True Language - SQL! -![One True Language](/new/images/blog/storage/true-language.png) +![One True Language](/images/blog/storage/true-language.png) To do this, we leverage Postgres' Row Level Security. We create a table for `buckets` and `objects` inside each Supabase project. These tables are namespaced in a separate schema called `storage`. @@ -148,9 +148,9 @@ We have intentionally kept the API surface for the storage backend very small, i You may be itching to get started tinkering around with our new Supabase storage - we have an example app prepared for you right [here](https://github.com/supabase/supabase-js/tree/master/example/next-storage) which simulates a simple context of setting an avatar image for a user. This will help you to get a high level overview of how to use your project's storage with our client library. For greater detail, refer to our storage API documentation [here](https://supabase.io/docs/reference/javascript/storage-createbucket). -![Example app 1](/new/images/blog/storage/ph-7.png) +![Example app 1](/images/blog/storage/ph-7.png) -![Example app 2](/new/images/blog/storage/ph-6.png) +![Example app 2](/images/blog/storage/ph-6.png) ## What's next diff --git a/www/_blog/2021-03-31-supabase-cli.mdx b/www/_blog/2021-03-31-supabase-cli.mdx index 3524043422c..d62a0896300 100644 --- a/www/_blog/2021-03-31-supabase-cli.mdx +++ b/www/_blog/2021-03-31-supabase-cli.mdx @@ -71,7 +71,8 @@ Now that your application is now prepared, you can use Supabase anywhere in your ```jsx import { createClient } from '@supabase/supabase-js' const SUPABASE_URL = 'http://localhost:8000' -const SUPABASE_ANON_KEY = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTYwMzk2ODgzNCwiZXhwIjoyNTUwNjUzNjM0LCJyb2xlIjoiYW5vbiJ9.36fUebxgx1mcBo4s19v0SzqmzunP--hm_hep0uLX0ew' +const SUPABASE_ANON_KEY = + 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzdXBhYmFzZSIsImlhdCI6MTYwMzk2ODgzNCwiZXhwIjoyNTUwNjUzNjM0LCJyb2xlIjoiYW5vbiJ9.36fUebxgx1mcBo4s19v0SzqmzunP--hm_hep0uLX0ew' const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY) ``` @@ -139,7 +140,7 @@ This is critical for Row Level Security to work with views. For policies to kick There was a problem in using the [pgAdmin Schema Diff](https://www.pgadmin.org/docs/pgadmin4/development/schema_diff.html) though, it's a GUI-only tool. -![pgadmin diff](/new/images/blog/cli/pgadmin-diff.png) +![pgadmin diff](/images/blog/cli/pgadmin-diff.png) So we did what we always strive to do - improve existing open source software. We created a CLI mode for the Schema Diff on [our repo](https://github.com/supabase/pgadmin4/blob/cli/web/cli.py). We've also released a [docker image](https://hub.docker.com/r/supabase/pgadmin-schema-diff) for a quick start. diff --git a/www/_blog/2021-04-01-supabase-nft-marketplace.mdx b/www/_blog/2021-04-01-supabase-nft-marketplace.mdx index 383bca8f64e..e87fc91d90e 100644 --- a/www/_blog/2021-04-01-supabase-nft-marketplace.mdx +++ b/www/_blog/2021-04-01-supabase-nft-marketplace.mdx @@ -20,20 +20,20 @@ Most people don’t know this but the Supabase team has a long history of involv The team were also founding members of the Guacchain Foundation, an economic experiment in a deflationary-based monetary system, inspired by the fact that Avacados ripen faster when stored together. -NFTs are now capturing the imagination of speculators everywhere, but NFTs as they exist today have a major flaw. We call it the *Copy-Paste Problem*. The Copy-Paste problem is when a token contains a URL to an image hosted on the web, or even on IPFS; there is nothing stopping someone who does not own the token, from heading to that URL, and just downloading the image for themselves. +NFTs are now capturing the imagination of speculators everywhere, but NFTs as they exist today have a major flaw. We call it the _Copy-Paste Problem_. The Copy-Paste problem is when a token contains a URL to an image hosted on the web, or even on IPFS; there is nothing stopping someone who does not own the token, from heading to that URL, and just downloading the image for themselves. -As our latest foray into NFTs we’re announcing BuyMeth.com, (Meth = [M]isleading [E]ncrypted [Th]umbnails) an NFT marketplace that solves the copy-paste problem of NFTs today. +As our latest foray into NFTs we’re announcing BuyMeth.com, (Meth = [M]isleading [E]ncrypted [Th]umbnails) an NFT marketplace that solves the copy-paste problem of NFTs today. -![Supabase NFT marketplace BuyMeth.com](/new/images/blog/nft/nft-1.png) +![Supabase NFT marketplace BuyMeth.com](/images/blog/nft/nft-1.png) ### How does it work? -Each NFT stores a blurhash representation of a full image, but also a link to the full encrypted version of the image stored on IPFS. The full image is always encrypted with the key of the *current* owner. +Each NFT stores a blurhash representation of a full image, but also a link to the full encrypted version of the image stored on IPFS. The full image is always encrypted with the key of the _current_ owner. When a sale is initiated i.e. the seller accepts a buyers offer, Metamask re-encrypts the image with the public key of the buyer, and uploads it to IPFS, the url in the NFT is updated and the buyer assigned as the new owner. After the sale, a 1 week challenge period is initiated where the proceeds of the sale are kept in an escrow contract. The buyer can then decrypt the contents of the image, and can run an automated verification function to verify that the image received (when hashed) does indeed produce the publically available blurhash (or thumbnail). If it does not, then the buyer can submit a claim to the sales contract, along with a proof of the invalid file, and claim back the proceeds. -![Most popular NFTs](/new/images/blog/nft/nft-2.png) +![Most popular NFTs](/images/blog/nft/nft-2.png) As a way to dis-incentivise previous owners of the image to not reveal the original image, we bake in a royalty mechanism, whereby previous owners receive a fraction of the sale price each time, the artwork changes hands. -Despite the undeniable value of such a platform, this announcement is of course an April Fools joke. We are not launching a Supabase NFT platform; but we are [Launching a TON of other stuff this week](https://supabase.io/new/blog/2021/03/25/launch-week). +Despite the undeniable value of such a platform, this announcement is of course an April Fools joke. We are not launching a Supabase NFT platform; but we are [Launching a TON of other stuff this week](https://supabase.io/blog/2021/03/25/launch-week). diff --git a/www/_blog/2021-04-02-supabase-dot-com.mdx b/www/_blog/2021-04-02-supabase-dot-com.mdx index 6d19e7c257a..57fbe7d9d6a 100644 --- a/www/_blog/2021-04-02-supabase-dot-com.mdx +++ b/www/_blog/2021-04-02-supabase-dot-com.mdx @@ -13,33 +13,33 @@ tags: date: '2021-04-02' --- -*tl;dr* During the next week, we'll be migrating from "supabase.io" to "supabase.com". +_tl;dr_ During the next week, we'll be migrating from "supabase.io" to "supabase.com". -There are no changes required on your end. Your API URLs will remain on "supabase.co", and only our website URLs will change. +There are no changes required on your end. Your API URLs will remain on "supabase.co", and only our website URLs will change. The rest of this post talks a bit about the origin of the name, but there's nothing important to know. ## SupaWhat? -At the end of 2019 we released a Postgres [Realtime](https://github.com/supabase/realtime) engine on GitHub. -We created this in my previous company after migrating from Firebase to Postgres. +At the end of 2019 we released a Postgres [Realtime](https://github.com/supabase/realtime) engine on GitHub. +We created this in my previous company after migrating from Firebase to Postgres. -It started gaining traction (if you count "GitHub stars" as traction) and so I tapped my friend, [Ant](https://twitter.com/AntWilson), +It started gaining traction (if you count "GitHub stars" as traction) and so I tapped my friend, [Ant](https://twitter.com/AntWilson), on the shoulder to see if he wanted to build an open source company with me (he was building another start up at the time). -The company we envisaged had Postgres at the core. We searched for every "dot com" we could think of with "base" in the name - hyperbase, -superbase, suprabase, uberbase. It turns out this is what every database start does. We couldn't find any good "dot coms". +The company we envisaged had Postgres at the core. We searched for every "dot com" we could think of with "base" in the name - hyperbase, +superbase, suprabase, uberbase. It turns out this is what every database start does. We couldn't find any good "dot coms". And so we moved on to "dot io" domains. -Anybody who knows Ant, knows that he [loves memes](https://supabase.io/blog/2021/03/25/launch-week). While we were brainstorming -we found that "supabase.io" was available. +Anybody who knows Ant, knows that he [loves memes](https://supabase.io/blog/2021/03/25/launch-week). While we were brainstorming +we found that "supabase.io" was available. -To be honest, this name wasn't a strong contender, but it served a very important purpose - it was extremely "meme-able" because -it sounds similar to Nikki Minaj's [Super Bass](https://youtu.be/4JipHEz53sU). +To be honest, this name wasn't a strong contender, but it served a very important purpose - it was extremely "meme-able" because +it sounds similar to Nikki Minaj's [Super Bass](https://youtu.be/4JipHEz53sU). We chose it as a placeholder and found it was, indeed, very funny to send each other Nikki memes while we brainstormed the business. -![Booom booom booom booom](/new/images/blog/nikki-supabase.jpg) +![Booom booom booom booom](/images/blog/nikki-supabase.jpg) Note to anyone starting a business, don't use a placeholder. You'll never change it. @@ -49,29 +49,29 @@ Luckily for us, the name [grew on us](https://news.ycombinator.com/item?id=23325 When we joined Y Combinator, they gave this advice: -> Except in unusual circumstances (like [Twitch.tv](http://twitch.tv/)), if you don't have the .com version of your name, -you should probably change it. +> Except in unusual circumstances (like [Twitch.tv](http://twitch.tv/)), if you don't have the .com version of your name, +> you should probably change it. -We decided to try purchasing [supabase.com](http://supabase.com) from the current owner. The YC forums were full of founders -recommending a particular Domain Specialist who would help us negotiate and purchase the domain. The only catch - he would take -a percentage of the purchase price. +We decided to try purchasing [supabase.com](http://supabase.com) from the current owner. The YC forums were full of founders +recommending a particular Domain Specialist who would help us negotiate and purchase the domain. The only catch - he would take +a percentage of the purchase price. This struck us as odd. The incentives were more aligned to the domain seller than the purchaser. We're not afraid to roll up our sleeves at Supabase, so we decided we could handle it ourselves. -We were in for a huge surprise. After searching on the (old) [supabase.com](http://supabase.com) website, we found a company address. -And it was literally 100m from my home. +We were in for a huge surprise. After searching on the (old) [supabase.com](http://supabase.com) website, we found a company address. +And it was literally 100m from my home. -Of all the places in the world that the domain could be registered, the owner was within yelling-distance. But we didn't yell. We simply -asked, and after some negotiation, the owner agreed to sell it. +Of all the places in the world that the domain could be registered, the owner was within yelling-distance. But we didn't yell. We simply +asked, and after some negotiation, the owner agreed to sell it. -We were always willing to walk away from the Supabase brand if we needed to, but the price was reasonable for both parties. There really +We were always willing to walk away from the Supabase brand if we needed to, but the price was reasonable for both parties. There really isn't much more to it than that. ## What's next? -Over the next few weeks, we'll update our domain name across most of the sites. If you're using a Supabase database and API, you're on +Over the next few weeks, we'll update our domain name across most of the sites. If you're using a Supabase database and API, you're on a ".co" domain so your apps won't be affected at all. -You may also find some [easter eggs](https://twitter.com/AntWilson/status/1354343248098070530) appear ... \ No newline at end of file +You may also find some [easter eggs](https://twitter.com/AntWilson/status/1354343248098070530) appear ... diff --git a/www/_blog/2021-04-02-supabase-pgbouncer.mdx b/www/_blog/2021-04-02-supabase-pgbouncer.mdx index 9a0474d4416..6e55887e072 100644 --- a/www/_blog/2021-04-02-supabase-pgbouncer.mdx +++ b/www/_blog/2021-04-02-supabase-pgbouncer.mdx @@ -14,65 +14,64 @@ tags: date: '2021-04-02' --- -Javascript Frameworks like [Next.js,](https://nextjs.org/) [Redwood](https://redwoodjs.com/), [Blitz](https://blitzjs.com/), and tools -like [Prisma](https://www.prisma.io/docs/guides/deployment/deployment#pgbouncer) are all moving in one direction. Serverless. +Javascript Frameworks like [Next.js,](https://nextjs.org/) [Redwood](https://redwoodjs.com/), [Blitz](https://blitzjs.com/), and tools +like [Prisma](https://www.prisma.io/docs/guides/deployment/deployment#pgbouncer) are all moving in one direction. Serverless. -Serverless functions work great for developers using the Supabase API because we manage a [PostgREST](https://postgrest.org/en/v7.0.0/) -server for every project. Supabase also provides direct access to the Postgres database, so that developers can connect any tool they want. +Serverless functions work great for developers using the Supabase API because we manage a [PostgREST](https://postgrest.org/en/v7.0.0/) +server for every project. Supabase also provides direct access to the Postgres database, so that developers can connect any tool they want. Unfortunately, Serverless function don't work well for direct Postgres connections (for reasons we'll discuss soon). -Jamstack developers make up a large portion of the Supabase Community. While we'd love for developers to use PostgREST, we mostly want -developers to use Postgres. This means supporting the tools which they already love. +Jamstack developers make up a large portion of the Supabase Community. While we'd love for developers to use PostgREST, we mostly want +developers to use Postgres. This means supporting the tools which they already love. So today we are adding [PgBouncer](https://www.pgbouncer.org/), an open source connection pooler for Postgres. ## What is Connection Pooling? -![Connection Pooling](/new/images/blog/bouncer/connection-pool.png) +![Connection Pooling](/images/blog/bouncer/connection-pool.png) -Typically when a client connects to a PostgreSQL database, they need to open and manage their own database connection. With a connection pool, -connections are already opened and available for use. When a client makes a request, they use a connection from the pool. When the transaction +Typically when a client connects to a PostgreSQL database, they need to open and manage their own database connection. With a connection pool, +connections are already opened and available for use. When a client makes a request, they use a connection from the pool. When the transaction or session is completed the underlying connection is simply returned to the pool and is once again free to be used by another user or application. ### Handling connection surges -In a traditional architecture, middleware servers (e.g. APIs) manage a small number of connection to a Postgres database. +In a traditional architecture, middleware servers (e.g. APIs) manage a small number of connection to a Postgres database. Essentially, the middleware server is a connection pool. -In a Serverless environment, there is no middleware server to maintain a connection, so they create a **new** connection for -each concurrent request. Since Serverless functions are typically used for bursty workloads, this can end up opening a lot of +In a Serverless environment, there is no middleware server to maintain a connection, so they create a **new** connection for +each concurrent request. Since Serverless functions are typically used for bursty workloads, this can end up opening a lot of connections to the database and overwhelm your Postgres server. -Connection pools mitigate this. Connections are opened beforehand and recycled across users and applications. What's more, -[connection pools are specialized for this task](https://medium.com/@k.wahome/database-connections-less-is-more-86c406b6fad). -A small number of connections is sufficient to handle demand ten, twenty times its size, or even more. Whenever a new connection -is required it is taken from a pool of open and available connections instead of initializing an entirely new one. This eliminates +Connection pools mitigate this. Connections are opened beforehand and recycled across users and applications. What's more, +[connection pools are specialized for this task](https://medium.com/@k.wahome/database-connections-less-is-more-86c406b6fad). +A small number of connections is sufficient to handle demand ten, twenty times its size, or even more. Whenever a new connection +is required it is taken from a pool of open and available connections instead of initializing an entirely new one. This eliminates the need to spawn a new process. ## Misconceptions -It's a common misconception that PgBouncer increases the number of connections a Postgres instance can open. -This is not the case. If Postgres is configured for a maximum of 50 connections before connection pooling, it -will still only be able to open 50. Connection pooling simply keeps connections open and idle, ready to accept clients. Nevertheless, +It's a common misconception that PgBouncer increases the number of connections a Postgres instance can open. +This is not the case. If Postgres is configured for a maximum of 50 connections before connection pooling, it +will still only be able to open 50. Connection pooling simply keeps connections open and idle, ready to accept clients. Nevertheless, as mentioned above, PgBouncer allows your database to be able to handle more than it can without a connection pool. - ## Connection "Queuing" -PgBouncer is like a Queue. With regular Postgres, when you hit your connection limit, new connections are rejected. PgBouncer overcomes this -limitation. When all connections in the pool are in-use, it doesn't reject any incoming requests. Instead, -[PgBouncer queues them](https://www.percona.com/blog/2021/02/26/connection-queuing-in-pgbouncer-is-it-a-magical-remedy/) until a -connection is returned to the pool and made available. This doesn't mean connection pooling is a magic bullet. If your clients is -running expensive queries then the connections might take a long time before they are returned to the pool. The natural solution to +PgBouncer is like a Queue. With regular Postgres, when you hit your connection limit, new connections are rejected. PgBouncer overcomes this +limitation. When all connections in the pool are in-use, it doesn't reject any incoming requests. Instead, +[PgBouncer queues them](https://www.percona.com/blog/2021/02/26/connection-queuing-in-pgbouncer-is-it-a-magical-remedy/) until a +connection is returned to the pool and made available. This doesn't mean connection pooling is a magic bullet. If your clients is +running expensive queries then the connections might take a long time before they are returned to the pool. The natural solution to this is to increase your database resources so that it processes queries faster or PgBouncer can open more connections. ## Using Connection Pooling in Supabase -![Pooling UI](/new/images/blog/bouncer/pooler-supabase.png) +![Pooling UI](/images/blog/bouncer/pooler-supabase.png) -From today, all new projects will include connection pooling. In the `Database` section of our dashboard, you will notice a new section for it. -Under the hood, we utilise PgBouncer which is installed in the same server as PostgreSQL. Through the dashboard, we provide you with the -necessary connection details to start using the connection pool as well as the ability to modify `Pool Mode`. Not sure which mode to use? +From today, all new projects will include connection pooling. In the `Database` section of our dashboard, you will notice a new section for it. +Under the hood, we utilise PgBouncer which is installed in the same server as PostgreSQL. Through the dashboard, we provide you with the +necessary connection details to start using the connection pool as well as the ability to modify `Pool Mode`. Not sure which mode to use? Below is a quick primer on each mode. ## Pool modes @@ -95,6 +94,6 @@ This is the most granular option. Connections are returned to the pool after eve Try out connection pooling now with a new project in the [dashboard.](http://app.supabase.io) For now, we do not have any plans to port this over to older projects. -Eventually, we will expose more PgBouncer settings to the UI such as `Pool Size`. At the moment it is set to `15`. +Eventually, we will expose more PgBouncer settings to the UI such as `Pool Size`. At the moment it is set to `15`. -We are still working towards getting the latest version of Supabase Postgres to both the AWS and Digital Ocean marketplaces. Follow us on [Twitter](https://www.notion.so/PgBouncer-is-now-available-in-Supabase-345a74d402464670923cf404b714a354) to be informed once it's released! \ No newline at end of file +We are still working towards getting the latest version of Supabase Postgres to both the AWS and Digital Ocean marketplaces. Follow us on [Twitter](https://www.notion.so/PgBouncer-is-now-available-in-Supabase-345a74d402464670923cf404b714a354) to be informed once it's released! diff --git a/www/_blog/2021-04-02-supabase-workflows.mdx b/www/_blog/2021-04-02-supabase-workflows.mdx index d98a457f351..668ec29fab7 100644 --- a/www/_blog/2021-04-02-supabase-workflows.mdx +++ b/www/_blog/2021-04-02-supabase-workflows.mdx @@ -24,7 +24,7 @@ We're not releasing Functions today. Trust us, we know you want them. They are c But we are building something that we think you're going to like: Workflows. We haven't finished building it yet, but Workflows are a "piece" of the Function story and arguably an even more exciting feature. -![Everyone wants functions](/new/images/blog/workflows/functions.jpg) +![Everyone wants functions](/images/blog/workflows/functions.jpg) ## Firebase Functions diff --git a/www/_blog/2021-04-06-supabase-beta-march-2021.mdx b/www/_blog/2021-04-06-supabase-beta-march-2021.mdx index 4358d3df2bd..6eaeed7d13d 100644 --- a/www/_blog/2021-04-06-supabase-beta-march-2021.mdx +++ b/www/_blog/2021-04-06-supabase-beta-march-2021.mdx @@ -28,30 +28,29 @@ Watch a full demo: allowFullScreen > - ## Supabase Storage Need to store images, audio, and video clips? Well now you can do it on [Supabase Storage](https://supabase.io/blog/2021/03/30/supabase-storage). It's backed by S3 and our new [OSS storage API](https://github.com/supabase/storage-api) written in Fastify and Typescript. Read the [full blog post](https://supabase.io/blog/2021/03/30/supabase-storage). -![Supabase Storage](/new/images/blog/storage/ph-1.png) +![Supabase Storage](/images/blog/storage/ph-1.png) ## Connection Pooling The Supabase API already handles Connection Pooling, but if you're connecting to your database directly (for example, with Prisma) we now [bundle PgBouncer](https://supabase.io/blog/2021/04/02/supabase-pgbouncer). Read the [full blog post](https://supabase.io/blog/2021/04/02/supabase-pgbouncer). -![Connection Pooling](/new/images/blog/bouncer/pgbouncer-thumb.jpg) +![Connection Pooling](/images/blog/bouncer/pgbouncer-thumb.jpg) ## React UI Component Library We open sourced our internal UI component library, so that anyone can use and contribute to the Supabase aesthetic. It lives at [ui.supabase.io](https://ui.supabase.io/) . It was also the #1 Product of the Day [on Product Hunt](https://www.producthunt.com/posts/supabase-ui). -![React UI Library](/new/images/blog/march-2021/supabase-ui.png) +![React UI Library](/images/blog/march-2021/supabase-ui.png) ## CLI -Now you can run Supabase locally in the terminal with `supabase start`. We have done some preliminary work on [diff-based schema migrations](https://supabase.io/blog/2021/03/31/supabase-cli#migrations), and added some new tooling for self-hosting Supabase with Docker. [Blog post here](https://supabase.io/new/blog/2021/03/31/supabase-cli). +Now you can run Supabase locally in the terminal with `supabase start`. We have done some preliminary work on [diff-based schema migrations](https://supabase.io/blog/2021/03/31/supabase-cli#migrations), and added some new tooling for self-hosting Supabase with Docker. [Blog post here](https://supabase.io/blog/2021/03/31/supabase-cli). -![Supabase CLI](/new/images/blog/march-2021/supabase-cli.png) +![Supabase CLI](/images/blog/march-2021/supabase-cli.png) ## Pricing @@ -59,30 +58,30 @@ Our most frequently asked question by far is "ok supabase is sweet, but how mu See [Pricing Page](https://supabase.io/pricing) for full details and also our blog on why [pricing is hard](https://supabase.io/blog/2021/03/29/pricing). -![Supabase Pricing](/new/images/blog/march-2021/supabase-pricing.jpg) +![Supabase Pricing](/images/blog/march-2021/supabase-pricing.jpg) ## NFT Platform Well... not really, but it made for a great [April Fools joke](https://supabase.io/blog/2021/04/01/supabase-nft-marketplace). -![Supabase NFT marketplace BuyMeth.com](/new/images/blog/nft/nft-1.png) +![Supabase NFT marketplace BuyMeth.com](/images/blog/nft/nft-1.png) ## Supabase Dot Com We are now dot com! We'll be porting across over the next few weeks. Read the origin story behind the name [here](https://supabase.io/blog/2021/04/02/supabase-dot-com). -![Supabase Dot Com](/new/images/blog/supabase-dot-com-og.jpg) +![Supabase Dot Com](/images/blog/supabase-dot-com-og.jpg) ## OAuth Scopes -Thanks to a comunity contribution ([@_mateomorris](https://twitter.com/_mateomorris) and [@Beamanator](https://twitter.com/Beamanator)), Supabase Auth now includes OAuth scopes. These allow you to request elevated access during login. For example, you may want to request access to a list of Repositories when users log in with GitHub. Check out the [Documentation](https://supabase.io/docs/reference/javascript/auth-signup#sign-up-with-scopes). +Thanks to a comunity contribution ([@\_mateomorris](https://twitter.com/_mateomorris) and [@Beamanator](https://twitter.com/Beamanator)), Supabase Auth now includes OAuth scopes. These allow you to request elevated access during login. For example, you may want to request access to a list of Repositories when users log in with GitHub. Check out the [Documentation](https://supabase.io/docs/reference/javascript/auth-signup#sign-up-with-scopes). -![Oauth Scope](/new/images/blog/march-2021/oauth-scopes.png) +![Oauth Scope](/images/blog/march-2021/oauth-scopes.png) ## Kaizen - You can now manage your PostgREST configuration inside the Dashboard. -- Our website has been redesigned. Check out our new [Homepage](https://supabase.io/) and [Blog](https://supabase.io/blog), and our new [Database](https://supabase.io/database), [Auth](https://supabase.io/auth), and [Storage](https://supabase.io/storage) product pages. +- Our website has been redesigned. Check out our new [Homepage](https://supabase.io/) and [Blog](https://supabase.io/blog), and our new [Database](https://supabase.io/database), [Auth](https://supabase.io/auth), and [Storage](https://supabase.io/storage) product pages. - We refactored some of our Filter methods to make them even easier to use. Check out the [Full Text Search](https://supabase.io/docs/reference/javascript/textsearch) refactor. - We have added several new sections to our Docs including: [Local Dev](https://supabase.io/docs/guides/local-development), [Self Hosting](https://supabase.io/docs/guides/self-hosting), and [Postgres Reference](https://supabase.io/docs/reference/postgres/getting-started) docs (all still under development). @@ -98,7 +97,7 @@ Thanks to a comunity contribution ([@_mateomorris](https://twitter.com/_mateomor - Svelte Integration by [Khaerunnisa Isnaeni](https://www.youtube.com/channel/UCqNDj6eQeTLHuEwgEHWOGjw) [[Video](https://www.youtube.com/watch?v=odPYzJJyEJI)] - An [example app](https://github.com/supabase/supabase/tree/master/examples/nextjs-ts-user-management) for adding User Profiles to your Next.js app -![Supabase Stars march 2021](/new/images/blog/march-2021/supabase-stars-march-2021.png) +![Supabase Stars march 2021](/images/blog/march-2021/supabase-stars-march-2021.png) Source: repository.surf/supabase @@ -112,7 +111,7 @@ Lets say for each new sign up, you want to trigger a slack alert, send them an e For this we are working on our own [Workflow engine](https://supabase.io/blog/2021/04/02/supabase-workflows), it will eventually have a Zapier-like interface inside the dashboard. For now it's a state-machine interpreter (fully compatible with Amazon States Language) written in Elixir, [open source](https://github.com/supabase/workflows), and ready for community contributions. -![Workflows](/new/images/blog/workflows/workflows-thumb.jpg) +![Workflows](/images/blog/workflows/workflows-thumb.jpg) ### Get started diff --git a/www/_blog/2021-05-03-supabase-beta-april-2021.mdx b/www/_blog/2021-05-03-supabase-beta-april-2021.mdx index 50462b4ce6a..bcd9dfd3cf4 100644 --- a/www/_blog/2021-05-03-supabase-beta-april-2021.mdx +++ b/www/_blog/2021-05-03-supabase-beta-april-2021.mdx @@ -12,7 +12,7 @@ tags: date: '2021-05-05' --- -This month was a "gardening" month for Supabase. The team focused on stability, security, and community support. +This month was a "gardening" month for Supabase. The team focused on stability, security, and community support. Check out what we were working on below, as well as some incredible Community contributions. ### Quick demo @@ -33,18 +33,17 @@ Watch a full demo: We're a developer tool, which means that Dark Mode is [extremely popular](https://twitter.com/supabase/status/1388131942919376904). -![This poll on twitter shows that 78.5% of our developer base use Dark Mode for the IDE](/new/images/blog/april-2021/twitter-darkmode.png) +![This poll on twitter shows that 78.5% of our developer base use Dark Mode for the IDE](/images/blog/april-2021/twitter-darkmode.png) -While Dark mode is great, for some people it's not an option. Dark Mode is difficult to use for developers with astigmatisms, +While Dark mode is great, for some people it's not an option. Dark Mode is difficult to use for developers with astigmatisms, or even just working in brightly-lit environments. So today we're shipping Light Mode. Access it in the settings of your [Dashboard](https://app.supabase.io). - ## Translations With the help of the community, we [started internationalizing](https://github.com/supabase/supabase/issues/1341) our main repository: @@ -69,60 +68,60 @@ With the help of the community, we [started internationalizing](https://github.c - [Turkish / Türkçe](https://github.com/supabase/supabase/blob/master/i18n/README.tr.md) - [Ukrainian / Українська](https://github.com/supabase/supabase/blob/master/i18n/README.uk.md) -![Map of the world](/new/images/blog/april-2021/map.png) +![Map of the world](/images/blog/april-2021/map.png) ## OpenAPI spec for Storage -We released [Storage Api docs](https://supabase.github.io/storage-api) built using OpenAPI (swagger). +We released [Storage Api docs](https://supabase.github.io/storage-api) built using OpenAPI (swagger). -![Storage API documentation](/new/images/blog/april-2021/storage-openapi.png) +![Storage API documentation](/images/blog/april-2021/storage-openapi.png) ## Stripe Sync Engine (Experimental) -We [open-sourced a server](https://github.com/supabase/stripe-sync-engine) which keeps any Postgres database in sync with Stripe. -This is experimental only. We're evaluating other tools such as [Singer](https://www.singer.io/tap/stripe/postgresql/), +We [open-sourced a server](https://github.com/supabase/stripe-sync-engine) which keeps any Postgres database in sync with Stripe. +This is experimental only. We're evaluating other tools such as [Singer](https://www.singer.io/tap/stripe/postgresql/), which provide a more general solution (but are less "realtime"), and we're opening it up here to gather feedback. -![Stripe sync engine](/new/images/blog/april-2021/stripe-sync-engine.jpg) +![Stripe sync engine](/images/blog/april-2021/stripe-sync-engine.jpg) ## Community spotlight: Threaded comments One of the most powerful Postgres features is "recursive CTEs" which can be used for nested items (comments, pages, friend-graphs). [@lawrencecchen](https://twitter.com/lawrencecchen) has built a full [Threaded Comments demo](https://github.com/lawrencecchen/threaded-comments) which you can [Deploy with a single click](https://github.com/lawrencecchen/threaded-comments#instant-deploy). Want to add comments to your blog with [Full Text Search](https://supabase.io/docs/reference/javascript/textsearch)? Just use Postgres. ## Community spotlight: SupaScript -It looks like [@burggraf2](https://twitter.com/burggraf2) got tired of waiting for us to ship Functions, and decided to -build a whole JS ecosystem within his Supabase database. If you want to write PG functions in JS, import remote libraries +It looks like [@burggraf2](https://twitter.com/burggraf2) got tired of waiting for us to ship Functions, and decided to +build a whole JS ecosystem within his Supabase database. If you want to write PG functions in JS, import remote libraries from the web, and console log to your browser, check out this [SupaScript repo](https://github.com/burggraf/SupaScript). ```js -// After installing: +// After installing: // https://github.com/burggraf/SupaScript#installation /** * Get all users who logged in this week. * Use in the database: select * from users_this_week(); * Use in the browser: supabase.rpc('users_this_week'); - */ + */ create or replace function users_this_week() returns json as $$ const moment = require('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.js', false); - + const lastWeek = moment().subtract(7, 'days'); const query = 'select * from auth.users where created_at > $1' const users = sql(query, lastWeek); - return users; + return users; $$ language plv8; ``` ## Community spotlight: Fireship -Fireship reviewed Supabase last week, and despite being a (self-proclaimed) Firebase fan-boy, the review was very impartial. +Fireship reviewed Supabase last week, and despite being a (self-proclaimed) Firebase fan-boy, the review was very impartial. - ## Community - Watch [@everConfusedGuy](https://twitter.com/everConfusedGuy)'s talk at DevX conf - Building Supabase Storage: [YouTube video](https://www.youtube.com/watch?v=YsUYOsq_o7g) - DuckDuckAbdaal by [@Nutlope](https://twitter.com/Nutlope) - a personalized search engine: [Twitter](https://twitter.com/Nutlope/status/1389082406477463557) - Supabase in 6 minutes by [Georges Duverger](https://www.youtube.com/channel/UCNERPJ-vs61KEsD_dRNWFIw): [YouTube video](https://www.youtube.com/watch?v=c8DNV9yl0mg) -- Build a SaaS Platform with Stripe by [@__dijonmusters:](https://twitter.com/_dijonmusters) [DEV blog](https://dev.to/dijonmusters/series/12346) +- Build a SaaS Platform with Stripe by [@\_\_dijonmusters:](https://twitter.com/_dijonmusters) [DEV blog](https://dev.to/dijonmusters/series/12346) - Supabase & Sveltekit by Svelte Mastery: [YouTube video](https://www.youtube.com/watch?v=j4AV2Liojk0) - Firebase vs. Supabase - Draftbit Office Hours: [YouTube Livestream](https://www.youtube.com/watch?v=9Yg6i_zCuiM) - **Supabase Github Star Growth** -- Our [main GitHub repo](https://github.com/supabase/supabase) grew 60% (by stars) and we saw a flood of new contributors. +- Our [main GitHub repo](https://github.com/supabase/supabase) grew 60% (by stars) and we saw a flood of new contributors. - Our [UI Library](https://github.com/supabase/ui) grew 175% - Our [Realtime Server](https://github.com/supabase/realtime) grew 39% after landing on the [front page of Hacker News](https://news.ycombinator.com/item?id=26968449). -![Stars from github](/new/images/blog/april-2021/stars-all.png) +![Stars from github](/images/blog/april-2021/stars-all.png) Source: repository.surf/supabase @@ -169,7 +166,7 @@ We're also working on our [Workflows engine](https://supabase.io/blog/2021/04/02 [We started hiring](https://supabase.io/docs/careers). -![screenshot of our hiring page](/new/images/blog/april-2021/hiring.png) +![screenshot of our hiring page](/images/blog/april-2021/hiring.png) ### Get started diff --git a/www/_blog/2021-06-02-supabase-beta-may-2021.mdx b/www/_blog/2021-06-02-supabase-beta-may-2021.mdx index fa7414c28e6..921e25c124a 100644 --- a/www/_blog/2021-06-02-supabase-beta-may-2021.mdx +++ b/www/_blog/2021-06-02-supabase-beta-may-2021.mdx @@ -1,6 +1,6 @@ --- title: Supabase Beta May 2021 -description: Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries. +description: Apple & Twitter Logins, Supabase Grid, Go & Swift Libraries. author: paul_copplestone author_url: https://github.com/kiwicopple author_image_url: https://github.com/kiwicopple.png @@ -30,55 +30,55 @@ Watch a full demo: ## Apple logins are now available -Did you know: if you ship an app to the App Store with any third-party logins, you're required to enable Apple logins as well? Now you can with Supabase Auth. +Did you know: if you ship an app to the App Store with any third-party logins, you're required to enable Apple logins as well? Now you can with Supabase Auth. -![Apple OAuth is now available in Supabase](/new/images/blog/2021-may/supabase-apple-login.png) +![Apple OAuth is now available in Supabase](/images/blog/2021-may/supabase-apple-login.png) ## Twitter logins are now available You can also use Twitter as an OAuth provider with Supabase Auth. Twitter has a very archaic OAuth implementation, so this one took awhile. -![Twitter OAuth is now available in Supabase](/new/images/blog/2021-may/supabase-twitter-login.png) +![Twitter OAuth is now available in Supabase](/images/blog/2021-may/supabase-twitter-login.png) ## New storage policy editor -We shipped a new Policy Editor for managing Row Level Security on your Storage. We provide some templates to simplify the process for new developers. +We shipped a new Policy Editor for managing Row Level Security on your Storage. We provide some templates to simplify the process for new developers. -![New Policy Editor](/new/images/blog/2021-may/storage-policies.png) +![New Policy Editor](/images/blog/2021-may/storage-policies.png) ## Supabase Grid We are still working on Open Sourcing our Dashboard, and took another step closer by publicly releasing a new [Supabase Grid](https://github.com/supabase/grid). It's not ready to use outside of the Supabase ecosystem, but over time we hope to make it usable with any Postgres Database. -![This is an image of the new Supabase Grid](/new/images/blog/2021-may/table-grid.png) +![This is an image of the new Supabase Grid](/images/blog/2021-may/table-grid.png) ## Japan (Tokyo) 🇯🇵 is now available as a region There are a huge number of Supabase developers in Japan and China, and at their request we've launched Tokyo as a region. -![Tokyo is now availabel as a region](/new/images/blog/2021-may/japan-region.png) +![Tokyo is now availabel as a region](/images/blog/2021-may/japan-region.png) ## Return data as CSV You can now [retrieve your data](https://supabase.io/docs/reference/javascript/select#return-data-as-csv) as Comma Separated Values. Thanks to [@andreivreja](https://github.com/andreivreja) for the [awesome PR](https://github.com/supabase/postgrest-js/pull/187). -![Download data as a CSV](/new/images/blog/2021-may/return-data-as-csv.png) +![Download data as a CSV](/images/blog/2021-may/return-data-as-csv.png) ## New Go Libraries The community started developing the Go libraries. [postgrest-go](https://github.com/supabase/postgrest-go) is completed, [@Yusuf_Papurcu](https://twitter.com/Yusuf_Papurcu) and [@muratmirgun](https://twitter.com/muratmirgun) are working on the remaining libraries. -![Supabase Go Libraries](/new/images/blog/2021-may/supabase-go-support.png) +![Supabase Go Libraries](/images/blog/2021-may/supabase-go-support.png) ## New Swift Libraries -The community started developing the Swift libraries too. [@satishbabariya](https://twitter.com/satishbabariya) is making huge progress on +The community started developing the Swift libraries too. [@satishbabariya](https://twitter.com/satishbabariya) is making huge progress on [`storage-swift`](https://github.com/supabase/storage-swift), [`gotrue-swift`](https://github.com/supabase/gotrue-swift), [`realtime-swift`](https://github.com/supabase/realtime-swift), and [`supabase-swift`](https://github.com/supabase/supabase-swift). -![Supabase Swift Libraries](/new/images/blog/2021-may/supabase-swift-support.png) +![Supabase Swift Libraries](/images/blog/2021-may/supabase-swift-support.png) ## Build in Public @@ -97,7 +97,6 @@ We started a weekly 1-hour live stream where we build in public. allowFullScreen > - ## Community - `@p_phiri` made his first OSS contribution, and documented it on YouTube. [Twitter](https://twitter.com/p_phiri/status/1397815806990372865?s=20). @@ -109,9 +108,9 @@ We started a weekly 1-hour live stream where we build in public. - `@JonoYeong` created a 6-minute overview of Supabase. [YouTube](https://www.youtube.com/watch?v=1F240hR7nHU). [Twitter](https://twitter.com/JonoYeong/status/1398451556723294208). - Everyone who has produced Supabase content is now receiving their [swag](https://twitter.com/coderinblack/status/1397042488586559490?s=20). Send a link to your blog, app, or video to swag@supabase.io along with your address and we'll make sure you're included in the next drop. -**Supabase Github Star Growth**  +**Supabase Github Star Growth** -![13223 stars on GitHub.](/new/images/blog/2021-may/supabase-stars-may-2021.png) +![13223 stars on GitHub.](/images/blog/2021-may/supabase-stars-may-2021.png) Source: repository.surf/supabase @@ -123,7 +122,6 @@ If you want to keep up to date, make sure you [subscribe to our YouTube channel] We're planning another Launch Week at the end of July. We'll probably have a quiet month of shipping this month so that we can get everything prepared for July. - ### Get started - Start using Supabase today: [app.supabase.io](https://app.supabase.io/) diff --git a/www/_blog/2021-07-01-roles-postgres-hooks.mdx b/www/_blog/2021-07-01-roles-postgres-hooks.mdx index 7852cbeafd4..2fb6fc50963 100644 --- a/www/_blog/2021-07-01-roles-postgres-hooks.mdx +++ b/www/_blog/2021-07-01-roles-postgres-hooks.mdx @@ -12,22 +12,22 @@ tags: date: '2021-07-02' --- -PostgreSQL manages permissions through roles. To create these roles, a database user needs the `CREATEROLE` privilege, +PostgreSQL manages permissions through roles. To create these roles, a database user needs the `CREATEROLE` privilege, which not only allows role creation but also _modification_ of any role (except superusers). At Supabase, we use dedicated roles for each of our customers' backend services. For instance, our [Storage API](https://supabase.io/storage)  -uses the `supabase_storage_admin` role for connecting to the database. Giving the `CREATEROLE` privilege to our customers would allow them to +uses the `supabase_storage_admin` role for connecting to the database. Giving the `CREATEROLE` privilege to our customers would allow them to drop this role and take their own Storage API down. -And yet, we want to give our customers the ability to manage roles the same as they do it in on-premises databases, +And yet, we want to give our customers the ability to manage roles the same as they do it in on-premises databases, with the usual `CREATE ROLE`, `ALTER ROLE`, and `DROP ROLE` statements. -So, how do we grant them the `CREATEROLE` privilege and, at the same time, protect our own roles? In this blog post, +So, how do we grant them the `CREATEROLE` privilege and, at the same time, protect our own roles? In this blog post, we explain how we managed to do this by using PostgreSQL Hooks in our [SupaUtils](https://github.com/supabase/supautils) extension. ## Reserved Roles -PostgreSQL has a list of [predefined roles](https://www.postgresql.org/docs/14/predefined-roles.html) — all prefixed +PostgreSQL has a list of [predefined roles](https://www.postgresql.org/docs/14/predefined-roles.html) — all prefixed with "pg\_" — that cannot be dropped or altered. Attempting to do so will throw an error mentioning that the role is "reserved". ```sql @@ -52,7 +52,7 @@ LOCATION: handle_rename, rdsutils.c:1534 Again, the error mentions that the role is "reserved". -Also note the `rdsutils.c` mention. That's not a stock Postgres source file. This means that the logic comes +Also note the `rdsutils.c` mention. That's not a stock Postgres source file. This means that the logic comes from an RDS extension. We can confirm this is the case by showing the preloaded libraries. ```sql @@ -63,19 +63,19 @@ show shared_preload_libraries; rdsutils,pg_stat_statements ``` -`rdsutils` can be seen there. Naturally this lead us into thinking we can achieve the same logic with an extension +`rdsutils` can be seen there. Naturally this lead us into thinking we can achieve the same logic with an extension of our own, and thus the SupaUtils idea was born. ## Extending PostgreSQL with Hooks -PostgreSQL hooks allow us to extend internal functionality. Hooks can modify behavior at different places, +PostgreSQL hooks allow us to extend internal functionality. Hooks can modify behavior at different places, including when running SQL statements. -For example, if we wanted to enforce our own password restrictions whenever a user changes passwords, we could -use the `check_password_hook` to verify the password. We would write out our own Custom Logic, and raise an error +For example, if we wanted to enforce our own password restrictions whenever a user changes passwords, we could +use the `check_password_hook` to verify the password. We would write out our own Custom Logic, and raise an error if the password fails the password requirements. -![This is an images of the lifecycle of a Postgres Hook.](/new/images/blog/postgres-hooks/hooks-postgres-alter-role.png) +![This is an images of the lifecycle of a Postgres Hook.](/images/blog/postgres-hooks/hooks-postgres-alter-role.png) For `SupaUtils`, we're particularly interested in the `ProcessUtility_hook`, which allows us to hook into **utility statements:** every statement except `select`, `insert`, `delete` or `update`. They include `alter role` and `drop role`, which are the statements we want to hook on. diff --git a/www/_blog/2021-07-02-supabase-beta-june-2021.mdx b/www/_blog/2021-07-02-supabase-beta-june-2021.mdx index 338568b530a..2470589d459 100644 --- a/www/_blog/2021-07-02-supabase-beta-june-2021.mdx +++ b/www/_blog/2021-07-02-supabase-beta-june-2021.mdx @@ -31,17 +31,17 @@ Watch a full demo of this month's releases ## Vercel integration -Vercel just released their new integrations, which means you can now deploy a Postgres database on Supabase directly from your Vercel account. +Vercel just released their new integrations, which means you can now deploy a Postgres database on Supabase directly from your Vercel account. Check it out! [vercel.com/integrations/supabase](https://vercel.com/integrations/supabase) -![Supabase Vercel Integration](/new/images/blog/2021-june/supabase-vercel.png) +![Supabase Vercel Integration](/images/blog/2021-june/supabase-vercel.png) ## Discord logins are now available -Building a community? There's almost no better tool than Discord (we're even trialling it ourselves). +Building a community? There's almost no better tool than Discord (we're even trialling it ourselves). If you're building a community product, Discord logins are the perfect option. -![Discord logins](/new/images/blog/2021-june/supabase-discord.png) +![Discord logins](/images/blog/2021-june/supabase-discord.png) ## New Guides @@ -49,59 +49,59 @@ We spent the month building up a new [Guides section](https://supabase.io/docs/g ### Postgres Full Text Search -Ever wanted to build a Search Engine? We just released a guide which shows you how to implement -[Full Text Search using Postgres](https://supabase.io/docs/guides/database/full-text-search). +Ever wanted to build a Search Engine? We just released a guide which shows you how to implement +[Full Text Search using Postgres](https://supabase.io/docs/guides/database/full-text-search). -![Postgres Full Text Search](/new/images/blog/2021-june/postgres-fts.png) +![Postgres Full Text Search](/images/blog/2021-june/postgres-fts.png) ### OAuth Guides -We released step-by-step guides to help you set up OAuth with -[Apple](https://supabase.io/docs/guides/auth/auth-apple), -[Bitbucket](https://supabase.io/docs/guides/auth/auth-bitbucket), -[Facebook](https://supabase.io/docs/guides/auth/auth-facebook), -[GitHub](https://supabase.io/docs/guides/auth/auth-github), -[GitLab](https://supabase.io/docs/guides/auth/auth-gitlab), -[Google](https://supabase.io/docs/guides/auth/auth-google), and -[Twitter](https://supabase.io/docs/guides/auth/auth-twitter). +We released step-by-step guides to help you set up OAuth with +[Apple](https://supabase.io/docs/guides/auth/auth-apple), +[Bitbucket](https://supabase.io/docs/guides/auth/auth-bitbucket), +[Facebook](https://supabase.io/docs/guides/auth/auth-facebook), +[GitHub](https://supabase.io/docs/guides/auth/auth-github), +[GitLab](https://supabase.io/docs/guides/auth/auth-gitlab), +[Google](https://supabase.io/docs/guides/auth/auth-google), and +[Twitter](https://supabase.io/docs/guides/auth/auth-twitter). -![Image of Apple's developer Portal](/new/images/blog/2021-june/apple-developer-portal.png) +![Image of Apple's developer Portal](/images/blog/2021-june/apple-developer-portal.png) ### Javascript + Postgres -Did you know that you can use Javascript inside your Postgres database? Here's how, with the +Did you know that you can use Javascript inside your Postgres database? Here's how, with the [`plv8` extension](https://supabase.io/docs/guides/database/extensions/plv8). -![Postgres and Javascript with plv8](/new/images/blog/2021-june/supabase-plv8.png) +![Postgres and Javascript with plv8](/images/blog/2021-june/supabase-plv8.png) ## Public Storage Buckets -Want to share all your favourite memes? Now it's even easier with Public Storage Buckets. Simply mark a bucket as +Want to share all your favourite memes? Now it's even easier with Public Storage Buckets. Simply mark a bucket as "Public" and the content will be accessible without a login. ## Storage upserts -Supabase Storage now supports `upsert`. Shoutout to [@ankitjena](https://github.com/ankitjena) for +Supabase Storage now supports `upsert`. Shoutout to [@ankitjena](https://github.com/ankitjena) for [this Pull Request](https://github.com/supabase/storage-api/pull/32). -![Storage now supports upserts](/new/images/blog/2021-june/supabase-storage-upsert.png) +![Storage now supports upserts](/images/blog/2021-june/supabase-storage-upsert.png) ## Server restarts -When things go wrong, sometime the best thing you can do is reboot. We released a restart button in the Dashboard, +When things go wrong, sometime the best thing you can do is reboot. We released a restart button in the Dashboard, the first of many debugging tools we'll be releasing over the next few months. -![You can now restart you Supabase servers](/new/images/blog/2021-june/server-restarts.png) +![You can now restart you Supabase servers](/images/blog/2021-june/server-restarts.png) ## Policy editor We added a new Table Policy Editor which makes Row Level Security even easier. We even included a few templates to get you started. -![New editor for Row Level Security](/new/images/blog/2021-june/policy-editor.png) +![New editor for Row Level Security](/images/blog/2021-june/policy-editor.png) ## Build in Public @@ -122,22 +122,21 @@ We run a weekly 1-hour live stream where we build in public. allowFullScreen > - ## Community - [@dabit3](https://twitter.com/dabit3) released a complete guide to Supabase on FreeCodeCamp. [Twitter](https://twitter.com/freeCodeCamp/status/1404469119525732357) | [Blog](https://www.freecodecamp.org/news/the-complete-guide-to-full-stack-development-with-supabas/) - [@raddevon](https://twitter.com/raddevon) built a social network using Supabase and Vue3. [Twitter](https://twitter.com/raddevon/status/1410401132845801479) | [YouTube](https://www.youtube.com/watch?v=x25a_q0vHUY) - [@JonoYeong](https://twitter.com/JonoYeong) built live with Supabase + SvelteKit. [Twitter](https://twitter.com/JonoYeong/status/1409960155093946368) | [Twitch](https://www.twitch.tv/videos/1066520882) -**Supabase Github Star Growth**  +**Supabase Github Star Growth** -![14200 stars on GitHub.](/new/images/blog/2021-june/github-june-2021.png) +![14200 stars on GitHub.](/images/blog/2021-june/github-june-2021.png) Source: repository.surf/supabase -If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/channel/UCNTVzV1InxHV-YR0fSajqPQ) or +If you want to keep up to date, make sure you [subscribe to our YouTube channel](https://www.youtube.com/channel/UCNTVzV1InxHV-YR0fSajqPQ) or [follow us on Twitter](https://twitter.com/supabase). ## External contributions @@ -145,23 +144,23 @@ If you want to keep up to date, make sure you [subscribe to our YouTube channel] ### PostgREST - Primarily for Prisma users, we patched PostgREST [openapi-mode](https://github.com/PostgREST/postgrest/pull/1881) to ignore anon privileges for the OpenAPI output. -Credit to [@steve-chavez](https://github.com/steve-chavez/). + Credit to [@steve-chavez](https://github.com/steve-chavez/). - We added better [PostgREST logging](https://github.com/PostgREST/postgrest/pull/1872) to include timestamps for every error -Credit to [@steve-chavez](https://github.com/steve-chavez/). + Credit to [@steve-chavez](https://github.com/steve-chavez/). ### Auth0 -- We fixed a XSS bug in the Auth0 Next.js library. [GitHub](https://github.com/auth0/nextjs-auth0/security/advisories/GHSA-954c-jjx6-cxv7) -Credit to [@inian](https://github.com/inian) and [Ishan Patel](https://github.com/git-ishanpatel) (a Supabase community member) +- We fixed a XSS bug in the Auth0 Next.js library. [GitHub](https://github.com/auth0/nextjs-auth0/security/advisories/GHSA-954c-jjx6-cxv7) + Credit to [@inian](https://github.com/inian) and [Ishan Patel](https://github.com/git-ishanpatel) (a Supabase community member) ## Coming Next -Launch Week!! Remember that time we did a [Launch Week](https://supabase.io/blog/2021/03/25/launch-week)? Well we're doing it again at the end of July. -Strap in, because we're shipping one thing every day for a week. +Launch Week!! Remember that time we did a [Launch Week](https://supabase.io/blog/2021/03/25/launch-week)? Well we're doing it again at the end of July. +Strap in, because we're shipping one thing every day for a week. Let's goooooo. -![Launch week coming up.](/new/images/blog/supabase-launch-week.png) +![Launch week coming up.](/images/blog/supabase-launch-week.png) ### Get started diff --git a/www/_blog/2021-07-22-supabase-launch-week-sql.mdx b/www/_blog/2021-07-22-supabase-launch-week-sql.mdx index 29867b8c8b1..41667921724 100644 --- a/www/_blog/2021-07-22-supabase-launch-week-sql.mdx +++ b/www/_blog/2021-07-22-supabase-launch-week-sql.mdx @@ -23,7 +23,7 @@ Just like last time, we don't want to spoil the surprise. So for now we'll give ## Monday 26 July: Community Day -![Supabase Community](/new/images/blog/launch-week-sql/community-day.png) +![Supabase Community](/images/blog/launch-week-sql/community-day.png) ### **When?** @@ -39,7 +39,7 @@ Read the [blog post](/blog/2021/07/26/supabase-community-day). ## Tuesday 27 July: Storage v2 -![Supabase storage v2](/new/images/blog/launch-week-sql/storage.png) +![Supabase storage v2](/images/blog/launch-week-sql/storage.png) ### **When?** @@ -55,7 +55,7 @@ Read the [blog post](/blog/2021/07/27/storage-beta). ## Wednesday 28 July: Auth v2 -![Supabase Auth v2](/new/images/blog/launch-week-sql/auth-v2.png) +![Supabase Auth v2](/images/blog/launch-week-sql/auth-v2.png) ### **When?** @@ -71,7 +71,7 @@ Read the [blog post](/blog/2021/07/28/supabase-auth-passwordless-sms-login). ## Thursday 29 July: Dashboard v2 -![Supabase Dashboards](/new/images/blog/launch-week-sql/dashboards.png) +![Supabase Dashboards](/images/blog/launch-week-sql/dashboards.png) ### **When?** @@ -87,7 +87,7 @@ Read the [blog post](/blog/2021/07/29/supabase-reports-and-metrics). ## Friday 30 July: One more thing -![Supabase prequels](/new/images/blog/launch-week-sql/prequel.png) +![Supabase prequels](/images/blog/launch-week-sql/prequel.png) ### **When?** @@ -101,8 +101,7 @@ We all know that the best [SeQueLs](https://www.reddit.com/r/SequelMemes/) are a Blog post coming soon. Follow our [Twitter](https://twitter.com/supabase) to get notified immediately. - -[^1]: -When we first announced, Storage was on Wednesday and Auth was on Tuesday. We switched the order of these as we are doing a -Storage [presentation](https://www.meetup.com/the-monthly-dev-world-class-talks-by-expert-developers/events/278158726/) with -[daily.dev](https://daily.dev/) on Wednesday. \ No newline at end of file +[^1]: + When we first announced, Storage was on Wednesday and Auth was on Tuesday. We switched the order of these as we are doing a + Storage [presentation](https://www.meetup.com/the-monthly-dev-world-class-talks-by-expert-developers/events/278158726/) with + [daily.dev](https://daily.dev/) on Wednesday. diff --git a/www/_blog/2021-07-26-epsilon3-self-hosting.mdx b/www/_blog/2021-07-26-epsilon3-self-hosting.mdx index dd8791f8844..f5005583c8f 100644 --- a/www/_blog/2021-07-26-epsilon3-self-hosting.mdx +++ b/www/_blog/2021-07-26-epsilon3-self-hosting.mdx @@ -13,37 +13,37 @@ date: '2021-07-26' toc_depth: 2 --- -Epsilon3 is a USA-based Y Combinator startup. They digitize paper-based procedures in the space industry using telemetry data, +Epsilon3 is a USA-based Y Combinator startup. They digitize paper-based procedures in the space industry using telemetry data, simplifying testing and operations. Their product is rapidly becoming the OS for space projects and complex operations. -Learn how the team at Epsilon3 uses Supabase to help teams execute secure and reliable operations in an industry where project +Learn how the team at Epsilon3 uses Supabase to help teams execute secure and reliable operations in an industry where project spend runs into the billions. ### Space Operations -Epsilon3's customers run testing and operational procedures in real-time. Epsilon3's solution allows online collaboration as a team, -instead of being siloed and separated which is an increasingly important requirement in a post-pandemic working world. +Epsilon3's customers run testing and operational procedures in real-time. Epsilon3's solution allows online collaboration as a team, +instead of being siloed and separated which is an increasingly important requirement in a post-pandemic working world. Epsilon3 is powering an industry where reliability is paramount. In the space industry, missions cost billions and need to run reliably. -![Epsilon3 digitizes paper-based processes.](/new/images/blog/epsilon3/epsilon3-product.gif) +![Epsilon3 digitizes paper-based processes.](/images/blog/epsilon3/epsilon3-product.gif) -Epsilon3's software saves operators time and reduces errors to improve complex operations. Their customers are using their software and -successfully sending satellites into space and are about to use Epsilon3's software for an operational Rocket Launch. As a result, their -reputation for improving the quality standard for complex operations has led to demand from other industries. The team is receiving -enquiries from clients in the robotics, logistics and medical equipment sectors who need a structured and standardized way of running +Epsilon3's software saves operators time and reduces errors to improve complex operations. Their customers are using their software and +successfully sending satellites into space and are about to use Epsilon3's software for an operational Rocket Launch. As a result, their +reputation for improving the quality standard for complex operations has led to demand from other industries. The team is receiving +enquiries from clients in the robotics, logistics and medical equipment sectors who need a structured and standardized way of running procedures and keeping audit trails. ## Moving fast in regulated markets As a startup, Epsilon3 needs to move fast and scale. They require security, reliability, and performance. -The team has a background in engineering from Northrop, Google, and SpaceX and understands the technical benefits Postgres offers as a +The team has a background in engineering from Northrop, Google, and SpaceX and understands the technical benefits Postgres offers as a battle-tested open-source relational database. Real-time functionality is also a key for their customers to see how running procedures are progressing as the changes occur. -The space industry is highly regulated, adding complexity. For example, in the USA, deployments must be in an ITAR-compliant way -(for instance AWS GovCloud supports ITAR compliance) while customers in countries outside the USA may need to host their data within their own +The space industry is highly regulated, adding complexity. For example, in the USA, deployments must be in an ITAR-compliant way +(for instance AWS GovCloud supports ITAR compliance) while customers in countries outside the USA may need to host their data within their own country. These customer requirements mean Epsilon3 must be able to offer flexible hosting options, including on-premises deployment. +

- As soon as I saw Supabase I knew it was the perfect technology to use alongside Flutter to build apps faster than ever. - For apps like Spot where we handle user submitted files, it is very easy to manage them securely. + As soon as I saw Supabase I knew it was the perfect technology to use alongside Flutter to build + apps faster than ever. For apps like Spot where we handle user submitted files, it is very easy + to manage them securely.

Supabaseを最初発見した時にこれとFlutterを組み合わせれば今まで以上に爆速でアプリ開発ができるだろうと思いました。 @@ -81,14 +78,13 @@ Postgres, and his data structure will enable future development.

- ## Spot is Open Source -With Supabase, Tyler can use Flutter to build a performant app quickly at a low cost. Tyler is now a massive fan of the Supabase -experience and has even joined the SupaSquad. +With Supabase, Tyler can use Flutter to build a performant app quickly at a low cost. Tyler is now a massive fan of the Supabase +experience and has even joined the SupaSquad. -You can download and install spot for [iOS](https://apps.apple.com/us/app/spot-videos/id1564675926?utm_source=supabase&utm_campaign=static) -and [Android](https://play.google.com/store/apps/details?id=app.spotvideo&utm_source=supabase&utm_campaign=static) -to see just how snappy his setup is. -Tyler has fully open-sourced his example - you can [clone the repo](https://github.com/dshukertjr/spot) +You can download and install spot for [iOS](https://apps.apple.com/us/app/spot-videos/id1564675926?utm_source=supabase&utm_campaign=static) +and [Android](https://play.google.com/store/apps/details?id=app.spotvideo&utm_source=supabase&utm_campaign=static) +to see just how snappy his setup is. +Tyler has fully open-sourced his example - you can [clone the repo](https://github.com/dshukertjr/spot) and use it as the basis of your next big idea. diff --git a/www/_blog/2021-07-27-storage-beta.mdx b/www/_blog/2021-07-27-storage-beta.mdx index b16631a2891..59a69752a9c 100644 --- a/www/_blog/2021-07-27-storage-beta.mdx +++ b/www/_blog/2021-07-27-storage-beta.mdx @@ -21,7 +21,7 @@ Clients can use the `Content-Range` HTTP header to request specific parts of a f ## Directory uploads @@ -50,7 +50,7 @@ You can now upload an entire directory to Supabase Storage and the directory str