diff --git a/backend/common/config.py b/backend/common/config.py index 82858ba..dee7851 100644 --- a/backend/common/config.py +++ b/backend/common/config.py @@ -22,9 +22,9 @@ # EMAIL Stuff NO_REPLY_EMAIL = "No Reply " -SENDER_EMAIL = "Dumpsheet Workers Union" # From: +SENDER_EMAIL = "GPT Workers Union" # From: SENDER_EMAIL_ALERTS = "Poor Mans Opsgenie " # From: -SUPPORT_EMAIL = "Dumpsheet Support " +SUPPORT_EMAIL = "Audio To Email Support " DEBUG_RECIPIENTS = [] # used to be a google group RESPONSE_EMAILS_WAIT_BETWEEN_EMAILS_SECONDS = int( os.environ.get("RESPONSE_EMAILS_WAIT_BETWEEN_EMAILS_SECONDS", 30) diff --git a/backend/database/account.py b/backend/database/account.py index ceb2822..df6502b 100644 --- a/backend/database/account.py +++ b/backend/database/account.py @@ -94,31 +94,6 @@ def get_phone(self) -> Optional[str]: return None - # @staticmethod - # # TODO(P2): This feels like a too dangerous function to have around - # def merge_in(new_account_id, old_account_id): - # new_account = BaseAccount.get_or_none(BaseAccount.id == new_account_id) - # if new_account is None: - # raise ValueError(f"new_account_id {new_account_id} must exist") - # - # old_account = BaseAccount.get_or_none(BaseAccount.id == old_account_id) - # if old_account is None: - # raise ValueError(f"old_account_id {old_account_id} must exist") - # - # with database_proxy.transaction() as tx: - # print(f"merging {old_account_id} into {new_account_id}") - # num_onb = BaseOnboarding.update(account_id=new_account_id).where( - # BaseOnboarding.account_id == old_account_id).execute() - # num_de = BaseDataEntry.update(account_id=new_account_id).where( - # BaseDataEntry.account_id == old_account_id).execute() - # num_el = BaseEmailLog.update(account_id=new_account_id).where( - # BaseEmailLog.account_id == old_account_id).execute() - # tx.commit() - # - # assert BaseOnboarding.get_or_none(BaseOnboarding.account_id == old_account_id) is None - # # old_account.delete_instance() - # print(f"Account.merge_in updated {num_onb} onboardings, {num_de} data entries and {num_el} email logs") - @staticmethod def get_by_email_or_none(email_raw: str) -> Optional["Account"]: email = email_raw.lower() diff --git a/webapp/app/page.tsx b/webapp/app/page.tsx index f0c1865..c297591 100644 --- a/webapp/app/page.tsx +++ b/webapp/app/page.tsx @@ -1,9 +1,7 @@ -import { createServerComponentClient } from "@supabase/auth-helpers-nextjs"; -import { cookies } from "next/headers"; import Link from "next/link"; -import { redirect } from "next/navigation"; -import hero from "/public/dumpsheet-agent.webp"; +// import hero from "/public/dumpsheet-agent.webp"; +import hero from "/public/images/evolution-trend-reverted-home-erectus-is-back.jpg" import { Button } from "@/components/ui/button"; import ExplainerSection from "@/components/ExplainerSection"; @@ -14,54 +12,102 @@ export const dynamic = "force-dynamic"; export default async function Index() { return (
-
-
-

- Email, Effortlessly with Your Voice. -

-

- Transform your spoken words into written emails instantly with Audio To Email. - Perfect for professionals on the go, accessibility needs, or anyone looking to streamline their workflow. -

-
-
- - - +
+
+

+ GPT like it's the 90s. +

+

+ No apps, just email.
+ No scam subscriptions, just invoices.
+ This is Audio To Email.
+

+
+
+ + + +
+
+
+
+ Join hundreds who are redefining email productivity. + + Just like in the good old days of calling your assistant + to transcribe your brain farts of gold for you. +
+
+
+ Already a user? + + Sign In + +
-
- Join thousands who are redefining email productivity. Fast, accurate, and secure. +
+ Voice to Email Conversion Illustration
-
-
- Already a user? - - Sign In - -
+
-
- Voice to Email Conversion Illustration + + + +
+

Still not convinced?

+

+ + + + +

+

+ {/*TODO(P1, ux): Figure out how to start the voice recorder in the Demo mode */} + + + +

-
- - +
+

You In A Good Club

- +
+ Robinhood + Columbia University + Google + IBM + McKinsey and Company + Siemens +
+
+ + +
+

We Are Here To Support You

+ +
+
+ + + + + + +
+
+
- ); -} + ); + } diff --git a/webapp/components/ExplainerSection.tsx b/webapp/components/ExplainerSection.tsx index 6d41c68..6791f47 100644 --- a/webapp/components/ExplainerSection.tsx +++ b/webapp/components/ExplainerSection.tsx @@ -16,10 +16,10 @@ export default function ExplainerSection() { className="text-3xl font-bold text-blue-600 bg-white border-2 border-blue-600 rounded-full w-10 h-10 flex items-center justify-center"> 1
-

Upload or Record your Audio

+

Upload your Audio/Video

- Any audio file would do, or you can record one right here!. + Any audio like a voice memo would do, or you can record one right here!.

{/* TODO(P0, ux): Explain the "just send an email" upload version @@ -30,12 +30,6 @@ export default function ExplainerSection() { alt="Audio file upload example" className="rounded-lg object-cover w-3/4 md:w-1/2 lg:w-1/3 mx-auto" /> -

- {/*TODO(P1, ux): Figure out how to start the voice recorder in the Demo mode */} - - - -

{/* Step 2: Backend Work */} @@ -48,7 +42,7 @@ export default function ExplainerSection() {

Our Agents get to Work

- Only takes a few minutes as you grab your drink of choice on your way to your desk. + And forget about it, while we transcribe and post-process your audio.

Your Voice Memo in your Mailbox

- Audio text ready for its next destination when you ready to do so! + Oh look, what is in your inbox? Waiting for you when you are ready to "do your emails".

{ + return ( + + Soon + + ); +}; + + export default async function Navbar() { const supabase = createServerComponentClient({ cookies }); @@ -36,21 +45,38 @@ export default async function Navbar() {
-

Audio To Email

+

GPT Like a Boomer

+ + + - + - + - - + {/**/} + {/* */} + {/**/} + + + + {/**/} + {/* */} + {/**/} + + + + + + +
{user && ( -
- {stripeIsConfigured && ( +
+ {stripeIsConfigured && ( @@ -60,7 +86,7 @@ export default async function Navbar() {
{!user && ( - + )} {user && ( diff --git a/webapp/components/PricingSection.tsx b/webapp/components/PricingSection.tsx index a015c65..1cadb06 100644 --- a/webapp/components/PricingSection.tsx +++ b/webapp/components/PricingSection.tsx @@ -3,7 +3,7 @@ import { Button } from "@/components/ui/button"; export default function PricingSection() { return ( -
+

Pricing

{pricingOptions.map((option, index) => ( @@ -48,7 +48,7 @@ const pricingOptions = [ title: "Goodwill", price: "Free", description: - "I am busy lets do it", + "I am busy just give me your free sample", features: [ "~15min of audio per day", "No Account Needed", @@ -60,8 +60,8 @@ const pricingOptions = [ bgColor: "bg-white", }, { - title: "Pay as you go", - price: "3x of our compute cost", + title: "Invoice", + price: "2x of our compute cost", description: "This is how much $1 gets you:", features: [ @@ -76,7 +76,7 @@ const pricingOptions = [ { title: "Enterprise", price: "Lets Negotiate", - description: "The best value for \"high volumes\" (pun intended).", + description: "The best value for \"high volumes\" (pun intended - we can handle your yelling!).", features: [ "Lower cost for bulk purchases", ], diff --git a/webapp/public/images/evolution-trend-reverted-home-erectus-is-back.jpg b/webapp/public/images/evolution-trend-reverted-home-erectus-is-back.jpg new file mode 100644 index 0000000..efab3a5 Binary files /dev/null and b/webapp/public/images/evolution-trend-reverted-home-erectus-is-back.jpg differ diff --git a/webapp/styles/app.css b/webapp/styles/app.css index 1711386..dd8387e 100644 --- a/webapp/styles/app.css +++ b/webapp/styles/app.css @@ -613,6 +613,14 @@ video { inset: 0px; } +.-left-3 { + left: -0.75rem; +} + +.-top-2 { + top: -0.5rem; +} + .left-1\/2 { left: 50%; } @@ -685,6 +693,11 @@ video { margin-bottom: 0.25rem; } +.mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} + .mb-16 { margin-bottom: 4rem; } @@ -749,6 +762,10 @@ video { margin-top: 2rem; } +.mb-6 { + margin-bottom: 1.5rem; +} + .block { display: block; } @@ -841,6 +858,10 @@ video { height: 1px; } +.h-16 { + height: 4rem; +} + .max-h-screen { max-height: 100vh; } @@ -1096,6 +1117,12 @@ video { margin-bottom: calc(2rem * var(--tw-space-y-reverse)); } +.space-x-8 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(2rem * var(--tw-space-x-reverse)); + margin-left: calc(2rem * calc(1 - var(--tw-space-x-reverse))); +} + .self-center { align-self: center; } @@ -1248,6 +1275,11 @@ video { background-color: rgb(209 213 219 / var(--tw-bg-opacity)); } +.bg-gray-500 { + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity)); +} + .bg-green-500 { --tw-bg-opacity: 1; background-color: rgb(34 197 94 / var(--tw-bg-opacity)); @@ -1422,10 +1454,6 @@ video { padding-right: 0.5rem; } -.pr-4 { - padding-right: 1rem; -} - .pr-6 { padding-right: 1.5rem; }