{"id":50978808,"url":"https://github.com/rajdeepds/edge-timer","last_synced_at":"2026-06-19T12:03:01.799Z","repository":{"id":333095936,"uuid":"1135062873","full_name":"RajdeepDs/Edge-Timer","owner":"RajdeepDs","description":"A shopify app to create countdown timer","archived":false,"fork":false,"pushed_at":"2026-04-25T05:50:39.000Z","size":518,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-25T07:31:49.291Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RajdeepDs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-15T15:33:02.000Z","updated_at":"2026-04-20T15:49:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/RajdeepDs/Edge-Timer","commit_stats":null,"previous_names":["rajdeepds/urgency-timer","rajdeepds/edge-timer"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/RajdeepDs/Edge-Timer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RajdeepDs%2FEdge-Timer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RajdeepDs%2FEdge-Timer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RajdeepDs%2FEdge-Timer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RajdeepDs%2FEdge-Timer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RajdeepDs","download_url":"https://codeload.github.com/RajdeepDs/Edge-Timer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RajdeepDs%2FEdge-Timer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34530302,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-19T12:03:00.666Z","updated_at":"2026-06-19T12:03:01.786Z","avatar_url":"https://github.com/RajdeepDs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Shopify App Template - Remix\n\n\u003e [!NOTE]\n\u003e **Remix is now React Router.** As of [React Router v7](https://remix.run/blog/merging-remix-and-react-router), Remix and React Router have merged.\n\u003e \n\u003e For new projects, use the **[Shopify App Template - React Router](https://github.com/Shopify/shopify-app-template-react-router)** instead.\n\u003e \n\u003e To migrate your existing Remix app, follow the **[migration guide](https://github.com/Shopify/shopify-app-template-react-router/wiki/Upgrading-from-Remix)**.\n\nThis is a template for building a [Shopify app](https://shopify.dev/docs/apps/getting-started) using the [Remix](https://remix.run) framework.\n\nRather than cloning this repo, you can use your preferred package manager and the Shopify CLI with [these steps](https://shopify.dev/docs/apps/getting-started/create).\n\nVisit the [`shopify.dev` documentation](https://shopify.dev/docs/api/shopify-app-remix) for more details on the Remix app package.\n\n## Quick start\n\n### Prerequisites\n\nBefore you begin, you'll need the following:\n\n1. **Node.js**: [Download and install](https://nodejs.org/en/download/) it if you haven't already.\n2. **Shopify Partner Account**: [Create an account](https://partners.shopify.com/signup) if you don't have one.\n3. **Test Store**: Set up either a [development store](https://help.shopify.com/en/partners/dashboard/development-stores#create-a-development-store) or a [Shopify Plus sandbox store](https://help.shopify.com/en/partners/dashboard/managing-stores/plus-sandbox-store) for testing your app.\n4. **Shopify CLI**: [Download and install](https://shopify.dev/docs/apps/tools/cli/getting-started) it if you haven't already.\n```shell\nnpm install -g @shopify/cli@latest\n```\n\n### Setup\n\n```shell\nshopify app init --template=https://github.com/Shopify/shopify-app-template-remix\n```\n\n### Local Development\n\n```shell\nshopify app dev\n```\n\n\n\nLocal development is powered by [the Shopify CLI](https://shopify.dev/docs/apps/tools/cli). It logs into your partners account, connects to an app, provides environment variables, updates remote config, creates a tunnel and provides commands to generate extensions.\n\n### Authenticating and querying data\n\nTo authenticate and query data you can use the `shopify` const that is exported from `/app/shopify.server.js`:\n\n```js\nexport async function loader({ request }) {\n  const { admin } = await shopify.authenticate.admin(request);\n\n  const response = await admin.graphql(`\n    {\n      products(first: 25) {\n        nodes {\n          title\n          description\n        }\n      }\n    }`);\n\n  const {\n    data: {\n      products: { nodes },\n    },\n  } = await response.json();\n\n  return nodes;\n}\n```\n\nThis template comes preconfigured with examples of:\n\n1. Setting up your Shopify app in [/app/shopify.server.ts](https://github.com/Shopify/shopify-app-template-remix/blob/main/app/shopify.server.ts)\n2. Querying data using Graphql. Please see: [/app/routes/app.\\_index.tsx](https://github.com/Shopify/shopify-app-template-remix/blob/main/app/routes/app._index.tsx).\n3. Responding to webhooks in individual files such as [/app/routes/webhooks.app.uninstalled.tsx](https://github.com/Shopify/shopify-app-template-remix/blob/main/app/routes/webhooks.app.uninstalled.tsx) and [/app/routes/webhooks.app.scopes_update.tsx](https://github.com/Shopify/shopify-app-template-remix/blob/main/app/routes/webhooks.app.scopes_update.tsx)\n\nPlease read the [documentation for @shopify/shopify-app-remix](https://www.npmjs.com/package/@shopify/shopify-app-remix#authenticating-admin-requests) to understand what other API's are available.\n\n## Deployment\n\n### Application Storage\n\nThis template uses [Prisma](https://www.prisma.io/) to store session data, by default using an [SQLite](https://www.sqlite.org/index.html) database.\nThe database is defined as a Prisma schema in `prisma/schema.prisma`.\n\nThis use of SQLite works in production if your app runs as a single instance.\nThe database that works best for you depends on the data your app needs and how it is queried.\nYou can run your database of choice on a server yourself or host it with a SaaS company.\nHere's a short list of databases providers that provide a free tier to get started:\n\n| Database   | Type             | Hosters                                                                                                                                                                                                                               |\n| ---------- | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| MySQL      | SQL              | [Digital Ocean](https://www.digitalocean.com/products/managed-databases-mysql), [Planet Scale](https://planetscale.com/), [Amazon Aurora](https://aws.amazon.com/rds/aurora/), [Google Cloud SQL](https://cloud.google.com/sql/docs/mysql) |\n| PostgreSQL | SQL              | [Digital Ocean](https://www.digitalocean.com/products/managed-databases-postgresql), [Amazon Aurora](https://aws.amazon.com/rds/aurora/), [Google Cloud SQL](https://cloud.google.com/sql/docs/postgres)                                   |\n| Redis      | Key-value        | [Digital Ocean](https://www.digitalocean.com/products/managed-databases-redis), [Amazon MemoryDB](https://aws.amazon.com/memorydb/)                                                                                                        |\n| MongoDB    | NoSQL / Document | [Digital Ocean](https://www.digitalocean.com/products/managed-databases-mongodb), [MongoDB Atlas](https://www.mongodb.com/atlas/database)                                                                                                  |\n\nTo use one of these, you can use a different [datasource provider](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference#datasource) in your `schema.prisma` file, or a different [SessionStorage adapter package](https://github.com/Shopify/shopify-api-js/blob/main/packages/shopify-api/docs/guides/session-storage.md).\n\n### Build\n\nRemix handles building the app for you, by running the command below with the package manager of your choice:\n\nUsing yarn:\n\n```shell\nyarn build\n```\n\nUsing npm:\n\n```shell\nnpm run build\n```\n\nUsing pnpm:\n\n```shell\npnpm run build\n```\n\n## Hosting\n\nWhen you're ready to set up your app in production, you can follow [our deployment documentation](https://shopify.dev/docs/apps/deployment/web) to host your app on a cloud provider like [Heroku](https://www.heroku.com/) or [Fly.io](https://fly.io/).\n\nWhen you reach the step for [setting up environment variables](https://shopify.dev/docs/apps/deployment/web#set-env-vars), you also need to set the variable `NODE_ENV=production`.\n\n### Hosting on Vercel\n\nUsing the Vercel Preset is recommended when hosting your Shopify Remix app on Vercel. You'll also want to ensure imports that would normally come from `@remix-run/node` are imported from `@vercel/remix` instead. Learn more about hosting Remix apps on Vercel [here](https://vercel.com/docs/frameworks/remix).\n\n```diff\n// vite.config.ts\nimport { vitePlugin as remix } from \"@remix-run/dev\";\nimport { defineConfig, type UserConfig } from \"vite\";\nimport tsconfigPaths from \"vite-tsconfig-paths\";\n+ import { vercelPreset } from '@vercel/remix/vite';\n\ninstallGlobals();\n\nexport default defineConfig({\n  plugins: [\n    remix({\n      ignoredRouteFiles: [\"**/.*\"],\n+     presets: [vercelPreset()],\n    }),\n    tsconfigPaths(),\n  ],\n});\n```\n\n## Troubleshooting\n\n### Database tables don't exist\n\nIf you get this error:\n\n```\nThe table `main.Session` does not exist in the current database.\n```\n\nYou need to create the database for Prisma. Run the `setup` script in `package.json` using your preferred package manager.\n\n### Navigating/redirecting breaks an embedded app\n\nEmbedded Shopify apps must maintain the user session, which can be tricky inside an iFrame. To avoid issues:\n\n1. Use `Link` from `@remix-run/react` or `@shopify/polaris`. Do not use `\u003ca\u003e`.\n2. Use the `redirect` helper returned from `authenticate.admin`. Do not use `redirect` from `@remix-run/node`\n3. Use `useSubmit` or `\u003cForm/\u003e` from `@remix-run/react`. Do not use a lowercase `\u003cform/\u003e`.\n\nThis only applies if your app is embedded, which it will be by default.\n\n### Non Embedded\n\nShopify apps are best when they are embedded in the Shopify Admin, which is how this template is configured. If you have a reason to not embed your app please make the following changes:\n\n1. Ensure `embedded = false` is set in [shopify.app.toml`](./shopify.app.toml). [Docs here](https://shopify.dev/docs/apps/build/cli-for-apps/app-configuration#global).\n2. Pass `isEmbeddedApp: false` to `shopifyApp()` in `./app/shopify.server.js|ts`.\n3. Change the `isEmbeddedApp` prop to `isEmbeddedApp={false}` for the `AppProvider` in `/app/routes/app.jsx|tsx`.\n4. Remove the `@shopify/app-bridge-react` dependency from [package.json](./package.json) and `vite.config.ts|js`.\n5. Remove anything imported from `@shopify/app-bridge-react`.  For example: `NavMenu`, `TitleBar` and `useAppBridge`.\n\n### OAuth goes into a loop when I change my app's scopes\n\nIf you change your app's scopes and authentication goes into a loop and fails with a message from Shopify that it tried too many times, you might have forgotten to update your scopes with Shopify.\nTo do that, you can run the `deploy` CLI command.\n\nUsing yarn:\n\n```shell\nyarn deploy\n```\n\nUsing npm:\n\n```shell\nnpm run deploy\n```\n\nUsing pnpm:\n\n```shell\npnpm run deploy\n```\n\n### My shop-specific webhook subscriptions aren't updated\n\nIf you are registering webhooks in the `afterAuth` hook, using `shopify.registerWebhooks`, you may find that your subscriptions aren't being updated.  \n\nInstead of using the `afterAuth` hook, the recommended approach is to declare app-specific webhooks in the `shopify.app.toml` file.  This approach is easier since Shopify will automatically update changes to webhook subscriptions every time you run `deploy` (e.g: `npm run deploy`).  Please read these guides to understand more:\n\n1. [app-specific vs shop-specific webhooks](https://shopify.dev/docs/apps/build/webhooks/subscribe#app-specific-subscriptions)\n2. [Create a subscription tutorial](https://shopify.dev/docs/apps/build/webhooks/subscribe/get-started?framework=remix\u0026deliveryMethod=https)\n\nIf you do need shop-specific webhooks, please keep in mind that the package calls `afterAuth` in 2 scenarios:\n\n- After installing the app\n- When an access token expires\n\nDuring normal development, the app won't need to re-authenticate most of the time, so shop-specific subscriptions aren't updated. To force your app to update the subscriptions, you can uninstall and reinstall it in your development store. That will force the OAuth process and call the `afterAuth` hook.\n\n### Admin created webhook failing HMAC validation\n\nWebhooks subscriptions created in the [Shopify admin](https://help.shopify.com/en/manual/orders/notifications/webhooks) will fail HMAC validation. This is because the webhook payload is not signed with your app's secret key.  There are 2 solutions:\n\n1. Use [app-specific webhooks](https://shopify.dev/docs/apps/build/webhooks/subscribe#app-specific-subscriptions) defined in your toml file instead (recommended)\n2. Create [webhook subscriptions](https://shopify.dev/docs/api/shopify-app-remix/v1/guide-webhooks) using the `shopifyApp` object.\n\nTest your webhooks with the [Shopify CLI](https://shopify.dev/docs/apps/tools/cli/commands#webhook-trigger) or by triggering events manually in the Shopify admin(e.g. Updating the product title to trigger a `PRODUCTS_UPDATE`).\n\n### Incorrect GraphQL Hints\n\nBy default the [graphql.vscode-graphql](https://marketplace.visualstudio.com/items?itemName=GraphQL.vscode-graphql) extension for VS Code will assume that GraphQL queries or mutations are for the [Shopify Admin API](https://shopify.dev/docs/api/admin). This is a sensible default, but it may not be true if:\n\n1. You use another Shopify API such as the storefront API.\n2. You use a third party GraphQL API.\n\nin this situation, please update the [.graphqlrc.ts](https://github.com/Shopify/shopify-app-template-remix/blob/main/.graphqlrc.ts) config.\n\n### First parameter has member 'readable' that is not a ReadableStream.\n\nSee [hosting on Vercel](#hosting-on-vercel).\n\n### Admin object undefined on webhook events triggered by the CLI\n\nWhen you trigger a webhook event using the Shopify CLI, the `admin` object will be `undefined`. This is because the CLI triggers an event with a valid, but non-existent, shop. The `admin` object is only available when the webhook is triggered by a shop that has installed the app.\n\nWebhooks triggered by the CLI are intended for initial experimentation testing of your webhook configuration. For more information on how to test your webhooks, see the [Shopify CLI documentation](https://shopify.dev/docs/apps/tools/cli/commands#webhook-trigger).\n\n### Using Defer \u0026 await for streaming responses\n\nTo test [streaming using defer/await](https://remix.run/docs/en/main/guides/streaming) during local development you'll need to use the Shopify CLI slightly differently:\n\n1. First setup ngrok: https://ngrok.com/product/secure-tunnels\n2. Create an ngrok tunnel on port 8080: `ngrok http 8080`.\n3. Copy the forwarding address. This should be something like: `https://f355-2607-fea8-bb5c-8700-7972-d2b5-3f2b-94ab.ngrok-free.app`\n4. In a separate terminal run `yarn shopify app dev --tunnel-url=TUNNEL_URL:8080` replacing `TUNNEL_URL` for the address you copied in step 3.\n\nBy default the CLI uses a cloudflare tunnel. Unfortunately it cloudflare tunnels wait for the Response stream to finish, then sends one chunk.\n\nThis will not affect production, since tunnels are only for local development.\n\n### Using MongoDB and Prisma\n\nBy default this template uses SQLlite as the database. It is recommended to move to a persisted database for production. If you choose to use MongoDB, you will need to make some modifications to the schema and prisma configuration. For more information please see the [Prisma MongoDB documentation](https://www.prisma.io/docs/orm/overview/databases/mongodb).\n\nAlternatively you can use a MongDB database directly with the [MongoDB session storage adapter](https://github.com/Shopify/shopify-app-js/tree/main/packages/apps/session-storage/shopify-app-session-storage-mongodb).\n\n#### Mapping the id field\n\nIn MongoDB, an ID must be a single field that defines an @id attribute and a @map(\"\\_id\") attribute.\nThe prisma adapter expects the ID field to be the ID of the session, and not the \\_id field of the document.\n\nTo make this work you can add a new field to the schema that maps the \\_id field to the id field. For more information see the [Prisma documentation](https://www.prisma.io/docs/orm/prisma-schema/data-model/models#defining-an-id-field)\n\n```prisma\nmodel Session {\n  session_id  String    @id @default(auto()) @map(\"_id\") @db.ObjectId\n  id          String    @unique\n...\n}\n```\n\n#### Error: The \"mongodb\" provider is not supported with this command\n\nMongoDB does not support the [prisma migrate](https://www.prisma.io/docs/orm/prisma-migrate/understanding-prisma-migrate/overview) command. Instead, you can use the [prisma db push](https://www.prisma.io/docs/orm/reference/prisma-cli-reference#db-push) command and update the `shopify.web.toml` file with the following commands. If you are using MongoDB please see the [Prisma documentation](https://www.prisma.io/docs/orm/overview/databases/mongodb) for more information.\n\n```toml\n[commands]\npredev = \"npx prisma generate \u0026\u0026 npx prisma db push\"\ndev = \"npm exec remix vite:dev\"\n```\n\n#### Prisma needs to perform transactions, which requires your mongodb server to be run as a replica set\n\nSee the [Prisma documentation](https://www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch/mongodb/connect-your-database-node-mongodb) for connecting to a MongoDB database.\n\n### I want to use Polaris v13.0.0 or higher\n\nCurrently, this template is set up to work on node v18.20 or higher. However, `@shopify/polaris` is limited to v12 because v13 can only run on node v20+.\n\nYou don't have to make any changes to the code in order to be able to upgrade Polaris to v13, but you'll need to do the following:\n\n- Upgrade your node version to v20.10 or higher.\n- Update your `Dockerfile` to pull `FROM node:20-alpine` instead of `node:18-alpine`\n\n### \"nbf\" claim timestamp check failed\n\nThis error will occur of the `nbf` claim timestamp check failed. This is because the JWT token is expired.\nIf you  are consistently getting this error, it could be that the clock on your machine is not in sync with the server.\n\nTo fix this ensure you have enabled `Set time and date automatically` in the `Date and Time` settings on your computer.\n\n## Benefits\n\nShopify apps are built on a variety of Shopify tools to create a great merchant experience.\n\n\u003c!-- TODO: Uncomment this after we've updated the docs --\u003e\n\u003c!-- The [create an app](https://shopify.dev/docs/apps/getting-started/create) tutorial in our developer documentation will guide you through creating a Shopify app using this template. --\u003e\n\nThe Remix app template comes with the following out-of-the-box functionality:\n\n- [OAuth](https://github.com/Shopify/shopify-app-js/tree/main/packages/shopify-app-remix#authenticating-admin-requests): Installing the app and granting permissions\n- [GraphQL Admin API](https://github.com/Shopify/shopify-app-js/tree/main/packages/shopify-app-remix#using-the-shopify-admin-graphql-api): Querying or mutating Shopify admin data\n- [Webhooks](https://github.com/Shopify/shopify-app-js/tree/main/packages/shopify-app-remix#authenticating-webhook-requests): Callbacks sent by Shopify when certain events occur\n- [AppBridge](https://shopify.dev/docs/api/app-bridge): This template uses the next generation of the Shopify App Bridge library which works in unison with previous versions.\n- [Polaris](https://polaris.shopify.com/): Design system that enables apps to create Shopify-like experiences\n\n## Tech Stack\n\nThis template uses [Remix](https://remix.run). The following Shopify tools are also included to ease app development:\n\n- [Shopify App Remix](https://shopify.dev/docs/api/shopify-app-remix) provides authentication and methods for interacting with Shopify APIs.\n- [Shopify App Bridge](https://shopify.dev/docs/apps/tools/app-bridge) allows your app to seamlessly integrate your app within Shopify's Admin.\n- [Polaris React](https://polaris.shopify.com/) is a powerful design system and component library that helps developers build high quality, consistent experiences for Shopify merchants.\n- [Webhooks](https://github.com/Shopify/shopify-app-js/tree/main/packages/shopify-app-remix#authenticating-webhook-requests): Callbacks sent by Shopify when certain events occur\n- [Polaris](https://polaris.shopify.com/): Design system that enables apps to create Shopify-like experiences\n\n## Resources\n\n- [Remix Docs](https://remix.run/docs/en/v1)\n- [Shopify App Remix](https://shopify.dev/docs/api/shopify-app-remix)\n- [Introduction to Shopify apps](https://shopify.dev/docs/apps/getting-started)\n- [App authentication](https://shopify.dev/docs/apps/auth)\n- [Shopify CLI](https://shopify.dev/docs/apps/tools/cli)\n- [App extensions](https://shopify.dev/docs/apps/app-extensions/list)\n- [Shopify Functions](https://shopify.dev/docs/api/functions)\n- [Getting started with internationalizing your app](https://shopify.dev/docs/apps/best-practices/internationalization/getting-started)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frajdeepds%2Fedge-timer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frajdeepds%2Fedge-timer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frajdeepds%2Fedge-timer/lists"}