{"repo":"leomorpho/goship","free":true,"listed":false,"github":"https://github.com/leomorpho/goship","clone":"git clone https://github.com/leomorpho/goship.git","description":"Opinionated Go + HTMX framework for shipping production apps fast ⛵️","language":"Go","stars":457,"topics":["boilerplate","deployment","entrepreneurship","full-stack","golang","kit","open-source","postgresql","saas","saas-boilerplate","sqlite3","starter-kit","typesafe"],"license":"MIT","category":"saas_boilerplate","readme_excerpt":"## GoShip: Ship in Record Time ⛵️🛟⚓️📦\n\n### A Go + HTMX boilerplate with all the essentials for your SaaS, AI tools, or web apps. Start earning online quickly without the hassle.\n\n🎯 **The goal of this project** is to build the most comprehensive Go-centric OSS starter boilerplate to ship projects fast.\n\n<!-- [![Go Report Card](https://goreportcard.com/badge/github.com/mikestefanello/pagoda)](https://goreportcard.com/report/github.com/mikestefanello/pagoda) -->\n[![Test](https://github.com/leomorpho/GoShip/actions/workflows/test.yml/badge.svg)](https://github.com/leomorpho/GoShip/actions/workflows/test.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n\n<p align=\"center\"><img alt=\"Logo\" src=\"https://goship-static.s3.us-west-002.backblazeb2.com/assets/goship.png\" height=\"200px\"/></p>\n\n<p align=\"center\">\n  <a href=\"http://www.youtube.com/watch?feature=player_embedded&v=Mnti8f-4bp0\" target=\"_blank\"><img src=\"https://goship-static.s3.us-west-002.backblazeb2.com/assets/git-repo-video-overview-frame.jpg\" \n  alt=\"Rapid walktrough of project\" style=\"max-width: 100%; height: auto; border: 10px;\" /></a>\n</p>\n\n<p style=\"text-align:center;\">Check out the video above for a rapid walkthrough of the project! 🏂</p>\n\nThis started as a fork of [pagoda](https://github.com/mikestefanello/pagoda), for which I am super grateful! Big shoutout to Mike Stefanello and team!\n<p align=\"center\"><img alt=\"Logo\" src=\"https://user-images.githubusercontent.com/552328/147838644-0efac538-a97e-4a46-86a0-41e3abdf9f20.png\" height=\"100px\"/></p>\n\n### Getting Started\n\nMake sure you have `make` and Golang installed on your machine.\n\nTo get up and running with GoShip:\n```bash\n# The below command will:\n# - set up the postgres/redis/mailer containers\n# - build the JS/CSS assets \n# - seed the DB with test users\n# - start the project in watch mode\nmake init\n\n# Running init will fully scrap your state and start with fresh new containers. \n# After running `make init` the first time, just use the below for everyday work.\nmake watch\n```\n\nFor in-depth info on the architecture of the project, please see the [mikestefanello/pagoda](https://github.com/mikestefanello/pagoda) repo. There are some key differences, but since this was originally a fork, 99% of it still applies. I am working on creating clear and actionable documentation, but that is quite time-consuming, so don't hold your socks.\n\n### Motivation\n\nBuild the same rich interfaces you would build with Javascript frameworks, but with HTML and Go. Limit the number of tools you use. Develop rapidly.\n\n#### Why the Hell Do We Need Another Boilerplate?\n\nWell, I noticed that there were none for Go. Now, I know most Go folks like to build it all themselves. And while I love doing that myself, I have many project ideas for which I just want to build that specific project, not the entire infra surrounding it, like auth, notifications, payments, file uploads etc. This project has served me well in bringing to production many projects so far. It has evolved far beyond what I originally planned for, though there is still so much potentional to expand on and implement for.\n\nIf you'd like a no-nonesense (or not too much?) starter kit to get your next project to production ASAP, while also using awesome technologies like Go, you've found a suitable starting point!\n\n> **Warning alert!** this project is in active development as I am adding things after first trying them out in prod for [Chérie](https://cherie.chatbond.app/), a relationship app to grow your couple. Note that I would welcome any help to develop this boilerplate ❤️.\n\n### Features && Tech Stack\n \nSee [goship.run](https://goship.run). \n\n---\n\n# Documentation (WIP)\n\n## File Structure\n```bash\n|-- cmd\n|   |-- web # Web server\n|   |-- worker # Async worker\n|   |-- seed # Seeder\n|-- config # Config files where the non-secret config vars are stored and the config go struct is defined\n|-- pkg # Package imports\n|   |-- context # Context package to handle context across the app\n|   |-- controller # Controller package to handle requests and responses\n|   |-- domain # Domain objects that are used throughout the app, these should be specific to your app/project\n|   |-- funcmap # Custom template functions\n|   |-- htmx # HTMX lifecycle helpers\n|   |-- middleware # Middleware for the app\n|   |-- repos # Repositories\n|   |-- routes # Think of these as the controllers in a traditional MVC framework\n|   |-- services # Services on the Container struct\n|   |-- tasks # Task definitions\n|   |-- tests # Utility functions for testing\n|   |-- types # Struct types\n|-- templates # HTML templates\n|-- ent # Ent ORM, contains the schema for the DB as well as the generated code from the schema. Always commit this to git.\n\n# Everything else is not Go-specific\n|-- deploy.yml # Kamal deployment file\n|-- docker-compose.yml # Docker compose file for running the project locally with Docker Desktop\n|-- e2e_tests # Playwright E2E tests\n|-- scripts # Useful scripts\n|-- static # Static files\n|-- javascript # Any javascript app can be dropped here. JS and CSS will be built and bundled into a single file. It is currently set up solely for Vanilla JS and Svelte.\n|-- build.mjs # Build script for the JS defined in `./javascript` \n|-- .env # Secret environment variables\n|-- .kamal # Kamal hooks you can use to run commands in the project during deployment\n|-- .github # Github actions and secrets\n|-- .gitignore # Files to ignore when committing\n|-- tailwind.config.js # Tailwind config\n|-- tsconfig.json # Typescript config \n|-- Procfile # Defines the commands to run the project in watch mode\n|-- service-worker.js # Service worker for the PWA\n|-- pwabuilder-ios-wrapper # PWA iOS wrapper. Use as a guide for push notifications. \n```\n\n## Makefile\n\nThe Makefile is the main entry point for the project. It is used to build the project, run the project, and deploy the project.\n\nThe following commands are the most useful ones:\n```bash\nmake init # Initializes the project\nmake watch # Runs the project in watch mode, rebuilding assets as you go (JS, CSS, Templ, etc)\nmake test # Runs the tests\nmake e2eui # Runs the interactive e2e tests with Playwright # \nmake cover # Shows a Go coverage report of the tests\n\n# DB specific commands\nmake ent-new name=YourModelName # Creates a new ent schema file\nmake makemigrations # Creates a new migration file\nmake ent-gen # Generates the ent code from the schema\nmake migrate # Applies migrations\nmake inspecterd # Shows you a view of all your tables in a UI\nmake schema\n\n# Docker commands\nmake up # Starts the docker containers\nmake down # Stops the docker containers\nmake down-volume # Stops the docker containers and removes the volumes\nmake reset # Stops the docker containers and removes the volumes, then rebuilds the docker containers\n\n# Assets\nmake build-js # Builds the JS assets\nmake watch-js # Watches the JS assets and rebuilds them on change\nmake build-css # Builds the CSS assets\nmake watch-css # Watches the CSS assets and rebuilds them on change\n\n# Worker commands\nmake worker # Starts the worker\nmake worker-ui # Will open the terminal to the asynq worker UI\n\n# Stripe (payments)\nmake stripe-webhook # Sets up a webhook for stripe for local testing\n\nmake help # Shows all the commands you can run\n```\n\n## General Architecture\n\nFor in-depth info on the architecture of the project, please see the [mikestefanello/pagoda](https://github.com/mikestefanello/pagoda) repo. There are some key differences, but since this was originally a fork, 99% of it still applies. \n\nThe most important aspects to note are:\n- The `Container` struct is instantiated when the app starts up and is used to pass dependencies around the app, specifically core services like `Logger`, `Database`, `ORM`, `Cache`, etc.\n- Routes are defined in `routes/routes.go` and are registered to the `Echo` framework. Generally, any logic that alters the DB should be done in the `repos` layer so that it is easily testable, and can be used by other routes. A route will generally have a `Component`, which is a Templ component defined in `templates/pages/` that represents the view.\n\n## Database\n\nThe current options are:\n- Standalone Postgres DB (which you can host anywhere, including locally with Docker)\n  - For free deployments, see [Supabase](https://supabase.com/pricing) or [Neon](https://neon.tech/pricing). There are also other free options available, and if you host each one of your projects on a different DB, you can use the free tier for all your projects!\n- Embedded SQLite DB (which is great for small projects and local development)\n  \n\n## Starting DB State\n\nTo get a look at what tables are available to start off, you can run \n\n```bash\nmake schema\n```\n\nor go to `ent/schema` and see the declared schemas. Note that ent generates a lot of code. Do not remove it from git. In fact, make sure to keep it there. \n\nTo create a new schema, do:\n```bash\nmake ent-new name=YourSchemaName\n```\n\nThen generate the migrations\n```bash\nmake makemigrations\n```\n\nThen generate the ent generated code to interact with your new schema in Go:\n```bash\nmake ent-gen\n```\n\nTo apply the migrations, either run `make migrate` or do a `make reset` to start from scratch (often times easier, and your test DB should be treated as disposable).\n\n\n## Add a route\n\nCreate a new file in `routes/` and add your route. A route is a standard Echo handler with some added goodies. Once you've added handlers for your route, you can hook it up to the router in `routes/routes.go`, where the route should be registered to be reachable from the web.\n\n## Set Action Messages\n\nFollowing an action (POST/DELETE/GET/etc), a msg can be shown to the user. For example, a success message can shown with `msg.Success(\"An email confirmation was sent!\")` upon user registration. The following message types are currently available:\n- success\n- info\n- warning\n- danger\n\nSee `pkg/repos/msg/msg.go` for more info.\n\n## Realtime and Notifications\n\nThere i","default_branch":"main","files":584,"tree":[".air.toml",".dockerignore",".env.dev",".gitattributes",".github/workflows/test.yml",".gitignore",".kamal/hooks/post-deploy.sample",".kamal/hooks/post-traefik-reboot.sample",".kamal/hooks/pre-build.sample",".kamal/hooks/pre-connect.sample",".kamal/hooks/pre-deploy.sample",".kamal/hooks/pre-traefik-reboot.sample",".vscode/extensions.json",".vscode/settings.json",".vscode/tailwind.json","Dockerfile","LICENSE","Makefile","Procfile","README.md","build.mjs","cmd/seed/main.go","cmd/web/main.go","cmd/worker/main.go","config/config.go","config/config.yaml","config/config_test.go","config/firewalls/accessories.sh","config/firewalls/web-app.sh","config/firewalls/worker.sh","deploy/kamal/deploy.yml","docker-compose.yml","e2e_tests/config.js","e2e_tests/package-lock.json","e2e_tests/package.json","e2e_tests/playwright.config.ts","e2e_tests/tests/goship.spec.ts","e2e_tests/tests/helper.ts","ent/client.go","ent/emailsubscription.go","ent/emailsubscription/emailsubscription.go","ent/emailsubscription/where.go","ent/emailsubscription_create.go","ent/emailsubscription_delete.go","ent/emailsubscription_query.go","ent/emailsubscription_update.go","ent/emailsubscriptiontype.go","ent/emailsubscriptiontype/emailsubscriptiontype.go","ent/emailsubscriptiontype/where.go","ent/emailsubscriptiontype_create.go","ent/emailsubscriptiontype_delete.go","ent/emailsubscriptiontype_query.go","ent/emailsubscriptiontype_update.go","ent/emojis.go","ent/emojis/emojis.go","ent/emojis/where.go","ent/emojis_create.go","ent/emojis_delete.go","ent/emojis_query.go","ent/emojis_update.go","ent/ent.go","ent/enttest/enttest.go","ent/fcmsubscriptions.go","ent/fcmsubscriptions/fcmsubscriptions.go","ent/fcmsubscriptions/where.go","ent/fcmsubscriptions_create.go","ent/fcmsubscriptions_delete.go","ent/fcmsubscriptions_query.go","ent/fcmsubscriptions_update.go","ent/filestorage.go","ent/filestorage/filestorage.go","ent/filestorage/where.go","ent/filestorage_create.go","ent/filestorage_delete.go","ent/filestorage_query.go","ent/filestorage_update.go","ent/generate.go","ent/hook/custom_hook.go","ent/hook/hook.go","ent/image.go","ent/image/image.go","ent/image/where.go","ent/image_create.go","ent/image_delete.go","ent/image_query.go","ent/image_update.go","ent/imagesize.go","ent/imagesize/imagesize.go","ent/imagesize/where.go","ent/imagesize_create.go","ent/imagesize_delete.go","ent/imagesize_query.go","ent/imagesize_update.go","ent/invitation.go","ent/invitation/invitation.go","ent/invitation/where.go","ent/invitation_create.go","ent/invitation_delete.go","ent/invitation_query.go","ent/invitation_update.go","ent/lastseenonline.go","ent/lastseenonline/lastseenonline.go","ent/lastseenonline/where.go","ent/lastseenonline_create.go","ent/lastseenonline_delete.go","ent/lastseenonline_query.go","ent/lastseenonline_update.go","ent/migrate/migrate.go","ent/migrate/migrations/20240903200944.sql","ent/migrate/migrations/20240907154749.sql","ent/migrate/migrations/20240907155651.sql","ent/migrate/migrations/20240907160557.sql","ent/migrate/migrations/20240907214903.sql","ent/migrate/migrations/atlas.sum","ent/migrate/schema.go","ent/monthlysubscription.go","ent/monthlysubscription/monthlysubscription.go","ent/monthlysubscription/where.go","ent/monthlysubscription_create.go","ent/monthlysubscription_delete.go","ent/monthlysubscription_query.go","ent/monthlysubscription_update.go","ent/mutation.go","ent/notification.go","ent/notification/notification.go","ent/notification/where.go","ent/notification_create.go","ent/notification_delete.go","ent/notification_query.go","ent/notification_update.go","ent/notificationpermission.go","ent/notificationpermission/notificationpermission.go","ent/notificationpermission/where.go","ent/notificationpermission_create.go","ent/notificationpermission_delete.go","ent/notificationpermission_query.go","ent/notificationpermission_update.go","ent/notificationtime.go","ent/notificationtime/notificationtime.go","ent/notificationtime/where.go","ent/notificationtime_create.go","ent/notificationtime_delete.go","ent/notificationtime_query.go","ent/notificationtime_update.go","ent/passwordtoken.go","ent/passwordtoken/passwordtoken.go","ent/passwordtoken/where.go","ent/passwordtoken_create.go","ent/passwordtoken_delete.go","ent/passwordtoken_query.go","ent/passwordtoken_update.go","ent/phoneverificationcode.go","ent/phoneverificationcode/phoneverificationcode.go","ent/phoneverificationcode/where.go","ent/phoneverificationcode_create.go","ent/phoneverificationcode_delete.go","ent/phoneverificationcode_query.go","ent/phoneverificationcode_update.go","ent/predicate/predicate.go","ent/profile.go","ent/profile/profile.go","ent/profile/where.go","ent/profile_create.go","ent/profile_delete.go","ent/profile_query.go","ent/profile_update.go","ent/pwapushsubscription.go","ent/pwapushsubscription/pwapushsubscription.go","ent/pwapushsubscription/where.go","ent/pwapushsubscription_create.go","ent/pwapushsubscription_delete.go","ent/pwapushsubscription_query.go","ent/pwapushsubscription_update.go","ent/runtime.go","ent/runtime/runtime.go","ent/schema/emailsubscription.go","ent/schema/emailsubscriptiontype.go","ent/schema/emojis.go","ent/schema/fcmsubscriptions.go","ent/schema/filestorage.go","ent/schema/image.go","ent/schema/imagesize.go","ent/schema/invitation.go","ent/schema/lastseenonline.go","ent/schema/mixin.go","ent/schema/monthlysubscription.go","ent/schema/notification.go","ent/schema/notificationpermission.go","ent/schema/notificationtime.go","ent/schema/passwordtoken.go","ent/schema/phoneverificationcode.go","ent/schema/profile.go","ent/schema/pwapushsubscription.go","ent/schema/sentemail.go","ent/schema/user.go","ent/sentemail.go","ent/sentemail/sentemail.go","ent/sentemail/where.go","ent/sentemail_create.go","ent/sentemail_delete.go","ent/sentemail_query.go","ent/sentemail_update.go","ent/tx.go","ent/user.go","ent/user/user.go","ent/user/where.go","ent/user_create.go","ent/user_delete.go","ent/user_query.go","ent/user_update.go","entrypoint.sh","go.mod","go.sum","javascript/svelte/components/MultiSelectComponent.svelte","javascript/svelte/components/NotificationPermissions.svelte","javascript/svelte/components/PhoneNumberPicker.svelte","javascript/svelte/components/PhotoUploader.svelte","javascript/svelte/components/PwaInstallButton.svelte","javascript/svelte/components/PwaSubscribePushChecker.svelte","javascript/svelte/components/SingleSelect.svelte","javascript/svelte/components/SvelteTodoComponent.svelte","javascript/svelte/components/ThemeToggle.svelte","javascript/svelte/components/notifications/EmailSubscribe.svelte","javascript/svelte/components/notifications/IOSSubscribePush.svelte","javascript/svelte/components/notifications/IndividualNotificationPermission.svelte","javascript/svelte/components/notifications/PermissionButton.svelte","javascript/svelte/components/notifications/PwaSubscribePush.svelte","javascript/svelte/components/notifications/SmsSubscribe.svelte","javascript/svelte/components/notifications/_NotificationPermission.svelte","javascript/svelte/components/notifications/icons/EmailDisabledIcon.svelte","javascript/svelte/components/notifications/icons/EmailEnabledIcon.svelte","javascript/svelte/components/notifications/icons/LoadingSpinner.svelte","javascript/svelte/components/notifications/icons/PushDisabledIcon.svelte","javascript/svelte/components/notifications/icons/PushEnabledIcon.svelte","javascript/svelte/components/notifications/icons/SmsDisabledIcon.svelte","javascript/svelte/components/notifications/icons/SmsEnabledIcon.svelte","javascript/svelte/components/utils.js","javascript/svelte/main.js","javascript/vanilla/cal_heatmap.js","javascript/vanilla/load_scripts_and_styles.js","javascript/vanilla/main.js","javascript/vanilla/test_quiz.js","package-lock.json","package.json","pgvector-image/Dockerfile","pgvector-image/init_pgvector.sh","pkg/context/context.go","pkg/context/context_test.go","pkg/controller/controller.go","pkg/controller/controller_test.go","pkg/controller/form.go","pkg/controller/form_test.go","pkg/controller/page.go","pkg/controller/page_test.go","pkg/controller/pager.go","pkg/controller/pager_test.go","pkg/domain/constants.go","pkg/domain/enum.go","pkg/domain/maps.go","pkg/domain/struct.go","pkg/funcmap/funcmap.go","pkg/funcmap/funcmap_test.go","pkg/htmx/htmx.go","pkg/htmx/htmx_test.go","pkg/middleware/auth.go","pkg/middleware/auth_test.go","pkg/middleware/cache.go","pkg/middleware/cache_test.go","pkg/middleware/device.go","pkg/middleware/entity.go","pkg/middleware/entity_test.go","pkg/middleware/lastseenonline.go","pkg/middleware/log.go","pkg/middleware/log_test.go","pkg/middleware/middleware_test.go","pkg/middleware/onboarding.go","pkg/middleware/sentry.go","pkg/repos/emailsmanager/emailsubscriptionrepo.go","pkg/repos/emailsmanager/emailsubscriptionrepo_test.go","pkg/repos/emailsmanager/update_email.go","pkg/repos/emailsmanager/update_email_test.go","pkg/repos/mailer/mailer.go","pkg/repos/mailer/resend.go","pkg/repos/mailer/smtp.go","pkg/repos/msg/msg.go","pkg/repos/msg/msg_test.go","pkg/repos/notifierrepo/notificationstoragerepo.go","pkg/repos/notifierrepo/notificationstoragerepo_test.go","pkg/repos/notifierrepo/notifier.go","pkg/repos/notifierrepo/notifier_test.go","pkg/repos/notifierrepo/permissions.go","pkg/repos/notifierrepo/permissions_test.go","pkg/repos/notifierrepo/planned_notifications.go","pkg/repos/notifierrepo/planned_notifications_test.go","pkg/repos/notifierrepo/push_notifications_fcm.go","pkg/repos/notifierrepo/push_notifications_fcm_test.go","pkg/repos/notifierrepo/push_notifications_pwa.go","pkg/repos/notifierrepo/sms.go","pkg/repos/profilerepo/profilerepo.go","pkg/repos/profilerepo/profilerepo_test.go","pkg/repos/pubsub/pubsub.go","pkg/repos/storage/mocks.go","pkg/repos/storage/storagerepo.go","pkg/repos/subscriptions/subscriptions.go","pkg/repos/subscriptions/subscriptions_test.go","pkg/routing/routenames/routenames.go","pkg/routing/routes/about.go","pkg/routing/routes/about_test.go","pkg/routing/routes/clear_site_cookie.go","pkg/routing/routes/contact.go","pkg/routing/routes/delete_account.go","pkg/routing/routes/docs.go","pkg/routing/routes/email_subscribe.go","pkg/routing/routes/error.go","pkg/routing/routes/forgot_password.go","pkg/routing/routes/healthcheck.go","pkg/routing/routes/helpers.go","pkg/routing/routes/home.go","pkg/routing/routes/home_feed.go","pkg/routing/routes/install_app.go","pkg/routing/routes/landing.go","pkg/routing/routes/login.go","pkg/routing/routes/logout.go","pkg/routing/routes/notifications.go","pkg/routing/routes/payments.go","pkg/routing/routes/preferences.go","pkg/routing/routes/privacy.go","pkg/routing/routes/profile.go","pkg/routing/routes/profile_photo.go","pkg/routing/routes/push_notifs.go","pkg/routing/routes/realtime.go","pkg/routing/routes/register.go","pkg/routing/routes/register_test.go","pkg/routing/routes/reset_password.go","pkg/routing/routes/router.go","pkg/routing/routes/routes_test.go","pkg/routing/routes/upload_photo.go","pkg/routing/routes/verify_email.go","pkg/routing/routes/verify_email_subscription.go","pkg/services/auth.go","pkg/services/auth_test.go","pkg/services/cache.go","pkg/services/cache_test.go","pkg/services/container.go","pkg/services/container_test.go","pkg/services/services_test.go","pkg/services/tasks.go","pkg/services/tasks_test.go","pkg/services/validator.go","pkg/services/validator_test.go","pkg/tasks/mail.go","pkg/tasks/notifications.go","pkg/tasks/subscriptions.go","pkg/tests/tests.go","pkg/types/about.go","pkg/types/committed.go","pkg/types/contact.go","pkg/types/email_subscribe.go","pkg/types/emails.go","pkg/types/forgot_password.go","pkg/types/home.go","pkg/types/home_feed.go","pkg/types/invitations.go","pkg/types/landing_page.go","pkg/types/login.go","pkg/types/notifications.go","pkg/types/page_data.go","pkg/types/payments.go","pkg/types/preferences.go","pkg/types/profile.go","pkg/types/register.go","pkg/types/reset_password.go","pkg/types/search.go","pwabuilder-ios-wrapper/next-steps.html","pwabuilder-ios-wrapper/src/.gitignore","pwabuilder-ios-wrapper/src/Cherie.xcodeproj/project.pbxproj","pwabuilder-ios-wrapper/src/Cherie.xcodeproj/project.xcworkspace/contents.xcworkspacedata","pwabuilder-ios-wrapper/src/Cherie.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist","pwabuilder-ios-wrapper/src/Cherie.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings","pwabuilder-ios-wrapper/src/Cherie.xcodeproj/xcshareddata/xcschemes/Cherie.xcscheme","pwabuilder-ios-wrapper/src/Cherie.xcworkspace/contents.xcworkspacedata","pwabuilder-ios-wrapper/src/Cherie.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist","pwabuilder-ios-wrapper/src/Cherie/AppDelegate.swift","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/100.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/1024.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/114.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/120.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/128.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/144.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/152.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/16.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/167.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/180.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/20.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/256.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/29.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/32.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/40.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/50.png","pwabuilder-ios-wrapper/src/Cherie/Assets.xcassets/AppIcon.appiconset/512.png"],"storefront":"/r/leomorpho","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/leomorpho/goship/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}