From 7403b17ea1068e70752cfd2c0c566080cc3f6e3c Mon Sep 17 00:00:00 2001 From: Oliver Bryan <04oliverbryan@gmail.com> Date: Sun, 26 Oct 2025 15:49:40 +0000 Subject: [PATCH] barebones good morning project entry --- public/good-morning-icon.svg | Bin 0 -> 10172 bytes src/pages/projects/good-morning.astro | 74 ++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 public/good-morning-icon.svg create mode 100644 src/pages/projects/good-morning.astro diff --git a/public/good-morning-icon.svg b/public/good-morning-icon.svg new file mode 100644 index 0000000000000000000000000000000000000000..15585b23337d2a29a0c561efec89563fedac4f92 GIT binary patch literal 10172 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 literal 0 HcmV?d00001 diff --git a/src/pages/projects/good-morning.astro b/src/pages/projects/good-morning.astro new file mode 100644 index 00000000..25855568 --- /dev/null +++ b/src/pages/projects/good-morning.astro @@ -0,0 +1,74 @@ +--- +import ProjectPage from "../../components/ProjectPage.astro"; +import Demo from "../../components/Demo.astro"; + +export const metadata = { + title: "good morning!", + description: + "An app for couples or friends to share daily notices with songs and photos", + date: "October 2025", + slug: "good-morning", + image: "/good-morning-icon.svg", + github: "https://github.com/hex248/good-morning", + hidden: true, + tags: [ + "Web", + "React", + "TypeScript", + "Go", + "PostgreSQL", + "AWS S3", + "Databases", + "OAuth2", + "Spotify API", + "Web", + ], + type: "personal", +}; +--- + + +

+ "good morning!" is a web app I built to help couples or friends share + daily notices, songs, and photos with each other. It features a simple + and intuitive interface for sending and receiving messages, along with + support for photo attachments. The app is built with React and + TypeScript on the frontend, and Go with PostgreSQL on the backend. Media + files are stored securely using Cloudflare R2 (AWS S3). +

+ +
+
+

Key features

+
    +
  • Create daily notices with photos and Spotify songs
  • +
  • Simple user interface
  • +
  • Google OAuth2 authentication for user accounts
  • +
+
+ +
+

Technologies

+
    +
  • React
  • +
  • TypeScript
  • +
  • Go
  • +
  • PostgreSQL
  • +
  • Cloudflare R2 (AWS S3)
  • +
  • Spotify API
  • +
  • OAuth2 Authentication
  • +
  • Progressive Web App (PWA)
  • +
+
+
+ +
+

Demo

+
+ + + + +
+
+