Site Administration

Logins and passwords for the site, and the handbook for how m77ag.com is built, so the site can be kept running by someone other than Kyle. Updated Nov 1, 2026.

Logins and Passwords

Every m77ag.com login: admins, employees, landlords, farmers and bankers. Create a login, set a new password, email a set-password link, turn a login off, and choose which farms a landlord sees.

The site's outside service keys (database, email, John Deere, payments) are not kept on this page and must never be put in the code. They are set in the Render dashboard, under the m77ag service, Environment. See "Settings and secrets" below.

Partner Accounts

Partner portal accounts: create, approve and manage them, and review pending registrations.

Handbook: How m77ag.com Is Built

Sections: What the site does · Where everything lives · Technology · How the code is organized · How a change goes live · Settings and secrets · Scheduled jobs · Farm records rules · When something breaks · Taking over the site

What the site does

m77ag.com is the business system for M77 AG LLC and the related McConnell businesses, built by Kyle McConnell. It has a public website and private portals:

Where everything lives

PieceWhereNotes
CodeGitHub: mcconnellentllc-cloud/m77agFull history of every change. Branch main is what runs on the live site.
HostingRender.com, web service m77ag (Oregon region)Builds and runs the site. Deploys automatically when main changes. Settings in render.yaml and the Render dashboard.
DatabaseMongoDB AtlasAll records: fields, passes, bills, users, cattle, bookings. Connection string is the MONGODB_URI setting. Uploaded manuals are stored in the database (GridFS).
Domainm77ag.comThe root record points to Render (A record 216.24.57.1) and www to the Render service. Registrar and DNS provider: Fill in
EmailMicrosoft 365 (togoag.com tenant)The site sends from the shared mailboxes hunting@m77ag.com and office@m77ag.com through a licensed account with Send As. Check with npm run check:email.
John Deeredeveloper.deere.com, app "M77 AG Integration"Operations Center connection for fields and passes. JD imports go into the "M77 AG - Import" bucket so they never overwrite curated field records.
ImagesCloudinaryEquipment and listing photos.
AIAnthropic API (Claude)Mail Center sorting, bank statement reading, the life assistant.
PaymentsStripe and PayPalHunting and online payments.
Mail syncGoogle and Microsoft sign-in appsMail Center reads Gmail and Outlook mailboxes.
kylemcconnell.comGitHub repo mcconnellentllc-cloud/kylemcconnellThe site publishes pages there with a GitHub token (SITE_PUBLISH_* settings).

Technology

LayerWhat
PagesPlain HTML, CSS and JavaScript in public/. No framework and no build step: edit a page and it is live after deploy.
ServerNode.js 18 or newer, Express 5. Entry point server/server.js.
DatabaseMongoDB through Mongoose (models in server/models/).
Sign-inJWT tokens, passwords hashed with bcrypt. Roles: admin, employee, landlord, farmer, banker, customer.
SecurityHelmet, CORS, rate limiting.
EmailNodemailer over Microsoft 365 SMTP.
Files and PDFsMulter uploads, pdf-lib and pdfjs (PDF forms and reading), xlsx (spreadsheets), Turf (field boundary acres).
Schedulesnode-cron jobs inside the server.

How the code is organized

public/            pages people see (admin/, landlord/, js/, css/, assets/)
server/server.js   starts the site, connects the database, mounts every /api route
server/routes/     the API: one file per area (cattle, field-ledger, accounts, ...)
server/controllers/ the logic behind larger routes
server/models/     database record shapes (User, CroppingField, FieldOperation, ...)
server/services/   shared calculations (bills owed, calf crop, bank reconciliation, ...)
server/data/       farm records entered from Kyle's documents (statements, tickets,
                   settlements, cattle feed), one file per subject, each citing its source
server/middleware/ sign-in and access checks (auth.js)
docs/              rules and audits (farm-records-2026.md, audits/)
CLAUDE.md          the working guide for the code: design rules, conventions, routes

Design rules (in CLAUDE.md): professional tone, no emojis, mobile first, colors #2d5016 / #2c5530 green and #d4a54a gold on #f5f3f0.

How a change goes live

  1. Make the change on a branch of mcconnellentllc-cloud/m77ag (GitHub Desktop, the GitHub site, or a Claude Code session).
  2. Open a pull request into main and squash merge it.
  3. Render sees the change on main, runs npm install, then npm start. The new version is live in a few minutes. Build and run logs are in the Render dashboard.

To run the site on a computer for testing:

git clone https://github.com/mcconnellentllc-cloud/m77ag
cd m77ag
npm install
(create a file named .env with the settings below; never commit it)
npm run dev        then open http://localhost:3000

Health check: https://m77ag.com/api/test answers with the API and database status.

Settings and secrets

Every key and password the server uses is a setting (environment variable) in the Render dashboard, m77ag service, Environment. The code reads them by name; their values are never stored in the code or on this page.

AreaSetting names
CoreMONGODB_URI, JWT_SECRET, NODE_ENV, PORT, SITE_URL, CORS_ORIGINS
EmailSMTP_HOST, SMTP_PORT, MAIL_SERVICE, EMAIL_AUTH_USER, EMAIL_USER, EMAIL_PASS, HUNTING_SMTP_USER, HUNTING_SMTP_PASS, HUNTING_FROM_ADDRESS, HUNTING_NOTIFY_EMAILS, OFFICE_SMTP_USER, OFFICE_SMTP_PASS, OFFICE_FROM_ADDRESS
John DeereJD_CLIENT_ID, JD_CLIENT_SECRET, JD_ENVIRONMENT, JD_OPS_SYNC_HOURS
AIANTHROPIC_API_KEY, AI_MODEL, STATEMENT_AI_MODEL, LIFE_ASSISTANT, LIFE_ASSISTANT_MODEL, ASSISTANT_API_KEY
PaymentsSTRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRET, PAYPAL_CLIENT_ID, PAYPAL_CLIENT_SECRET, PAYPAL_MODE
ImagesCLOUDINARY_CLOUD_NAME, CLOUDINARY_API_KEY, CLOUDINARY_API_SECRET
Mail Center syncGOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GOOGLE_REDIRECT_URI, MICROSOFT_CLIENT_ID, MICROSOFT_CLIENT_SECRET, MICROSOFT_TENANT_ID, MICROSOFT_REDIRECT_URI, MAIL_SYNC_MINUTES
kylemcconnell.comSITE_PUBLISH_TOKEN, SITE_PUBLISH_REPO, SITE_PUBLISH_BRANCH
Rental billingENABLE_BILLING_CRON

Scheduled jobs

Farm records rules

When something breaks

Taking over the site

To keep m77ag.com running, the next person needs owner access to each of these accounts. Record who holds each one and where its sign-in is kept:

AccountWhat it controlsOwner and where the sign-in is kept
GitHub organization mcconnellentllc-cloudThe code (m77ag and kylemcconnell repos)Fill in
Render.comHosting, deploys, settings and secretsFill in
MongoDB AtlasThe database and its backupsFill in
Domain registrar / DNS for m77ag.comThe web addressFill in
Microsoft 365 (togoag.com tenant)Email, shared mailboxesFill in
John Deere developer accountOperations Center connectionFill in
Anthropic ConsoleAI keyFill in
Stripe, PayPalPaymentsFill in
CloudinaryImagesFill in
Google CloudGmail sync appFill in
m77ag.com admin loginThe admin side of this siteadmin@togoag.com (Kyle and Brandi)

A developer new to the site should start with CLAUDE.md in the repository, then docs/farm-records-2026.md. The site was built and is maintained with Claude Code; a new Claude Code session on the repository reads CLAUDE.md automatically and can carry on the work.