Mo El Mahallawy
Co-Founder & CTO
September 8, 2021
What are the tools that help us run our business? Here is a preview:
Banking: Brex
Shares and certificate management: Carta
Product management: Linear.app
Data management: Airtable
Design: Figma
Documents: Notion and Google Docs
Communication: Slack
Email: Google and Superhuman
Calendar: Calendly
Password management: 1Password
Music: Spotify
Source control: Github
Asset management: S3
Content management: Contentful
Transactional emails: Sendgrid
Office space: WeWork
Coffee: La Colombe
Frontend deployment and hosting: Vercel/Nextjs
Frontend stack: Nextjs, React, Ant Design, Apollo GraphQL
API deployment: Heroku
Error tracking: Sentry
I often times find myself looking at a project's package.json to get an idea of what tools or packages they are using and to discover new ways of doing things. Here is ours:
Frontend
{
"dependencies": {
"@ant-design/icons": "^4.4.0",
"@apollo/client": "^3.3.7",
"@flatfile/react": "^0.4.3",
"@hookform/error-message": "^2.0.0",
"@hookform/resolvers": "^2.6.0",
"@monaco-editor/react": "^4.1.3",
"@next/bundle-analyzer": "^10.0.7",
"@segment/analytics.js-core": "^4.1.10",
"@segment/snippet": "^4.13.2",
"@sentry/browser": "^6.9.0",
"@sentry/integrations": "^6.9.0",
"@sentry/node": "^6.9.0",
"@sentry/tracing": "^6.9.0",
"@sentry/webpack-plugin": "^1.14.0",
"@testing-library/dom": "^8.1.0",
"@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^12.0.0",
"@testing-library/user-event": "^13.2.1",
"@types/classnames": "^2.2.11",
"@types/deep-equal": "^1.0.1",
"@types/faker": "^5.5.5",
"@types/lodash": "^4.14.165",
"@types/next-seo": "^2.1.2",
"@types/node": "^14.14.11",
"@types/omit-deep-lodash": "^1.1.1",
"@types/pluralize": "^0.0.29",
"@types/randomcolor": "^0.5.5",
"@types/react": "^17.0.0",
"@types/react-beautiful-dnd": "^13.0.0",
"@types/react-dom": "^17.0.0",
"@types/react-scrollspy": "^3.3.3",
"@types/react-signature-canvas": "^1.0.1",
"@types/uuid": "^8.3.0",
"@types/validator": "^13.1.3",
"@uploadcare/react-widget": "^1.3.4",
"@uploadcare/upload-client": "^1.1.2",
"airtable": "^0.10.1",
"antd": "4.12.3",
"apollo-link-sentry": "^2.0.1",
"babel-plugin-add-react-displayname": "^0.0.5",
"babel-plugin-import": "^1.13.3",
"caniuse-lite": "^1.0.30001180",
"classnames": "^2.2.6",
"codemirror": "^5.58.3",
"console": "^0.7.2",
"country-list": "^2.2.0",
"cross-fetch": "^3.0.6",
"cypress-file-upload": "^5.0.7",
"dayjs": "^1.10.3",
"deep-equal": "^2.0.5",
"deep-object-diff": "^1.1.0",
"eslint-plugin-cypress": "^2.11.3",
"eslint-plugin-jest": "^24.3.6",
"eslint-plugin-jest-dom": "^3.9.0",
"eslint-plugin-mocha": "^9.0.0",
"faker": "^5.5.3",
"fast-deep-equal": "^3.1.3",
"final-form": "^4.20.2",
"final-form-arrays": "^3.0.2",
"final-form-calculate": "^1.3.2",
"final-form-focus": "^1.1.2",
"format-string-by-pattern": "^1.2.2",
"grant": "^5.4.15",
"graphql": "^15.4.0",
"hot-formula-parser": "^3.0.2",
"isomorphic-unfetch": "^3.1.0",
"jest-canvas-mock": "^2.3.1",
"jest-fetch-mock": "^3.0.3",
"lodash": "^4.17.15",
"logrocket": "^1.0.14",
"logrocket-react": "^4.0.1",
"moment": "^2.29.1",
"msw": "^0.33.1",
"next": "^11.1.0",
"next-compose-plugins": "^2.2.0",
"next-connect": "^0.10.1",
"next-fonts": "^1.0.3",
"next-page-tester": "^0.27.2",
"next-seo": "^4.17.0",
"null-loader": "^4.0.1",
"object.defaults": "^1.1.0",
"omit-deep": "^0.3.0",
"omit-deep-lodash": "^1.1.5",
"path-parser": "^6.1.0",
"performance-now": "^2.1.0",
"pluralize": "^8.0.0",
"provinces-ca": "^1.0.0",
"qs": "^6.10.1",
"randomcolor": "^0.6.2",
"react": "^17.0.2",
"react-beautiful-dnd": "^13.1.0",
"react-confetti": "^6.0.1",
"react-cookie": "^4.0.3",
"react-dnd": "^14.0.2",
"react-dnd-html5-backend": "^14.0.0",
"react-dom": "^17.0.2",
"react-final-form": "^6.5.3",
"react-final-form-arrays": "^3.1.3",
"react-final-form-listeners": "^1.0.3",
"react-hook-form": "^7.11.1",
"react-markdown": "^6.0.2",
"react-scrollspy": "^3.4.3",
"react-signature-canvas": "^1.0.3",
"react-use": "^15.3.8",
"responsive-loader": "^2.2.1",
"states-us": "^1.0.1",
"string-humanize": "^1.0.1",
"titleize": "^2.1.0",
"tozod": "^0.1.4",
"type-fest": "^1.2.0",
"typescript": "^4.3.2",
"typescript-coverage-report": "^0.6.0",
"universal-cookie": "^4.0.4",
"uuid": "^8.3.2",
"validator": "^13.5.2",
"zod": "^3.5.1"
},
"devDependencies": {
"@babel/core": "^7.12.10",
"@graphql-codegen/cli": "1.20.0",
"@graphql-codegen/fragment-matcher": "^2.0.1",
"@graphql-codegen/import-types-preset": "^1.18.1",
"@graphql-codegen/introspection": "1.18.1",
"@graphql-codegen/jsdoc": "^1.17.9",
"@graphql-codegen/named-operations-object": "^1.17.9",
"@graphql-codegen/near-operation-file-preset": "^1.17.13",
"@graphql-codegen/schema-ast": "^1.18.1",
"@graphql-codegen/typed-document-node": "^1.18.2",
"@graphql-codegen/typescript": "1.20.0",
"@graphql-codegen/typescript-apollo-client-helpers": "^1.1.2",
"@graphql-codegen/typescript-document-nodes": "^1.17.9",
"@graphql-codegen/typescript-operations": "1.17.13",
"@graphql-codegen/typescript-react-apollo": "2.2.1",
"@graphql-eslint/eslint-plugin": "^1.0.1",
"@graphql-typed-document-node/core": "^3.1.0",
"@types/gtag.js": "^0.0.4",
"@types/jest": "^26.0.23",
"@typescript-eslint/eslint-plugin": "^4.14.1",
"@typescript-eslint/parser": "^4.14.1",
"babel-plugin-graphql-tag": "^3.1.0",
"cypress": "^8.3.1",
"eslint": "^7.18.0",
"eslint-config-airbnb": "^18.2.1",
"eslint-config-airbnb-typescript": "^12.0.0",
"eslint-config-next": "^11.0.0",
"eslint-config-prettier": "^7.2.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-react": "^7.22.0",
"eslint-plugin-react-hooks": "^4.2.0",
"eslint-plugin-unused-imports": "^1.0.1",
"graphql-codegen-apollo-next-ssr": "^1.3.0",
"husky": "^4.3.8",
"jest": "^27.0.5",
"less": "^4.1.1",
"lint-staged": "^10.5.3",
"prettier": "^2.2.1",
"ts-jest": "^27.0.3"
}
}
Backend
json:package.json codesandbox=react
{
"dependencies": {
"@apollo/client": "^3.3.7",
"@aws-sdk/client-s3": "^3.22.0",
"@aws-sdk/s3-request-presigner": "^3.23.0",
"@babel/plugin-proposal-class-properties": "^7.12.1",
"@babel/plugin-proposal-decorators": "^7.12.12",
"@bull-board/api": "^3.3.0",
"@bull-board/express": "^3.3.0",
"@casl/ability": "^5.3.1",
"@casl/prisma": "^1.0.0-alpha.1",
"@cleartax/apollo-server-plugin-introspection-auth": "^1.1.0",
"@giraphql/core": "^2.8.0",
"@giraphql/plugin-scope-auth": "^2.3.0",
"@giraphql/plugin-simple-objects": "^2.3.0",
"@giraphql/plugin-validation": "^2.4.0",
"@graphql-codegen/cli": "^1.21.6",
"@graphql-codegen/typescript": "^1.22.4",
"@graphql-codegen/typescript-operations": "^1.18.3",
"@graphql-typed-document-node/core": "^3.1.0",
"@jest-mock/express": "^1.4.2",
"@prisma/client": "^2.26.0",
"@sendgrid/mail": "^7.4.2",
"@sentry/cli": "^1.63.1",
"@sentry/integrations": "^6.9.0",
"@sentry/node": "^6.9.0",
"@sentry/tracing": "^6.9.0",
"@slack/web-api": "^6.0.0",
"@types/analytics-node": "^3.1.4",
"@types/cookie-parser": "^1.4.2",
"@types/faker": "^5.1.6",
"@types/jest": "^26.0.24",
"@types/jsonwebtoken": "^8.5.0",
"@types/lodash": "^4.14.165",
"@types/morgan": "^1.9.2",
"@types/multer": "^1.4.7",
"@types/node": "^14.14.25",
"@types/node-fetch": "^2.5.12",
"@types/pify": "^5.0.1",
"@types/pluralize": "^0.0.29",
"@types/randomcolor": "^0.5.5",
"@types/throng": "^5.0.0",
"@types/url-parse": "^1.4.3",
"@types/uuid": "^8.3.0",
"@types/validator": "^13.1.3",
"@uploadcare/upload-client": "^1.1.2",
"@vjpr/babel-plugin-parameter-decorator": "^1.0.15",
"airtable": "^0.10.1",
"analytics-node": "^4.0.1",
"apollo-log": "^1.0.1",
"apollo-server": "^2.19.2",
"apollo-server-core": "^2.24.1",
"apollo-server-express": "^2.24.1",
"apollo-server-micro": "^2.19.2",
"apollo-server-plugin-base": "^0.12.0",
"apollo-server-testing": "^2.21.0",
"arg": "^5.0.0",
"axios": "^0.21.1",
"babel-plugin-import": "^1.13.3",
"babel-plugin-transform-typescript-metadata": "^0.3.1",
"bluebird": "^3.7.2",
"body-parser": "^1.19.0",
"bullmq": "^1.39.3",
"class-transformer": "^0.4.0",
"class-validator": "^0.13.1",
"cookie-parser": "^1.4.5",
"cors": "^2.8.5",
"cpy-cli": "^3.1.1",
"csv-parse": "^4.15.4",
"currency.js": "^2.0.3",
"dayjs": "^1.10.3",
"deep-diff": "^1.0.2",
"del-cli": "^3.0.1",
"eslint-plugin-jest": "^24.3.6",
"exceljs": "^4.2.0",
"express": "^4.17.1",
"express-winston": "^4.1.0",
"faker": "^5.3.1",
"graphql": "^15.4.0",
"graphql-scalars": "^1.9.3",
"humanize-string": "^2.1.0",
"jest": "^26.6.3",
"jsonwebtoken": "^8.5.1",
"jszip": "^3.6.0-0",
"lodash": "^4.17.15",
"lodash-humps-ts": "^0.0.6",
"moment": "^2.29.1",
"morgan": "^1.10.0",
"multer": "^1.4.2",
"nexus": "^1.0.0",
"node-dev": "^4.0.0",
"node-fetch": "^2.6.1",
"object-hash": "^2.1.1",
"open": "^8.2.1",
"otplib": "^12.0.1",
"performance-now": "^2.1.0",
"pg": "^8.5.1",
"pify": "^5.0.0",
"pluralize": "^8.0.0",
"prisma": "^2.26.0",
"qs": "^6.10.1",
"randomcolor": "^0.6.2",
"repl.history": "^0.1.4",
"serve-static": "^1.14.1",
"slugify": "^1.5.3",
"sql-highlight": "^3.3.2",
"throng": "^5.0.0",
"titleize": "^2.1.0",
"ts-jest": "^26.5.1",
"ts-node": "^9.1.1",
"tslib": "^2.1.0",
"type-fest": "^1.1.1",
"typedi": "^0.7.3",
"typescript": "^4.4.2",
"typescript-coverage-report": "^0.6.0",
"url-parse": "^1.5.1",
"uuid": "^8.3.2",
"validator": "^13.5.2",
"why-is-node-running": "^2.2.0",
"winston": "^3.3.3",
"xlsx": "^0.17.1",
"zod": "^3.8.1"
},
"devDependencies": {
"@babel/core": "^7.12.10",
"@graphql-codegen/introspection": "1.18.2",
"@types/bluebird": "^3.5.35",
"@typescript-eslint/eslint-plugin": "^4.14.1",
"@typescript-eslint/parser": "^4.14.1",
"babel-plugin-graphql-tag": "^3.1.0",
"eslint": "^7.18.0",
"eslint-config-airbnb": "^18.2.1",
"eslint-config-airbnb-typescript": "^12.0.0",
"eslint-config-prettier": "^7.2.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-jsx-a11y": "^6.4.1",
"eslint-plugin-prettier": "^3.3.1",
"eslint-plugin-react": "^7.22.0",
"eslint-plugin-react-hooks": "^4.2.0",
"eslint-plugin-unused-imports": "^1.0.1",
"husky": "^4.3.8",
"lint-staged": "^10.5.3",
"nodemon": "^2.0.7",
"prettier": "^2.2.1",
"ts-node-dev": "^1.1.1"
}
}
P.S. did you know we built our own marketing website + blog using Nextjs? This allows us to create a fast, SEO-optimized and feature-rich marketing website.
Read more from Shepherd
Why Speed Still Wins – But Only When It’s Backed by Value
In construction, time kills deals. Projects move fast, and delays at any stage – from bidding to binding – can cost contractors real money.
Laura Watts
Head of Customer Experience
July 24, 2025
Shepherd Launches Admitted Casualty Lines in California
Announcing new product offerings for California projects and contractors
Justin Levine
Co-Founder & CEO
July 10, 2025
Any appointed broker can send submissions directly to our underwriting team