Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 40 additions & 0 deletions .github/workflows/ci-main.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: CI

on:
push:
branches:
- main
pull_request:
branches:
- main

jobs:
lint-and-format:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10

- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 22
cache: pnpm

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Lint
run: pnpm run lint

- name: Prettier check
run: pnpm run format:check

- name: Build
run: pnpm run build
68 changes: 0 additions & 68 deletions .github/workflows/release.yml

This file was deleted.

55 changes: 16 additions & 39 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,48 +1,25 @@
# Node modules
node_modules/

# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
*.log

# pnpm/plug'n'play
.pnp/
.pnp.js
lerna-debug.log*

# Build outputs
dist/
build/
out/

# Cache / tooling
.cache/
.parcel-cache/
.turbo/
coverage/

# TypeScript
*.tsbuildinfo
node_modules
dist
dist-ssr
*.local
*.zip

# Editor directories and files
.vscode/
.idea/
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*

# OS files
.DS_Store
Thumbs.db

# Env files
.env
.env.local
.env.*.local

# Common bundler outputs (avoid committing generated files in repo root)
background.js
popup.js

# Archives
*.zip
*.njsproj
*.sln
*.sw?
76 changes: 53 additions & 23 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,59 +1,70 @@
[![version](https://img.shields.io/github/v/release/AfoxDesignz/Norish-Quick-Import-Extension?style=for-the-badge&color=336640&labelColor=faf5e8)](https://github.com/AfoxDesignz/Norish-Quick-Import-Extension/releases) ![Visitors](https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2FAfoxDesignz%2Fnorish-quick-import-extension&labelColor=%23faf5e8&countColor=%23336640) ![license](https://img.shields.io/badge/license-MIT-336640.svg?style=for-the-badge&labelColor=faf5e8) [![Static Badge](https://img.shields.io/badge/built_for_chromium-336640?style=for-the-badge&logo=googlechrome&logoColor=336640&labelColor=faf5e8)](<https://www.wikiwand.com/en/articles/Chromium_(web_browser)>)
[![version](https://img.shields.io/github/v/release/AfoxDesignz/Norish-Quick-Import-Extension?style=for-the-badge&color=336640&labelColor=faf5e8)](https://github.com/AfoxDesignz/Norish-Quick-Import-Extension/releases) ![Visitors](https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2FAfoxDesignz%2Fnorish-quick-import-extension&labelColor=%23faf5e8&countColor=%23336640) ![license](https://img.shields.io/badge/license-MIT-336640.svg?style=for-the-badge&labelColor=faf5e8) <br>
[![Static Badge](https://img.shields.io/badge/built_for_chromium-336640?style=for-the-badge&logo=googlechrome&logoColor=336640&labelColor=faf5e8)](<https://www.wikiwand.com/en/articles/Chromium_(web_browser)>)

---

<center>
<img alt="Logo" src="https://raw.githubusercontent.com/AfoxDesignz/Norish-Quick-Import-Extension/main/docs/logo/logo.png">

# Norish Quick Import

Save recipes from any website into [Norish](https://github.com/norish-recipes/norish) in a couple of clicks while you browse.
</center>

Save recipes from any website into [Norish](https://github.com/norish-recipes/norish) in just two clicks while you browse.

![](https://raw.githubusercontent.com/AfoxDesignz/Norish-Quick-Import-Extension/main/docs/images/screenshot_home.png, "Screenshot")

### **Features**
#### ![](https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/src/16/solid/photo.svg) Screenshot

### ![](https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/src/16/solid/numbered-list.svg) Features

- **Save recipes quickly**: send the current page's recipe to your Norish instance in two clicks.
- **Works on any site**: import recipes from any webpage - no site-specific setup required. _(has to be supported by norish)_
- **Simple setup**: enter your Norish domain and API key once. The settings sync with your browser profile.
- **Compact popup**: a small, focused UI that keeps browsing uninterrupted.
- **Privacy-first**: only the page URL and your API key are sent to the Norish instance you configure.
- **Lightweight**: runs in the background with minimal permissions and low resource use.

**Planned improvements**

- Improve the popup UI.
- Clearer import status feedback.
- Add more features

### ![](https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/src/16/solid/globe-alt.svg) Supported browsers

- Chromium-based browsers with Manifest V3 support (tested with recent Google Chrome and Vivaldi versions).
- Firefox is currently not supported.

> [!NOTE]
> [!NOTE]
> This extension is an independent project and is neither an official browser extension nor affiliated with the [Norish](https://github.com/norish-recipes/norish) project.

---

### **Quickstart**
### ![](https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/src/16/solid/rocket-launch.svg) Quickstart

Prebuilt releases include a ZIP of the compiled extension (contents of `dist/`). Read below if you want to build from source.

#### To install from a release:

1. Download and unzip the release ZIP.
2. Open Extensions in your Chromium-based browser -> enable Developer mode -> click **Load unpacked** -> select the unzipped folder.
2. Open `chrome://extensions` in your browser -> enable Developer mode -> click **Load unpacked** -> select the unzipped release folder.

#### After installation:

1. Open the Extensions menu (puzzle-piece icon) and pin "Norish Quick Import" to the extensions toolbar.
1. Open the Extensions menu of your browser (puzzle-piece icon) and **pin "Norish Quick Import"** to the extensions toolbar.
2. Go the the account settings of your [Norish](https://github.com/norish-recipes/norish) instance.
3. Create a new API key and copy it to your clipboard.
4. Click the extension icon in the extensions toolbar to open the Norish Quick Import popup.
5. Fillout the domain of your [Norish](https://github.com/norish-recipes/norish) instance and paste your API key.
3. **Create a new API key** and copy it to your clipboard.
4. Click the extension icon in the extensions toolbar of your browser to **open the Norish Quick Import popup**.
5. **Fill out the domain of your [Norish](https://github.com/norish-recipes/norish) instance and paste your API key**.
6. Click `Save Settings`.
7. Your browser will ask you, if you want to allow `Norish Quick Import` to access your configured Instance Domain. **Click `Allow`**.

After clicking on `save` you can just browse the internet and whenever you find a recipe, you would like to import into [Norish](https://github.com/norish-recipes/norish), just click the extension icon and hit send.
After setting up the Extension you can just browse the internet and whenever you find a recipe, that's worth saving into [Norish](https://github.com/norish-recipes/norish), just click the extension icon and hit `send`-Button.

> [!TIP]
> If you encounter any problem or have a question, feel free to create an [issue](https://github.com/AfoxDesignz/Norish-Quick-Import-Extension/issues/new).

---

### **Privacy**

Your Norish domain and API key are stored in Chrome sync storage (so they can sync with your browser profile). When you import a recipe, the extension sends the recipe URL and your API key only to the Norish instance you configured. The extension does not include analytics or third-party tracking.

---

### **Build from source**
### ![](https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/src/16/solid/command-line.svg) Build from source

1. Clone this repository:

Expand All @@ -73,11 +84,30 @@ pnpm install
pnpm run build
```

4. Open Extensions in your Chromium-based browser -> enable Developer mode -> click **Load unpacked** -> select the `dist/` folder.
4. Open `chrome://extensions` in your browser -> enable Developer mode -> click **Load unpacked** -> select the `dist/` folder.

---

### ![](https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/src/16/solid/finger-print.svg) Privacy

Data handling:

- Stored locally (Chrome sync storage): your Norish domain and API key.
- Stored locally (Chrome local storage): the latest import status shown in the popup.
- Sent to your configured Norish instance during import: recipe URL and API key.
- **Not** sent: analytics, tracking data, or data to third-party services.

### ![](https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/src/16/solid/flag.svg) Permissions

The extension currently requests:

- `storage`: stores your Norish domain/API key and the latest import status.
- `tabs`: reads the active tab URL so the recipe URL field can be prefilled.
- `optional_host_permissions` (`http://*/*`, `https://*/*`): when you save settings, the extension requests access only for your configured Norish domain.

---

### **License**
### ![](https://raw.githubusercontent.com/tailwindlabs/heroicons/refs/heads/master/src/16/solid/shield-exclamation.svg) License

- This repository is licensed under the MIT License. See the `LICENSE` file for details.

Expand Down
Binary file added docs/images/popup-home.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/screenshot_home.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/vivaldi_home.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/vivaldi_settings.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/logo/icon128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/logo/icon16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/logo/icon32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/logo/icon48.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/logo/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
29 changes: 29 additions & 0 deletions docs/logo/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 23 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import js from "@eslint/js";
import globals from "globals";
import reactHooks from "eslint-plugin-react-hooks";
import reactRefresh from "eslint-plugin-react-refresh";
import tseslint from "typescript-eslint";
import { defineConfig, globalIgnores } from "eslint/config";

export default defineConfig([
globalIgnores(["dist"]),
{
files: ["**/*.{ts,tsx}"],
extends: [
js.configs.recommended,
tseslint.configs.recommended,
reactHooks.configs.flat.recommended,
reactRefresh.configs.vite,
],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
},
]);
26 changes: 26 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/png" href="/icons/icon32.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Norish Quick Import</title>
<style>
body {
min-width: 360px;
margin: 0;
padding: 0;
box-sizing: border-box;
}

#root {
width: 100%;
}
</style>
</head>

<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
</body>
</html>
Loading