The Soul Company, Inc.
See it livePricingBook a demo

Everything, with the date it happened.

Generated from the repository, not written for this page. It includes the days something broke and how it was found, because a changelog with only wins in it is an advertisement.

596
changes in 90 days
59
days with something shipped
3
day run, most recent
Sep 9
Wednesday
5 changes
66a9a42
The SDK was twelve bytes from its ceiling, and I pushed it over
Correcting 80b09f0, whose message claimed "309 tests, next build clean" while tests/sdk-hardening.test.ts was red. I read the summary line and committed. The number in that message was never true.
80b09f0
The typo path returned ok:true and told nobody
Driving the SDK's FAILURE modes rather than its happy path, which sdk-e2e covers at 19/19 and which is why none of this showed up there.
a0bfc1e
The blog was the old company still writing, and Google was pointed at it
Krishi: "remove blog posts all that we dont need any of that just the one pager on soulverified.com". The posts sell the members club in the first person, "we built the offline network of verified humans", "one face scan proves you are real", "you go where the real ones are", which is the company retired out of the URL space in three earlier sweeps.
56ed1be
Soul ID is retired: the company is the SDK
Krishi: "kill soul id we dont need it", "we are just soulsdk now". It was the last of three previous companies still reachable on the domain, and the one that read most like a live product, because /create-open opens on a working creation flow rather than on marketing copy. The other two, the members club and the venue subscription, were retired in earlier sweeps.
0fd4747
Every page told a machine we were the members club, the homepage included
middleware.ts spends forty lines retiring the consumer members club and the venue product out of the URL space, on the argument that an engineer evaluating us pokes around and finding three companies at three URLs makes the one they were sent to look like the latest of several attempts. That sweep covered every place a person could click and no place a machine could read.
Sep 8
Tuesday
1 change
6b2aca7
The package needed a name we can actually have
`soul` on npm belongs to somebody else and has since 2014, so the manifest named a package that could never be published no matter who ran the command. `soul-sdk` is taken too.
Sep 7
Monday
3 changes
02ff1fd
A partner app that is not ours, and it starts empty
Everything clickable here was same origin. /preview frames /embed from our own site and /loop is scripted and says so. Both are honest and neither proves the thing a prospect is buying, that the SDK works when it is NOT on our domain. That is not academic: on Jul 28 /embed served X-Frame-Options SAMEORIGIN and every real integration was a blank box while every demo we owned kept working, because every demo we owned was same origin.
432be53
The agent goes where the cards already are
AgentBar's own comment said a bar works "inside somebody else's app" and that it is the reason the SDK can carry the agent without asking a partner for a route. It then only ever ran in /you. The tab named the agent, on every card, and there was nowhere to reach it.
fd1b636
A coin flip was being reported as a fact
With no credibility data, anything over 50% AI probability came back AI_GENERATED. That is the branch where the fact check timed out or was skipped, so the detectors are the only witness and there is nothing to check them against, and it is the wrong direction for this product to be wrong in. A person holding a real video was told flatly that it was generated, on one signal, at a score barely better than chance. LIKELY_AI_GENERATED is a verdict somebody can argue with. AI_GENERATED is one they have to disprove.
Sep 5
Saturday
1 change
2d3a2b1
The colophon links home
"An Achala Labs company" was a dead span on both sites. It is the one place a visitor can follow the house upward, so it points at achalalabs.com now.
Sep 4
Friday
29 changes
a1edfaf
The full flow as it actually runs, and the reason not to build it yourself
Nine beats, in the order it happens. Their app with Soul installed and silent. identify() carrying the signal a wearable company already has, so the profile starts full rather than empty. The agent asking only for the part no ring can measure, which is whether they stay for the coffee. The lightweight profile that makes somebody discoverable without a photo, a bio or anything to maintain. The search, which is a metro and not the internet: Brooklyn and Manhattan are one pool, Berlin is not. The pairing. The card. The answer. The other side. And then two people in a park.
a7ae902
The full flow, from a user Soul has never met
/loop started at the card arriving, which is the second half. It skipped the question that matters most to a partner and that keeps getting asked: how does the agent know anything about this person in the first place.
bb5c9fc
A page that plays the whole loop inside a partner's app
/preview lets somebody press the live SDK, and it cannot show them the loop. The loop takes two people and several days: a card arrives, somebody answers, a stranger answers somewhere else, and only then is there a name and a coffee. A partner deciding whether to integrate needs that arc in thirty seconds, including the parts that happen while their user is asleep.
b8b21eb
The SDK is a thing you can press now, on the site
Everything that proved this worked lived somewhere a person had to be told about: a curl one-liner, a per-prospect sales page, and a matching sandbox buried in the docs. There was no way to arrive at soulverified.com and simply press the product.
6a11443
Soul has its own app now, and it is the same code the SDK embeds
You cannot see a flow you have only ever shipped in pieces. The agent, the deck, the profile and the console were each built and verified alone, and nobody, us included, could sit in front of the thing a user actually goes through from not knowing what Soul is to having coffee with a stranger.
69b4b8d
Back to the glass: the gradient card was the right one
Reverts the painting ground. The sage glass over cream, the inset frame and the deep green accent are the design, and swapping the card's ground for a landscape traded a card that reads instantly for one that reads like a poster.
173b7c4
The card's ground is a painting now
A card that arrives once a day, unannounced, over an app somebody opened for something else is the one surface where beauty actually pays. A dashboard gets looked at; this gets looked at once and answered. So the deck sits on a Hudson River School landscape rather than a gradient, with frosted glass controls over it and the type in Cormorant and Newsreader as before.
a6fc0ed
One shell, an end to end test, and Wrapped is gone
THE SHELL. The product was a folder of pages. The agent, the console, the docs and the sandbox were each built well and each built alone: no chrome in common, no way to get from one to the next, and the white marketing bar from the root layout sitting on top of the cream ones. A partner had to be handed every URL individually, which is a list of links in an email, not a platform.
8ef934f
A test I wrote last night was flaky and I pushed it anyway
tests/brand-reason.test.ts passed alone and failed intermittently in the full run. readBrandAttempt retries with backoff, which is correct in production and means each case takes a couple of real seconds even against a stubbed fetch. Under jest's 5s default that is comfortable by itself and marginal with twenty odd suites in parallel.
49f1a2f
A partner had no way to tell whether any of this was working
They could integrate the SDK, ship it, and then be unable to answer the simplest question about it. The cards render inside their own app, the introductions happen between two people neither side can see, and every number about it lived in a database with no window on it. "Is it working?" was answerable only by asking us, which is not a thing a company will do twice.
f1af7c0
Cream, and nothing on it
No mark on the thumbnail either. The platform already shows the title and the description beside the image, so anything set inside it is the same words twice at two sizes or a picture too small to read once Slack has scaled it. The cream is the signature: three companies, one ground.
5643f9a
Soul unfurled as a white product card with a price on it
The link preview was an ImageResponse route rendering the pitch: a bold-sans headline, three lines of body copy and $999 a month. Its own comment says it was rewritten once already for a positioning that has since changed again.
6509f34
A link to soulverified.com had no thumbnail at all
Cream, the mark, nothing else. The mark is the card: a rounded field with a hairline frame set inside it, which is the shape of every card the agent has ever put in front of anybody.
e8875c2
The agent makes introductions now, which is what everything else was waiting on
proposeIntro() had no caller. The deck, the three states, the double opt-in, the redaction and the tests were all a rendering of an empty table: nothing was ever proposed to anybody. lib/network/pair is the caller.
faf00aa
An agent you can tell things to, and a profile that shows its working
Everything needed to understand a person already existed as an engine with no way in. Eight connectors derive affinities, readPerson maps them into a closed vocabulary, understand turns that into a portrait, match scores the overlap. And signal could only ever arrive through an OAuth token, so somebody whose apps we do not connect to was unreachable, and somebody we had read wrongly had no way to say so.
825258c
The spec said the card renders as the partner, which stopped being true
Two guarantees had gone stale. Five described a tab that renders entirely in the partner's brand, which was right when the unit was a list of local events and wrong the moment it became a stranger's name. Three said a decline means never this pair again, which is too blunt once a decline can carry a reason: it throws away a good match because Thursday was bad.
1a61ba7
The card came up with no reason on it, which is the one thing it has to say
Soul.identify() fires from the SDK the moment the page loads and creates the member row with nothing on it. By the time the embed rendered and seeded, the row already existed, and the seed's `update: {}` meant the interests and affinities never landed. sharedAffinities then found no overlap between a person with no affinities and Maya, so the card offered a stranger, a time and a place and no answer to "why am I being shown this".
8ae8398
Sandbox rows already named You cannot be fixed by a fix that never reaches them
The seeder upserted with `update: {}`, so a member row created by an earlier version kept whatever it was created with forever. Both halves are fixed: the upsert can correct a name, and a one-per-process repair clears the "You" that production is already carrying. Scoped to the sdk:try- prefix, so it cannot touch anything but a sandbox row.
930d14f
Every Soul surface is the same card
The card is the design system, so it is now one definition rather than three. lib/soul-card holds the material, the sage glass over cream, the deep green ink, the inset frame, Cormorant over Newsreader italic, the hairline rules, and the deck, the tab and the question we ask when we do not know somebody's city are all built from it.
f746ee0
The deck is Soul's card now, and it is shaped for a phone
The deck took the partner's ground, accent and radius so it would disappear into their app. Disappearing is the wrong instinct for this surface. A readiness score can be furniture; an introduction to a stranger, arriving unannounced over an app somebody opened for something else, cannot. The first thing a person needs to know is who is standing behind it and why it is not an ad.
aa78aad
The deck can finally show the whole journey, and a stranger can run it
Three things were true at once and each of them made the other two invisible.
86d3f0b
present() belongs on /developers, not a file on my desktop
/developers already is the test surface: every method, runnable, against the real endpoints. That is how an SDK is meant to be tried, and present() was the one method missing from it.
81e197f
identify() takes the shape people actually reach for
identify(user, traits) takes a string first. Passing identify({user:'x'}), which is the obvious guess, wrote [object Object] into cfg and then into every frame URL and API call after it. It failed silently, which is the worst way for an SDK to fail: the integration looks wired and nothing resolves.
c2471fb
Bump the SDK to 2.10.0 and fit the budget
Two guards caught the previous commit and I pushed before reading them.
4ccb54a
Soul.present(): the deck as a moment, not a tab
A tab costs a partner navigation real estate, which is a design review and an internal argument. A moment costs them one function call, and that difference decides whether an integration ships this month or next quarter. It is also better product: a tab that is always there is always ignorable.
a74617c
Give the deck Soul's card language, and the rest of the journey
The card was taking the partner's tokens and letting them flatten out everything that made the cards on the site read as ours. Now the FORM is Soul's on every partner: layered glass over their ground, an inset frame, a serif name against uppercase letterspaced meta, hairline rules, the sheen following the cursor. Light and dark are the same material, measured off the partner's own background rather than guessed.
175be1d
The deck: one card at a time, in the partner's brand
Opt in with ?view=cards. A board asks you to scan and choose, which is the wrong shape once the unit is an intro: there is one question per card and the answer is yes or no. So the deck asks it, takes the answer and moves on, with two cards peeking behind so it reads as a queue.
0c6e621
Remove the duplicate demo route
/for/<partner> already was the per-prospect page: it passes a city, uses try-<slug> as the partner with the real brand as the skin so a demo cannot 401 on a rotated key, iframes the live embed and carries copy written for each prospect. Middleware whitelists it by name.
c0dbfcc
One to one intros with double opt-in, and the demo link
THE MODEL. A gathering of eight needs eight yeses; an intro needs two, so it works from a partner's first hundred users rather than needing a city. An intro is a Meetup with kind 'intro' and capacity 2 plus two Rsvp rows, which means the board, check-in, webhooks and arrival tracking already work.
Sep 3
Thursday
8 changes
b290ea5
A decline was being recorded as an accept
POST /api/embed/rsvp read intent as `b.going !== false`, so a caller sending {status:'declined'} was written as ATTENDING. The string was never looked at, and anything that was not literally going:false counted as a yes. Verified against production: accept and decline returned the identical {going:true, count:9}.
c2f5e26
House icon in green, and a short tab title
3ce3b6b
Match the ground to achalalabs.com
Same cream across the house, Soul keeping its green accent.
dd70a55
Contact address and a mobile pass
dattanikrishi@gmail.com, and mobile rules for the events card, the install snippets and the section rhythm.
71288a6
Move the events card into the hero
The right half of the first screen was empty and the card was buried further down. It belongs next to the claim it evidences.
f5d117e
Add the curated events card, drop links to the old pages
A tilting glass card showing what the agent would actually put on the calendar in New York this week. Pointer tilt where there is a cursor, device orientation on touch, and neither under reduced motion.
e2379a5
Bring the SDK onto the homepage
The install story was a page away. Paste, scaffold, or hand it to an agent, with the real snippets, so the offering and how to adopt it sit together.
6911b5b
Rebuild the homepage as a one page document
Same typographic system as achalalabs.com and aequus.health: Cormorant Garamond for display, Newsreader for prose, Instrument Sans for labels. Keeps Soul's green so it reads as part of the house rather than a subsidiary.
Aug 26
Wednesday
2 changes
ea7b759
The cohort handoff was on the wire and in none of the docs
Whatever lib/embed/gatherings.ts and the embed routes put on the wire is the public contract, and the read that lets a customer prove the pilot worked appeared in no customer facing surface at all. Not SKILL.md, not soul.d.ts, not /docs, not llms.txt. A partner building their own interface could not discover it existed, which is the same failure as the sign field in August.
3ac947d
A key that ships in the browser was opening the attendance record
Partner.key is publishable by design: the SDK takes it in Soul.init(), so it lives in the customer's client bundle and any user of their app can read it out of a network tab. Two endpoints authenticated user-level data with it.
Aug 20
Thursday
6 changes
b28b744
AGENTS.md symlinks to CLAUDE.md so Cursor reads the same rules
6fe80a3
Record the verified panel numbers and the backtick that failed two builds
51df6de
Fix the build: a backtick in a CSS comment ended the template literal
9fda018
Cap the product panel, not the screen
4264d45
The demo had a hole in it, and the crowd line said too much
3140230
The headless board could not see the sign
Aug 18
Tuesday
10 changes
164c9f1
Record the SKILL.md findings, the example labels, and the test-member purge
effd8a9
Get the harnesses off the boards
25e5e16
SDK 2.9.1: a slug is not a brand name, and 'ready' has to be hearable
ec4468f
Make the deploy check able to fail
f1b27c0
Deploy from CI, because pushing to GitHub stopped shipping
f85c633
Record the sign, the plural bug, and that GitHub no longer deploys
626833c
The whole card opens a gathering, and a harness that proves the sign is readable
a363763
Fix a validator that was quietly throwing away good signs
8d135b1
How you know it is us: a sign on every gathering
3692ab6
Prove it in a browser rather than claim it in a sentence
Aug 17
Monday
6 changes
a50d5eb
Hand them the pinned snippet, with the hash that matches it
7e67f6c
Try to fake an arrival, ten ways. None of them work.
df663ba
Pricing promised a door that does not exist
c8b7bb0
Remove the GPL dependency, and say who owns this
6ff38a6
Say who is going, not just how many
3e595fb
A real consent trail, a live bundle number, and the word verified made true
Aug 14
Friday
2 changes
e4383c5
The mobile check was failing pages for not being the page it expected
b2ac8a6
The complete list of what we hold, written for the person whose job is to say no
Aug 13
Thursday
5 changes
fcdcdd8
Soul.verify(): one FaceID tap proves a person. SDK 2.9.0.
3a64b6b
One heading on the site was set in a different typeface
d365362
The last small targets were four links I added myself
e0707f2
A Tailwind class that shipped and did nothing, and a second nav I forgot about
821b318
The tab was right and the page around it was not
Aug 12
Wednesday
4 changes
56987eb
The corroboration moat, which is structural rather than technical
58e502c
The RSVP button was 36px, and my own check called 44 a failure
91bb0e9
Measured the tab on a phone for the first time, and it was not alright
10426c5
npm run demo: see it on your own machine, in your own browser
Aug 11
Tuesday
2 changes
7fed24c
The status page was crying wolf about an outage that had ended
0a5479a
Alerts that actually send, a status page that can say no, and the collab on the site
Aug 10
Monday
2 changes
3910d3c
The agent check would have gone green on the failure it was written for
e8ad9ad
The agent died and every check said ALL SYSTEMS GO
Aug 9
Sunday
1 change
b1c1ced
The cross-company room, and the last of the green pips
Aug 7
Friday
1 change
2866dca
Name the thing people are already saying about trackers
Aug 6
Thursday
2 changes
fcbf0b9
There was no way to delete somebody. SDK 2.8.0.
3a66ac5
Site sweep: nine contradictory pages, one missing answer, one repeat
Aug 5
Wednesday
4 changes
91f6bf4
The tab never explained itself to the person looking at it
7a28153
Revert: /for/[partner] already existed
d4562f8
One link that shows the whole thing, for one company
49bd08a
The demo board emptied itself four days after I seeded it
Aug 4
Tuesday
1 change
e829cee
The SDK was never 4.5 KB. It is 9.3.
Aug 3
Monday
5 changes
a921e7b
One white section sitting inside a dark run
844700b
The sticky panel never stuck, so the section was mostly empty white
f92b837
The engine could not see that a run is for runners
0f9b97a
The sandbox was demonstrating the least impressive version of the product
bea2da1
One step at a time, instead of six things shouting at once
Aug 2
Sunday
15 changes
821d5fd
Retire by exact title, for the ones no pattern catches
d4a5794
A way to rewrite a board when the rules change
c7658be
Pick an ordinary thing people already do. Do not invent an activity.
ad384dd
A title has to say what you would be doing, not just evoke it
ae3b66d
The mock cards were rendering in the wrong typeface
d2f32f0
The e2e was asserting something that could not fail
9daaf6f
Show the agent working, instead of describing it
cf540f2
The demo board had nobody on it
dabccf5
Hand the customer the cohort so they can do the retention math themselves
4aa6059
Match on what someone's body wants this week, and never say it out loud
42ae4be
Put the shipping record on the homepage
12aeaa4
Zero em dashes, including the two pages generating their own text
50db540
/docs said shared gatherings were most of the board. They are none of it.
4100a08
A company's board is their own users' events, by default and in full
759b843
Learn from the person, not only from the board
Aug 1
Saturday
7 changes
f1d3edc
The board could not be topped up, by either path, for days
7bbff61
The shared board was queued behind every company's private calendar
26bab9d
The fill target counted gatherings the board cannot show
8b7edaf
A sandbox partner could not see its own test users
f5a6a76
The public sandbox demoed an empty room
75d5581
Move the ones already on a board to the day their title names
ca3d3b3
When the title names a day, move the gathering to that day
Jul 31
Friday
24 changes
07693b1
Say which parts of the agent are ours
f25faf9
Sweep the duplicate slots already on the boards, not just the new ones
4bf6457
Two of the same plan, and a title that argued with the date under it
91ab642
The metric names got through, and a venue was cut mid-word
31c565d
Gatherings people actually want to go to, and an end time on every one
f9fe53b
Four cards, not six, and numbers that do not read as a ghost town
6ec90ee
The card deck was clipping its own text
39251a3
Check the venues that are already on the boards
3d1def9
A place that does not exist is the one failure a user feels physically
c8a96eb
No green live dots anywhere
f25f4a7
Boards sat half empty because we asked for exactly what was missing
351f77b
Stop telling everyone on earth they are in New York
08df06a
Hand a partner readable ground, not our namespacing
9d6d802
We were storing the raw health records we promise we never store
c115ae5
"Who you should meet" was empty on the first call
5da7d69
The city prompt never knew what was already on the board
f364edc
The dedupe pass never looked at the shared board
e70c74e
Three sunrise runs in a row on the board a prospect loads first
c57bcca
An admin trigger for the shared board
41e774f
The shared board starved as the partner boards filled
b81f6fb
The limiter has to be cheapest when it is busiest
007e8e4
A load test, and the first thing it found was an outage
508172a
Rotate a leaked key without taking their tab down
bddb989
A replayed create has to answer in the same shape as a real one
Jul 30
Thursday
25 changes
50bad89
SDK 2.6.0: the five things a platform team asks that we could not answer
16a5d1c
Say it from the buyer's chair, not ours
91cd16a
Nobody wants to be told they are one of a group
ba4a2ff
The moat and the plan are investor documents, not footer links
f6038d9
Did they come back
0cf2b37
The first collab it ever wrote shipped an em dash
c1fcc97
One bug was becoming three rows, which is the failure this file exists to prevent
a5359be
Know something broke before the customer tells you
9f37be4
What community is worth, with the source attached to every number
0dd72bf
The marquee ran out of names and left a hole
f25602a
Integrates with the apps you already use
bb28b32
One person, and no photographs of any of it
7394fe1
A hundred gatherings in six months is the whole argument
cf47a10
We ran this by hand before we automated it
5928e70
Show the install in the language they actually write
75cf33d
The agent page never said the company can overrule it
88d742a
Retire the consumer members club, and stop paying for questions with no answer
030db5c
The crowd is the door, and the venue model is gone
d551cb6
Nothing under 12px on a phone, on the partner wall too
5eca14e
Say that the logo wall is not a customer list
5b4edca
A DPA that exists, an SSO claim that did not, and a link you can rotate
b3fe56e
The brief link had nowhere to live
c8beb21
Nothing ran for Demo Co in the last 30 days
12a2df0
A link you can open, not one pointing at localhost
5f5de78
Get at a brief link without mailing a customer to do it
Jul 29
Wednesday
27 changes
a25f399
Say no to one, and read back the month you turned up to
db88730
Titles a person would say, and stop restating the docs
c38f134
Documentation a platform team can actually evaluate us on
4df4728
Webhooks, so a customer's backend does not have to ask us
6891d94
Program every city they have people in, not the one on the form
dc1e4bd
Send the customer a recap, not a dashboard
716ddb0
Make it scroll, and finish removing the labels
6e4c899
Say how the agent actually works, and stop saying Soul twice
14b594b
Read the company's own design language, instead of asking for a hex
d6045ec
Stop labelling every section, and open the door before the price
e79605b
Did anyone actually turn up
4488cb0
Run the agent on its own, and stop reaching for a generic event
da14cdc
Record the canonical read and the booking page
0b9b3dc
A demo page, instead of throwing people at a calendar
e6596c3
Record the AI pipeline and the new feedback loop
5e79034
Do not claim a turnstile we do not have
55a5b89
Give the agent a memory of what filled
27b2b55
Manager, not team
59bbcd2
Record the withholding rules and the staleness trap
3377655
Withhold what should never be on a public page, and say how much
17f1b1d
Record the changelog and the install-path audit
1d85b15
Test the path a non-technical buyer actually pastes
c15fcee
Serve our TypeScript types as text, not as video
a870688
Publish the shipping record
a0d7624
Record the board-first change and the two new pages
dfb066e
Answer the hard version of every question, in public
66074cf
Show the board, then ask
Jul 28
Tuesday
16 changes
e0a2fc0
Name the request that failed
4ecdde5
Kill the caption under the product
762f9d7
Record the SDK hardening and the badge bug
0dc0068
A capped frame still has to scroll
30d5dd1
Give the left column something to hold
0867ee5
Make the SDK survive a bad day, and find a bug by looking
5665c32
Record the pricing lock
ad2e214
Record the three causes of a board that was not theirs
7ab2729
Every company's board is entirely their own
7742773
Redeploy: board fill did not reach production
2b95654
A company's board is theirs, not theirs plus everyone's
100cde9
Community as a service, and the two paths that need no code
d265d22
Our embed refused to be embedded
c4ae740
Strip em dashes from gatherings written before copy was sanitised
828a28d
Types, and the numbers a technical buyer checks first
5718980
Five kinds of gathering, and one rule for who sees them
Jul 27
Monday
23 changes
d24b221
A partner's own gathering is a partner's own gathering
f7ca09d
Partner-first ordering, and lead with the role we replace
1f94a65
Pricing cards you can actually scan, and one less overclaim
25d4598
Say the thing nobody else can say
1521271
Document the connect honesty fix, the agent install path and the ranking bug
fd16718
Rank across the week, then cut, not the other way round
4eb68b5
Footer stops falling apart on a phone
94c536a
Retire the last pages selling a company we no longer are
e76473a
Three tiers, a paywall that actually holds, and a way to buy it
db09d68
No public page still selling a business we retired
6c0d4e9
Pricing wears the same clothes as the rest of the site
7faeaea
A playground that runs the real SDK, and a link preview from this decade
64d45bc
The whole SDK, free public places, and the price in public
72a08a4
Open an event, open a person, see your own signal
a7107e2
One command, any stack: /install now covers eleven project types
2fac3f9
Stop showing Connect buttons for things that are not wired
9c13d50
Meetups cards on the same glass
138b720
One surface language across every member page
a059247
Home board: stop showing a New Jersey member gatherings in Florida
70954c6
Wordmark is the full legal name: The Soul Company, Inc.
bebfc13
The sandbox: try the SDK end to end, see every company at once, and read the user
4708bee
Document local dev setup and the three bugs found by running it
f6bc9ce
Run it for real: fix the embed on desktop, a contrast bug, and the log noise
Jul 26
Sunday
7 changes
136afdf
Document the timezone rule, the connector contract, and the desktop fixes
7fcf6e7
Connect page: cards, not squeezed rows
1ea6191
Desktop must be horizontal: legal pages + connect list
4125f36
Prove the connectors work: 43 tests, and fix the timezone bug they caught
ad33569
Document all 8 connectors + the setup requirements
ecf99bb
Add every integration we can actually build: 6 new real connectors
de85004
Document the Jul 26 cleanup + OAuth registry + one-command install in CLAUDE.md

How this is made. A build step reads the git history and writes the entries above, so nothing here can be posed after the fact. The page shows the last 45 days, the counts cover 90, and the messages are the ones written at the time, first paragraph only. Last generated 2026-09-09.

What is withheld, and why. 96 entries in this window are counted but not described. Two reasons, both boring. We do not publish the detail of our own security work, because a closed issue to us is a map to somebody else. And we do not name a company we are not publicly working with, because a lot of products appear in this history as demo skins and test cases, and a list of them on a public page would read as a customer list we have no right to claim.

© 2026 The Soul Company, Inc.
PricingDocsPrivacyTermsDPABook a demo