https://github.com/allister-grange/startertab/assets/18430086/e8173522-c566-4cec-a894-061925c8c4ff
I was getting sick of the same old new tab page. I wanted to have a dashboard for everything I reach for in my typical workday, so I built it.
StarterTab is here to revolutionize the way you start your day on the internet. With a completely customizable webapp to replace your new tab homepage, you can personalize your online experience like never before.
You can install the chrome extension here, or the firefox extension here and make StarterTab the site that opens up on every one of your new tabs.
Local storage is being used for storing all of your customizations, meaning you own your data! All of the settings, tokens and themes sit on your own browser. Some may call it laziness that I don't want to maintain a database, you could also see it as me helping prevent your data being in yet another cloud service.
Written in NextJS with CharkaUI. The frontend and functions are hosted on Vercel, the database on Neon.
git clone https://github.com/allister-grange/startertab.git
cd startertab
yarn install
Copy the .env.local.example
file in this directory to .env.local
(which will be ignored by Git):
cp .env.local.example .env.local
Add details for all providers you want to use:
STRAVA_CLIENT_ID=<YOUR_SECRET_HERE>
STRAVA_SECRET=<YOUR_SECRET_HERE>
WEATHERAPI_TOKEN=<YOUR_SECRET_HERE>
SPOTIFY_CLIENT_ID=<YOUR_SECRET_HERE>
SPOTIFY_CLIENT_SECRET=<YOUR_SECRET_HERE>
FINNHUB_SECRET=<YOUR_SECRET_HERE>
TWITTER_CLIENT_ID=<YOUR_SECRET_HERE>
TWITTER_CLIENT_SECRET=<YOUR_SECRET_HERE>
TWITTER_CODE_CHALLENGE_KEY=<YOUR_SECRET_HERE>
TOKEN_ENCRYPT_KEY=<YOUR_SECRET_HERE>
OUTLOOK_CLIENT_ID=<YOUR_SECRET_HERE>
OUTLOOK_CLIENT_SECRET=<YOUR_SECRET_HERE>
GOOGLE_CLIENT_ID=<YOUR_SECRET_HERE>
GOOGLE_CLIENT_SECRET=<YOUR_SECRET_HERE>
DATABASE_URL=<YOUR_SECRET_HERE>
DATABASE_URL_UNPOOLED=<YOUR_SECRET_HERE>
ANALYTICS_ENABLED=<true or false>
To run your startertab locally, use:
yarn dev
To run it in production mode, use:
yarn build && yarn start
src/components/tiles
folder. Make sure to accept a 'tileId' prop, this enables you to change the color of the text based off the settings changed in the sidebar.type PageProps = {
tileId: number;
};
export const YourNewTile: React.FC<PageProps> = ({ tileId }) => {
const color = `var(--text-color-${tileId})`;
return ();
}
src/types/settings.ts
.tileSize
in src/components/sidebar/OptionsForTileTypeSelect.tsx
tileType
in src/components/TileContainer.tsx
if you need persistent storage
TileSettings
type within src/types/settings.ts
src/recoil/UserSettingsSelectors.tsx
selector example:
export const imageFilePathSelector = createTilePropertySelector<string>(
"imageFilePath",
(theme, newValue) => {
theme.imageFilePath = newValue;
}
);
using that selector in a tile:
const [fileValue, setFileValue] = useRecoilState(
imageFilePathSelector (tileId)
) as [string | undefined, SetterOrUpdater<string | undefined>];
creating a sidebar menu item for options
OptionType
in src/types/settings.ts
src/helpers/sideBarOptions.ts
src/components/sidebar/SettingOptionContainer.tsx
to include the new option type