Skip to content

Commit

Permalink
chore: Release v0.2.2-beta.0 (#1644)
Browse files Browse the repository at this point in the history
  • Loading branch information
Innei authored Nov 18, 2024
2 parents 17e1cf8 + 3ba9093 commit f205d9b
Show file tree
Hide file tree
Showing 90 changed files with 1,312 additions and 974 deletions.
26 changes: 25 additions & 1 deletion CHANGELOG.md

Large diffs are not rendered by default.

98 changes: 45 additions & 53 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,7 @@
</a>

<h3>Follow</h3>

<p>
Next generation information browser.
<br />
<br />
<a href="https://discord.gg/followapp">Discord</a>
·
<a href="https://x.com/intent/follow?screen_name=follow_app_">Twitter</a>
Expand All @@ -22,78 +18,74 @@
</p>
</div>

## Introduction
![](https://github.com/user-attachments/assets/80cc7a6d-5044-44a5-ae00-2a29b7e936a2)

As they say, your thoughts are what you read—and we’ve been consuming noisy feeds for too long! Follow organizes content into one timeline, keeping you updated on what matters, noise-free. Share lists, explore collections, and enjoy distraction-free browsing.

## 👋🏻 Getting Started & Join Our Community

Whether for users or professional developers, Follow will be your open information playground. Please be aware that Follow is currently under active development, and feedback is welcome for any [issue](https://github.com/RSSNext/Follow/issues) encountered.

Welcome to Follow! This software is all about allowing you to follow your favorite websites, blogs, social media accounts, podcasts and notifications in one place. It is designed as a modern, fast, and convenient all-in-one information center.
Feel free to try it using the following methods:

AI: Follow leverages advanced AI to assist your operations. Beyond basic AI translation, summarization, and recommendations, it provides twice-daily AI reports to highlight key information from your subscriptions. Additionally, it offers a personalized AI knowledge base built from your subscriptions.
| [![](https://img.shields.io/badge/Try%20Web%20App-Online-55b467?labelColor=black&logo=vercel&style=flat-square)](https://app.follow.is) | No installation necessary! Visit our web app to experience it firsthand. |
| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------- |
| [![](https://img.shields.io/github/v/release/RSSNext/Follow?color=369eff&labelColor=black&logo=github&style=flat-square&label=Releases)](https://github.com/RSSNext/Follow/releases/latest) | Download and install the desktop client for a smoother experience and enhanced features. |

Blockchain: Follow uses blockchain technology as an incentive mechanism for active users and outstanding creators. Users can obtain more services and benefits by holding and using Power Token. Creators can obtain more rewards by providing high-quality content and services.
You can also install using the following methods maintained by our community:

Social: Follow is also a social platform that allows you to follow other users, share your subscriptions, and discover new content. It also offers a subscription list synchronization feature, enabling your friends to sync with your subscriptions.
- If you are using Arch Linux, you can install package [follow-appimage](https://aur.archlinux.org/packages/follow-appimage) that maintained by [timochan](https://github.com/ttimochan).
- If you are using Nix, you can install package [follow](https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/fo/follow/package.nix) that maintained by [iosmanthus](https://github.com/iosmanthus).
- If you are using macOS with [Homebrew](https://brew.sh), you can install cask [follow](https://formulae.brew.sh/cask/follow) (also [@alpha](https://formulae.brew.sh/cask/follow@alpha) and [@nightly](https://formulae.brew.sh/cask/follow@nightly)) that maintained by [realSunyz](https://github.com/realSunyz).

Supported Platforms: Follow Desktop for Windows, macOS, Linux, and Browser; Follow Mobile for Android and iOS (coming soon).
| [![Discord](https://img.shields.io/discord/1243823539426033696?color=5865F2&label=Discord&labelColor=black&logo=discord&logoColor=white&style=flat-square)](https://discord.gg/followapp) | Join our Discord server to connect with developers, request features, and receive support. |
| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :----------------------------------------------------------------------------------------- |
| [![](https://img.shields.io/badge/any_text-Follow-blue?color=2CA5E0&label=_&logo=x&labelColor=black&style=flat-square)](https://x.com/intent/follow?screen_name=follow_app_) | Follow us on X/Twitter for product updates and to join in on reward activities. |

## Screenshots
> \[!IMPORTANT]
>
> **Star Us**, You will receive all release notifications from GitHub without any delay \~
The project is currently under active development. The following screenshots are for reference only and may differ from the final release version.
<a href="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats?repo_id=783512367" target="_blank" style="display: block" align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=783512367&image_size=auto&color_scheme=dark" width="655" height="auto">
<img alt="Performance Stats of RSSNext/Follow - Last 28 days" src="https://next.ossinsight.io/widgets/official/compose-last-28-days-stats/thumbnail.png?repo_id=783512367&image_size=auto&color_scheme=light" width="655" height="auto">
</picture>
</a>

- Use different views for various types of content to offer an experience equal to or better than the original platform - Articles, Social Media, Pictures, Videos, Podcasts, and Notifications
![Screenshot 2024-09-10 at 6 22 18 PM](https://github.com/user-attachments/assets/1958ec70-1916-47c5-82d0-3bd8e43f3a26)
![Screenshot 2024-09-10 at 6 22 47 PM](https://github.com/user-attachments/assets/1d0c3ed7-3da5-45e6-a264-399e8ea4071b)
![Screenshot 2024-09-10 at 6 23 07 PM](https://github.com/user-attachments/assets/d21d54be-c343-4ac6-99f0-90c1e410245a)
![Screenshot 2024-09-10 at 6 23 31 PM](https://github.com/user-attachments/assets/1781f368-8375-4b50-a66c-c8d8340f3ffb)
![Screenshot 2024-09-10 at 6 23 47 PM](https://github.com/user-attachments/assets/6ccfeada-dbc3-4c76-8ca2-5dcac8c06804)
![Screenshot 2024-09-10 at 6 24 11 PM](https://github.com/user-attachments/assets/f723d62a-1be7-48b1-a42c-83960af133be)
## ✨ Features

- Everything is RSSible. Our [RSSHub](https://github.com/DIYgod/RSSHub) community, comprising over 1,000 developers, has spent six years adapting nearly a thousand websites to provide almost all the content you need. This includes platforms like X (Twitter), Instagram, PlayStation, Spotify, Telegram, YouTube, and more. You can also write your own scripts to adapt additional websites.
![Screenshot 2024-09-10 at 8 09 36 PM](https://github.com/user-attachments/assets/5bd445f3-e005-4273-b892-7b29212970e2)
![Screenshot 2024-09-10 at 8 10 01 PM](https://github.com/user-attachments/assets/25fbc9d2-ea10-4477-a4e9-1732f59fcb57)
### Customized Information Hub

- Actions and AI features. Follow leverages advanced AI to assist your operations. Beyond basic AI translation, summarization, and recommendations, it provides twice-daily AI reports to highlight key information from your subscriptions. Additionally, it offers a personalized AI knowledge base built from your subscriptions.
Subscribe to a vast range of feeds and curated lists. Curate your favorites and keep track of what matters most to you.

![Screenshot 2024-09-10 at 9 44 23 PM](https://github.com/user-attachments/assets/1801f1ba-e57f-4daf-8120-32631b0bdc2c)
![Screenshot 2024-09-10 at 6 25 27 PM](https://github.com/user-attachments/assets/ddd14398-f735-433c-91cb-a2898ddf2098)
![](https://github.com/user-attachments/assets/11dc7d21-f5d8-4e41-9269-24fc352aa02b)

- Blockchain features and $Power token. Follow uses blockchain technology as an incentive mechanism for active users and outstanding creators. Users can obtain more services and benefits by holding and using Power Token. Creators can obtain more rewards by providing high-quality content and services.
![Screenshot 2024-09-10 at 6 25 43 PM](https://github.com/user-attachments/assets/351ac415-d94e-4d5a-af42-37656c3e535c)
![Screenshot 2024-09-10 at 6 27 08 PM](https://github.com/user-attachments/assets/82d71c46-c039-41b9-b3cd-5ad078ff14a5)
![Screenshot 2024-09-10 at 8 10 56 PM](https://github.com/user-attachments/assets/2424dfd4-59a6-4dad-8eb7-8db61a711b45)
### AI At Your Fingertips

- Social features. Follow is also a social platform that allows you to follow other users, share your subscriptions, and discover new content. It also offers a subscription list synchronization feature, enabling your friends to sync with your subscriptions. Click [here](https://app.follow.is/share/users/54728159538884608) to view my automatically generated personal page.
![Screenshot 2024-09-10 at 6 26 37 PM](https://github.com/user-attachments/assets/b636fd6d-0fcb-436b-8856-f7a965dba12d)
A smarter and more efficient browsing with AI-powered features like translation, summary, and more.

- Extensive customization options
![Screenshot 2024-09-10 at 6 24 38 PM](https://github.com/user-attachments/assets/53ff78cd-02d0-4eeb-a10f-40ae21d85912)
![Screenshot 2024-09-10 at 6 24 48 PM](https://github.com/user-attachments/assets/64bf2e9e-d9fe-4a90-bb3d-975ddb3e6558)
![](https://github.com/user-attachments/assets/37cf4f2f-4c5e-4775-86e8-2fa1a1b2ecf5)

- Third-party integrations
![Screenshot 2024-09-10 at 6 25 33 PM](https://github.com/user-attachments/assets/ea86fdbd-4b53-47ae-8bc5-d9a382ef07b5)
### Dynamic Content Support

- Shortcuts and gestures
![Screenshot 2024-09-10 at 6 25 38 PM](https://github.com/user-attachments/assets/43116bea-47b9-4c17-bc4f-92fb101a37a5)
Because we know content is more than just text. From articles to videos, images to audio — Follow gets it all covered.

## Releases
![](https://github.com/user-attachments/assets/d1379fd6-8767-476e-b0dc-d61753715e26)

[![Discord](https://img.shields.io/discord/1243823539426033696?logo=discord&label=Discord&style=flat-square&color=5865F2)](https://discord.gg/followapp) [![](https://img.shields.io/badge/any_text-Follow-blue?color=2CA5E0&label=_&logo=x&cacheSeconds=3600&style=flat-square)](https://x.com/intent/follow?screen_name=follow_app_)
### $POWER An Ownership Economy

Currently, Follow is still in the early developer preview stage (alpha) and is only available to a limited number of users through an invitation system.
Tip creators across instantly with $POWER, support content you love, and unlock value in your own work. Your content, your power.

You can get an invitation code in the following ways:
![](https://github.com/user-attachments/assets/23bbcd63-45ca-40c8-83ef-96bd1100b701)

- Looking for any alpha test user to invite you.
- Join our Discord server for occasional giveaways.
- Follow our X account for occasional giveaways.
### More Than Just An App

If you have access, you are welcome to use the following methods to download and install it:
This isn’t just another app. Follow is a community — introducing a new era of openness and community-driven experience.

- Visit our online webapp at [app.follow.is](https://app.follow.is)
- You can get the installation packages for each platform from the [Releases page](https://github.com/RSSNext/Follow/releases).
- If you are using Arch Linux, you can install package [follow-appimage](https://aur.archlinux.org/packages/follow-appimage) that maintained by [timochan](https://github.com/ttimochan).
- If you are using Nix, you can install package [follow](https://github.com/NixOS/nixpkgs/blob/master/pkgs/by-name/fo/follow/package.nix) that maintained by [iosmanthus](https://github.com/iosmanthus).
- If you are using macOS with [Homebrew](https://brew.sh), you can install cask [follow](https://formulae.brew.sh/cask/follow) (also [@alpha](https://formulae.brew.sh/cask/follow@alpha) and [@nightly](https://formulae.brew.sh/cask/follow@nightly)) that maintained by [realSunyz](https://github.com/realSunyz).
![](https://github.com/user-attachments/assets/62004a04-eaea-4f5d-bfbf-4e68b6b90286)

## Contributing
## 🤝 Contributing

If you are eligible to use Follow, you are welcome to join the open source community to build together.

Expand Down Expand Up @@ -136,7 +128,7 @@ Since it is not very convenient to develop in Electron, the first way to develop
> [!TIP]
> If you can't log in to the app, copy the `authjs.session-token` in the cookie from your browser into the app.
## License
## 📝 License

Follow is licensed under the GNU General Public License version 3 with the addition of the following special exception:

Expand Down
4 changes: 3 additions & 1 deletion apps/main/src/lib/cleaner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { promisify } from "node:util"
import { callWindowExpose } from "@follow/shared/bridge"
import { app, dialog } from "electron"

import { getIconPath } from "~/helper"
import { logger } from "~/logger"
import { getMainWindow } from "~/window"

Expand All @@ -23,9 +24,10 @@ export const clearAllDataAndConfirm = async () => {
// Dialog to confirm
const result = await dialog.showMessageBox({
type: "warning",

icon: getIconPath(),
message: t("dialog.clearAllData"),
buttons: [t("dialog.yes"), t("dialog.no")],
cancelId: 1,
})

if (result.response === 1) {
Expand Down
33 changes: 33 additions & 0 deletions apps/main/src/window.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,16 @@ import path from "node:path"
import { fileURLToPath } from "node:url"

import { is } from "@electron-toolkit/utils"
import { APP_PROTOCOL } from "@follow/shared"
import { callWindowExpose } from "@follow/shared/bridge"
import type { BrowserWindowConstructorOptions } from "electron"
import { app, BrowserWindow, screen, shell } from "electron"
import type { Event } from "electron/main"

import { START_IN_TRAY_ARGS } from "./constants/app"
import { isDev, isMacOS, isWindows, isWindows11 } from "./env"
import { getIconPath } from "./helper"
import { t } from "./lib/i18n"
import { store } from "./lib/store"
import { getTrayConfig } from "./lib/tray"
import { logger } from "./logger"
Expand Down Expand Up @@ -109,6 +112,36 @@ export function createWindow(
return { action: "deny" }
})

const handleExternalProtocol = async (e: Event, url: string, window: BrowserWindow) => {
const { protocol } = new URL(url)

const ignoreProtocols = ["http", "https", APP_PROTOCOL, "file", "code", "cursor"]
if (ignoreProtocols.includes(protocol.slice(0, -1))) {
return
}
e.preventDefault()

const caller = callWindowExpose(window)
const confirm = await caller.dialog.ask({
title: t("dialog.openExternalApp.title"),
message: t("dialog.openExternalApp.message", { url, interpolation: { escapeValue: false } }),
confirmText: t("dialog.open"),
cancelText: t("dialog.cancel"),
})
if (!confirm) {
return
}
shell.openExternal(url)
}

// Handle main window external links
window.webContents.on("will-navigate", (e, url) => handleExternalProtocol(e, url, window))

// Handle webview external links
window.webContents.on("did-attach-webview", (_, webContents) => {
webContents.on("will-navigate", (e, url) => handleExternalProtocol(e, url, window))
})

// HMR for renderer base on electron-vite cli.
// Load the remote URL for development or the local html file for production.
if (is.dev && process.env["ELECTRON_RENDERER_URL"]) {
Expand Down
4 changes: 3 additions & 1 deletion apps/renderer/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@
"dexie-export-import": "^4.1.2",
"dnum": "^2.14.0",
"electron-log": "5.2.0",
"embla-carousel-react": "8.3.1",
"embla-carousel-wheel-gestures": "8.0.1",
"firebase": "10.14.1",
"foxact": "0.2.41",
"framer-motion": "11.11.11",
Expand Down Expand Up @@ -97,7 +99,6 @@
"remark-rehype": "11.1.1",
"shiki": "1.22.2",
"sonner": "1.5.0",
"swiper": "11.1.14",
"tldts": "6.1.58",
"unified": "11.0.5",
"unist-util-visit-parents": "^6.0.1",
Expand All @@ -114,6 +115,7 @@
"@follow/components": "workspace:*",
"@follow/constants": "workspace:*",
"@follow/hooks": "workspace:*",
"@follow/logger": "workspace:*",
"@follow/models": "workspace:*",
"@follow/shared": "workspace:*",
"@follow/types": "workspace:*",
Expand Down
2 changes: 2 additions & 0 deletions apps/renderer/src/atoms/settings/general.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ const createDefaultSettings = (): GeneralSettings => ({
sendAnonymousData: true,
reduceRefetch: true,

autoGroup: true,

// view
unreadOnly: true,
// mark unread
Expand Down
17 changes: 17 additions & 0 deletions apps/renderer/src/components/common/LazyDotLottie.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Skeleton } from "@follow/components/ui/skeleton/index.js"
import type { DotLottieReactProps } from "@lottiefiles/dotlottie-react"
import type { PropsWithoutRef } from "react"
import { lazy, Suspense } from "react"

const LazyDotLottieComponent = lazy(async () => {
const { DotLottieReact } = await import("@lottiefiles/dotlottie-react")
return { default: DotLottieReact }
})

export const LazyDotLottie = (props: PropsWithoutRef<DotLottieReactProps>) => {
return (
<Suspense fallback={<Skeleton className={props.className} />}>
<LazyDotLottieComponent {...props} />
</Suspense>
)
}
Loading

0 comments on commit f205d9b

Please sign in to comment.