diff --git a/.github/assets/images/banner.png b/.github/assets/images/banner.png new file mode 100644 index 000000000..81a92fa91 Binary files /dev/null and b/.github/assets/images/banner.png differ diff --git a/.github/assets/images/hero.jpg b/.github/assets/images/hero.jpg deleted file mode 100644 index e23d53dd5..000000000 Binary files a/.github/assets/images/hero.jpg and /dev/null differ diff --git a/.github/assets/images/logo.svg b/.github/assets/images/logo.svg deleted file mode 100644 index 88576ad18..000000000 --- a/.github/assets/images/logo.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/CLAUDE.md b/CLAUDE.md index 3fb0153f8..f7ed1532f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -13,6 +13,14 @@ Monorepo for Timeful, a group availability/scheduling app. Internal identifiers (Go module `schej.it/server`, Mongo DB `schej-it`, prod email "Schej.it") still use the old name โ€” leave them alone unless rebranding is the explicit task. +## Branding (2bz2fill fork) + +- User-visible name is **2bz2fill**; it is a fork of Timeful and keeps a "Based on Timeful" credit plus a source-code link in the footer (AGPL ยง13). +- No domain yet: the server's public address comes from `BASE_URL` (placeholder `https://2bz2fill.example`); the sign-in email sender from `EMAIL_FROM`. Frontend links to the site use `window.location.origin`, never a hard-coded domain. +- Never point users or data at Timeful-owned services: their analytics (PostHog host, GTM container), PayPal, feedback form, Discord/Reddit/X, blog, or `betterwhen2meet.com`. Analytics are opt-in via `VUE_APP_POSTHOG_API_KEY` / `VUE_APP_GTM_ID`. +- `PrivacyPolicy.vue` is written from what the code actually stores and sends. When a change adds data collection, a third party, analytics or emails, update the policy in the same change. +- The logo is drawn in code (`BrandMark.vue` + DM Sans wordmark in `Logo.vue`); `public/favicon.svg` must match `BrandMark.vue`. + ## Common commands ### Frontend (`cd frontend`) diff --git a/README.md b/README.md index ceaf17a7f..4a28c26b1 100644 --- a/README.md +++ b/README.md @@ -1,51 +1,63 @@ -
- -Timeful logo +2bz2fill: too busy to fill out the grid? Let your calendar do it. -
-
[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-orange.svg)](https://www.gnu.org/licenses/agpl-3.0) -[![Donate](https://img.shields.io/badge/-Donate%20with%20Paypal-blue?logo=paypal)](https://www.paypal.com/donate/?hosted_button_id=KWCH6LGJCP6E6) -[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/timeful_app?label=%40timeful_app&labelColor=white)](https://x.com/timeful_app) -[![Discord](https://img.shields.io/badge/-Join%20Discord-7289DA?logo=discord&logoColor=white)](https://discord.gg/v6raNqYxx3) -[![Subreddit subscribers](https://img.shields.io/reddit/subreddit-subscribers/schej?label=join%20r%2Fschej)](https://www.reddit.com/r/schej/)
-Timeful hero +**2bz2fill** is a group availability poll for people who are too busy to fill out a long +When2meet-style grid. Every feature is judged by one question: does it make responding take less +effort? + +It is a fork of [Timeful](https://github.com/schej-it/timeful.app) (formerly Schej), an open-source +scheduling app by Jonathan Liu and contributors. Thank you to them: the poll grid, calendar +integrations, time zone handling and most of the code here are theirs. -Timeful is a scheduling platform helps you find the best time for a group to meet. It is a free availability poll that is easy to use and integrates with your calendar. +Built with [Vue 2](https://github.com/vuejs/vue), [MongoDB](https://github.com/mongodb/mongo), +[Go](https://github.com/golang/go), and [TailwindCSS](https://github.com/tailwindlabs/tailwindcss). -Hosted version of the site: https://timeful.app +## How it differs from Timeful -Built with [Vue 2](https://github.com/vuejs/vue), [MongoDB](https://github.com/mongodb/mongo), [Go](https://github.com/golang/go), and [TailwindCSS](https://github.com/tailwindlabs/tailwindcss) +Timeful is a general scheduling poll. 2bz2fill keeps its features and focuses on cutting the work +of responding. Planned, in order: -## Demo +1. Upload an `.ics` file to fill the grid from any calendar app, with no account or sign-in. +2. Save "my usual week" once and have every new poll arrive pre-filled from it. +3. Fast manual tools: mark busy times instead of free ones, fill or clear a whole day, copy a day, + reuse your last response. +4. Pre-filled responses you only need to check and confirm. +5. A grid that works well on a phone. -[![demo video](http://markdown-videos-api.jorgenkh.no/youtube/vFkBC8BrkOk)](https://www.youtube.com/watch?v=vFkBC8BrkOk) +The Timeful-specific parts (their branding, blog, socials, analytics, donation links and the +When2meet converter, which runs on Timeful's own servers) have been removed. -## Features +## Features inherited from Timeful - See when everybody's availability overlaps -- Easily specify date + time ranges to meet between -- Google calendar, Outlook, Apple calendar integration +- Date and time ranges, or days of the week +- Autofill from Google Calendar, Outlook, Apple Calendar or an ICS feed URL - "Available" vs. "If needed" times -- Determine when a subset of people are available -- Schedule across different time zones -- Email notifications + reminders -- Duplicating polls -- Availability groups - stay up to date with people's real-time calendar availability -- Export availability as CSV -- Only show responses to event creator +- See when a subset of people are available +- Time zone support +- Email notifications and reminders +- Duplicating polls, availability groups, CSV export +- Only show responses to the event creator +- Import a poll (with its responses) from a 2bz2fill or Timeful link ## Plugin API -Read these docs to design your own browser plugins to get + set availability on Timeful events programmatically! - -[Plugin API Docs](./PLUGIN_API_README.md) +Browser plugins can get and set availability on a poll programmatically. See the +[Plugin API docs](./PLUGIN_API_README.md). ## Self-hosting -See the [Deployment Guide](./DEPLOYMENT.md) for Docker Compose and NixOS setup instructions. +See the [Deployment Guide](./DEPLOYMENT.md) for Docker Compose and NixOS setup. Set `BASE_URL` in +`server/.env` to the site's public address; until it is set, emails link to the placeholder +`https://2bz2fill.example`. Analytics are off unless you set your own PostHog key or Google Tag +Manager ID in `frontend/.env` (see `frontend/.env.template`). + +## License + +[GNU AGPL v3](./LICENSE), the same as Timeful. If you run a modified copy as a public website, you +must offer its source code to your users; the site footer links to this repository for that reason. diff --git a/frontend/.env.template b/frontend/.env.template index 56ded3388..0b497dab4 100644 --- a/frontend/.env.template +++ b/frontend/.env.template @@ -1 +1,7 @@ -VUE_APP_POSTHOG_API_KEY=? \ No newline at end of file +# Google OAuth client ID (same value as CLIENT_ID in server/.env). Required for Google sign-in. +VUE_APP_GOOGLE_CLIENT_ID= +VUE_APP_POSTHOG_API_KEY= +# Optional. Defaults to PostHog Cloud (US). +VUE_APP_POSTHOG_HOST= +# Optional Google Tag Manager container ID, e.g. GTM-XXXXXXX +VUE_APP_GTM_ID= diff --git a/frontend/public/favicon-16x16.png b/frontend/public/favicon-16x16.png index 722f50ef1..69bc3da1d 100644 Binary files a/frontend/public/favicon-16x16.png and b/frontend/public/favicon-16x16.png differ diff --git a/frontend/public/favicon-32x32.png b/frontend/public/favicon-32x32.png index e11db3d3d..825cdc28b 100644 Binary files a/frontend/public/favicon-32x32.png and b/frontend/public/favicon-32x32.png differ diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico index f69846399..5d4ff3707 100644 Binary files a/frontend/public/favicon.ico and b/frontend/public/favicon.ico differ diff --git a/frontend/public/favicon.svg b/frontend/public/favicon.svg new file mode 100644 index 000000000..37116a7b3 --- /dev/null +++ b/frontend/public/favicon.svg @@ -0,0 +1 @@ + diff --git a/frontend/public/img/ogImage.png b/frontend/public/img/ogImage.png index 00f459a69..81a92fa91 100644 Binary files a/frontend/public/img/ogImage.png and b/frontend/public/img/ogImage.png differ diff --git a/frontend/public/img/when2meetOgImage2.png b/frontend/public/img/when2meetOgImage2.png deleted file mode 100644 index 2041349a1..000000000 Binary files a/frontend/public/img/when2meetOgImage2.png and /dev/null differ diff --git a/frontend/public/index.html b/frontend/public/index.html index 19d37d756..8dd0b5ea5 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -1,25 +1,11 @@ - - - - - + + @@ -27,16 +13,10 @@
- {{ $defaultTitle := "Timeful - Find a time to meet" }} - {{ $defaultDescription := "Timeful helps you find the best time for a group to meet. It is a free availability poll that is easy to use and integrates with your calendar." }} + {{ $defaultTitle := "2bz2fill - Find a time to meet" }} + {{ $defaultDescription := "2bz2fill is a group availability poll for people too busy to fill out a long grid. Autofill your availability from your calendar, check it, and you're done." }} {{ $defaultOgImage := "/img/ogImage.png" }}
- {{ or .title $defaultTitle }} - - -