It's an all-in-one system for businesses and organizations that do things the right way. Batteries are included - manage your website, mailing list, store, and reporting all in one. It's free.
There are tons of good systems out there. Inkshop sticks out because it's people-focused. It treats you, your customers, and your visitors like people, not data points.
That means no creepy tracking, no big-data segmentation, and encryption baked-in to provide strong privacy protection for both you and your customers.
Feedback, improvements, and contributions are welcome. :)
Note on naming: It's entirely possible this project will be renamed Shopmonsters. And have monsters. We'll see. :)
When it's at 1.0, this project will let you:
- Manage an email list, using best practices for deliverability
- Host a website, with pages and blog posts
- Sell downloadable digital products
- Sell hosted digital products, including customer authentication and secure data storage
- Understand what pages are generating the most traffic
- Create shortened URLs for sharing with social media
- Show up on Google and other search engines with good visibility
- Test different versions of content on your site
- Share posts to social media
- Protect your sanity against trolls and abusive people
- Export and backup every bit of data in the system. Import it back again.
It won't ever let you:
- Spam people who haven't fully consented to receive your mailings
- Personally identify a single site visitor
- Include creepy tracking software like the Facebook pixel.
- Track whether people have opened the messages you've sent.
- Break GDPR or similar laws
Some core principles that set it apart:
Real email.
Engaged subscription, built on active, positive consent and auto-unsubscribing.
Get amazing deliverability and response by sending emails only to people who have shown you that they're interested and want to keep hearing from you.
Fast.
Built around the very best practices, and without all the bulk of tracking software, your site renders fast. Like you won't see the screen refresh fast. On mobile and desktop.
Complete.
One of the big trends has been having a specialized system for everything, and plugging them into each other. But that means your and your customer's data is spread out in a dozen places you can't control. Inkshop bucks that trend, and puts everything you need in one user-friendly place.
Compliant.
Inkshop does things the right way, and so you'll automatically comply with current - and future - privacy regulation.
I'm bootstrapping this project on my own site, Ink and Feet. It's currently running my mailing list on it (but not my site yet). However, unless you're a professional programmer or super risk tolerant, I wouldn't advise you move your list over to it just yet. It's been two weeks. Give it at least a month or two. :)
You can read more about the decision to move to inkshop in this open letter.
I'll be moving from a setup with:
- Static site generated by inkblock, and served by Dreamhost and Cloudflare
- Mailing list managed by Ontraport
- Redirects and url shortening run by inkdots and Bitly.
- Analytics from Google Analytics and Woopra
- A/B testing from Optimizely
- Digital product sales managed by Ontraport and Teachery
Right now, it handles:
- Subscribe
- Create mailing lists
- Send message to a mailing list
- Import data
- Unsubscribe
- Love and positive consent
- Receive replies
- Create pages and posts
- Build templates for your website
- Add links (with thumbnails)
- Host static site resources
git clone https://github.com/inkandfeet/inkshop.git
cd inkshop
cp env.sample .env
# Edit .env with your values
cp initial_data.yml.sample initial_data.yml
# Edit initial_data.yml with your basic information.
docker network create inkshop
docker-compose run db bash
$ createdb inkshop -h db -U $POSTGRES_USER
# Set up testing frameworks
npm i -g cypress @4tw/cypress-drag-drop
npm i
# Load your initial data
docker-compose run inkshop python3 manage.py migrate
docker-compose run inkshop python3 manage.py load_initial_data
docker-compose up
Tests are wrapped with polytester.
One-offs:
docker-compose run inkshop pt
Development:
docker-compose run inkshop pt --autoreload
Cypress (all e2e tests besides purchase)
# npx run cypress
cypress open
Puppeteer (purchase e2e tests with Stripe's test servers)
node tests/puppeteer/purchase_sprint.js
node tests/puppeteer/purchase_nobullshit.js
Ontraport:
python3 manage.py import_ontraport_csv --subscribers subscribers.csv --hard_bounce hard_bounces.csv --newsletter my-newsletter
- Pyca Cryptograpy for encryption.
- Cloudflare for DNS, Caching, and Development redirects
- Mailgun for email sending.
- AWS S3 for uploads and static file serving.
- Postgres for database.
- Redis for caching and queuing.
- Docker for encapsulation and dev ease.
- Heroku for deployment.
- Websockets for realtime, replicated, client-side storage.
Next Small Projects:
- Clubhouse enhancements
- It is the ugliest site in the history of humanity. Full of heart, but not design or style. Clean it up.
- handle subscribes between scheduling and sending (aka queueing outgoingmessages should just hold until the send time.)
- delete account flow finished
- Website enhancements
- LESS support
- Inkmail enhancements
- add fallback reward gif
- Move all inkmail helpers to tasks? Think about abstraction this.
- Auto-delete any un-clicked confirmations after 7 days.
- Handle if people click them later, make sure we never delete people who were already subscribed, etc.
- GDPR/Data export
Big Projects:
- Vault
- Full system data export/import
- Encrypted backups
- Object history?
- Personal data export
- Inkdots
- Inkmail - handle replies through the system, allow lookup in gmail.
- Deployment/hosting
-
Repackage for production w/ Docker/self-hosting? See this issue https://github.com/caktus/dockerfile_post/
-
How are replies in app handled? Prior art
-
Structure for GDPR dump. JSON? Zip?
-
Structure for full-system export/import. JSON? Zip?
-
Import flow for people who don't have double-opt-in records.
-
Editor / cleanup in clubhouse. Look at https://alloyeditor.com/
-
Implement filtering, to make sure no data escapes: https://docs.djangoproject.com/en/1.11/howto/error-reporting/#filtering-error-reports