
Product
Announcing Precomputed Reachability Analysis in Socket
Socket’s precomputed reachability slashes false positives by flagging up to 80% of vulnerabilities as irrelevant, with no setup and instant results.
@bryt-designs/create-shopify-app-challenge
Advanced tools
This is a template for building a Shopify app using the Remix framework.
Rather than cloning this repo, you can use your preferred package manager and the Shopify CLI with these steps.
Visit the shopify.dev
documentation for more details on the Remix app package.
Before you begin, you'll need the following:
If you used the CLI to create the template, you can skip this section.
Using yarn:
yarn install
Using npm:
npm install
Using pnpm:
pnpm install
Using yarn:
yarn dev
Using npm:
npm run dev
Using pnpm:
pnpm run dev
Press P to open the URL to your app. Once you click install, you can start development.
Local development is powered by the Shopify 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.
To authenticate and query data you can use the shopify
const that is exported from /app/shopify.server.js
:
export async function loader({ request }) {
const { admin } = await shopify.authenticate.admin(request);
const response = await admin.graphql(`
{
products(first: 25) {
nodes {
title
description
}
}
}`);
const {
data: {
products: { nodes },
},
} = await response.json();
return nodes;
}
This template comes preconfigured with examples of:
Please read the documentation for @shopify/shopify-app-remix to understand what other API's are available.
This template uses Prisma to store session data, by default using an SQLite database.
The database is defined as a Prisma schema in prisma/schema.prisma
.
This use of SQLite works in production if your app runs as a single instance. The database that works best for you depends on the data your app needs and how it is queried. You can run your database of choice on a server yourself or host it with a SaaS company. Here’s a short list of databases providers that provide a free tier to get started:
Database | Type | Hosters |
---|---|---|
MySQL | SQL | Digital Ocean, Planet Scale, Amazon Aurora, Google Cloud SQL |
PostgreSQL | SQL | Digital Ocean, Amazon Aurora, Google Cloud SQL |
Redis | Key-value | Digital Ocean, Amazon MemoryDB |
MongoDB | NoSQL / Document | Digital Ocean, MongoDB Atlas |
To use one of these, you can use a different datasource provider in your schema.prisma
file, or a different SessionStorage adapter package.
Remix handles building the app for you, by running the command below with the package manager of your choice:
Using yarn:
yarn build
Using npm:
npm run build
Using pnpm:
pnpm run build
When you're ready to set up your app in production, you can follow our deployment documentation to host your app on a cloud provider like Heroku or Fly.io.
When you reach the step for setting up environment variables, you also need to set the variable NODE_ENV=production
.
Using 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.
// vite.config.ts
import { vitePlugin as remix } from "@remix-run/dev";
import { defineConfig, type UserConfig } from "vite";
import tsconfigPaths from "vite-tsconfig-paths";
+ import { vercelPreset } from '@vercel/remix/vite';
installGlobals();
export default defineConfig({
plugins: [
remix({
ignoredRouteFiles: ["**/.*"],
+ presets: [vercelPreset()],
}),
tsconfigPaths(),
],
});
If you get this error:
The table `main.Session` does not exist in the current database.
You need to create the database for Prisma. Run the setup
script in package.json
using your preferred package manager.
Embedded Shopify apps must maintain the user session, which can be tricky inside an iFrame. To avoid issues:
Link
from @remix-run/react
or @shopify/polaris
. Do not use <a>
.redirect
helper returned from authenticate.admin
. Do not use redirect
from @remix-run/node
useSubmit
or <Form/>
from @remix-run/react
. Do not use a lowercase <form/>
.This only applies if you app is embedded, which it will be by default.
Shopify apps are best when they are embedded into the Shopify Admin. This template is configured that way. If you have a reason to not embed your please make 2 changes:
isEmbeddedApp
prop to false for the AppProvider
in /app/routes/app.jsx
window.shopify
) from your codeapp/shopify.server.js
. Pass isEmbeddedApp: false
If 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.
To do that, you can run the deploy
CLI command.
Using yarn:
yarn deploy
Using npm:
npm run deploy
Using pnpm:
pnpm run deploy
If you are registering webhooks in the afterAuth
hook, using shopify.registerWebhooks
, you may find that your subscriptions aren't being updated.
Instead 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:
If you do need shop-specific webhooks, please keep in mind that the package calls afterAuth
in 2 scenarios:
During 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.
Webhooks subscriptions created in the Shopify admin will fail HMAC validation. This is because the webhook payload is not signed with your app's secret key. There are 2 solutions:
shopifyApp
object.Test your webhooks with the Shopify CLI or by triggering events manually in the Shopify admin(e.g. Updating the product title to trigger a PRODUCTS_UPDATE
).
By default the graphql.vscode-graphql extension for VS Code will assume that GraphQL queries or mutations are for the Shopify Admin API. This is a sensible default, but it may not be true if:
in this situation, please update the .graphqlrc.ts config.
See hosting on Vercel.
When 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.
Webhooks 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.
To test streaming using defer/await during local development you'll need to use the Shopify CLI slightly differently:
ngrok http 8080
.https://f355-2607-fea8-bb5c-8700-7972-d2b5-3f2b-94ab.ngrok-free.app
yarn shopify app dev --tunnel-url=TUNNEL_URL:8080
replacing TUNNEL_URL
for the address you copied in step 3.By default the CLI uses a cloudflare tunnel. Unfortunately it cloudflare tunnels wait for the Response stream to finish, then sends one chunk.
This will not affect production, since tunnels are only for local development.
By 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.
Alternatively you can use a MongDB database directly with the MongoDB session storage adapter.
In MongoDB, an ID must be a single field that defines an @id attribute and a @map("_id") attribute. The prisma adapter expects the ID field to be the ID of the session, and not the _id field of the document.
To 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
model Session {
session_id String @id @default(auto()) @map("_id") @db.ObjectId
id String @unique
...
}
MongoDB does not support the prisma migrate command. Instead, you can use the prisma db push command and update the shopify.web.toml
file with the following commands. If you are using MongoDB please see the Prisma documentation for more information.
[commands]
predev = "npx prisma generate && npx prisma db push"
dev = "npm exec remix vite:dev"
See the Prisma documentation for connecting to a MongoDB database.
Currently, 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+.
You 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:
Dockerfile
to pull FROM node:20-alpine
instead of node:18-alpine
Shopify apps are built on a variety of Shopify tools to create a great merchant experience.
The Remix app template comes with the following out-of-the-box functionality:
This template uses Remix. The following Shopify tools are also included to ease app development:
FAQs
Start template for building a shopify app.
The npm package @bryt-designs/create-shopify-app-challenge receives a total of 0 weekly downloads. As such, @bryt-designs/create-shopify-app-challenge popularity was classified as not popular.
We found that @bryt-designs/create-shopify-app-challenge demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Product
Socket’s precomputed reachability slashes false positives by flagging up to 80% of vulnerabilities as irrelevant, with no setup and instant results.
Product
Socket is launching experimental protection for Chrome extensions, scanning for malware and risky permissions to prevent silent supply chain attacks.
Product
Add secure dependency scanning to Claude Desktop with Socket MCP, a one-click extension that keeps your coding conversations safe from malicious packages.