Live preview
Open the change running, with seeded sample data, on its own address behind your sign-in. It stops when nobody’s looking. Laravel projects, for now.
nightlab takes a ticket, writes the change in a sandbox, and runs your project’s own static analysis and tests on it. A second model reviews it. You get a draft pull request, and a person merges.
Invite-only for now. Works with Jira, GitHub and GitLab.
Five steps, in order, and it shows its work at each one. Start one run by hand, a batch from a filtered list, or let an event in your tracker start it under rules you set.
Reads the ticket and the code it touches, and checks the feature isn’t already there. Then it writes down what done means.
It reads this, and the code it touches: the Order history page, the Invoice model and its controller.
It compared the ticket with what the code already does
It exports a list of orders, not one invoice, and only admins can run it.
It emails an invoice again; the customer still can’t get one themselves.
New feature. Nothing close enough to call it a duplicate, so it goes on.
The spec it posted back
Writes the change in a sandbox, on its own agent/ branch. Your branches stay yours.
12 public function download(Invoice $invoice)13 {14+ abort_unless($invoice->isPaid(), 403);15+ $this->authorize('view', $invoice);16+17+ return Pdf::loadView('invoices.show', compact('invoice'))18+ ->download("invoice-{$invoice->number}.pdf");19 }
28Route::middleware('auth')->group(function () {29 Route::get('/orders', [OrderController::class, 'index']);30+ Route::get('/invoices/{invoice}/download',31+ [InvoiceController::class, 'download'])32+ ->name('invoices.download');33});
1+it('downloads a paid invoice as a PDF', function () {2+ $invoice = Invoice::factory()->paid()->create();3+ actingAs($invoice->customer)4+ ->get(route('invoices.download', $invoice))5+ ->assertOk()->assertDownload();6+});7+8+it('answers 403 for an unpaid invoice', function () {
Your static analysis and tests, on the base branch and again on the change. They’re compared by message, not by line, so old warnings and moved code don’t count. Only a new failure does, and it goes back to the code step: no pull request opens until it’s gone.
Gates for Laravel, Node.js and TypeScript, Python, Go, Flutter and .NET, in containers.
A second model, not the one that wrote it, reads the diff. Advice only: it never approves or merges.
17 return Pdf::loadView('invoices.show', compact('invoice'))18+ ->download("invoice-{$invoice->number}.pdf");
Customers search their downloads by date. Consider the date in the file name too.
Written by one model, reviewed by another
Opened on your git host, with what changed and why. On GitHub it also names a reviewer: whoever owns or last changed those files. It merges only when you say so: today, a person merges.
SHOP-1430: customers can download past invoices
main has 3 errors and the change has the same 3, compared by message: none of them is new.
0 newly failing. Attempt 1 failed one test; the code step fixed it.
Name the PDF with the date too. Advice only: it doesn’t block the merge.
A run goes from ticket to draft PR on its own. Turn a round on for a project, and runs stop there for a person, and only there. Switch a few on to see what you’d get.
A run ends at a draft PR. These go beyond it: before the merge, on your team’s own pull requests, between tickets, and when a version ships.
Open the change running, with seeded sample data, on its own address behind your sign-in. It stops when nobody’s looking. Laravel projects, for now.
The same second model reviews the pull requests your people open, as a comment review with a “nightlab review” check. It never approves.
Scheduled scans of each repository in eight categories. The worst findings become suggested tickets, filed only when you approve one.
Create and release your Jira versions from nightlab, with each merged change’s fix version suggested, or set. When a version is released, it drafts two notes from what shipped, one for your team and one for your clients. A person approves each one, then copies it.
Each limit is a setting you can see in the portal, not a promise on a web page.
A new workspace starts here: no pull request, comment or push until you turn writes on.
It opens draft pull requests. Today, that means a person merges, on your git host.
Everything it writes goes to agent/ branches, and reaches yours only through a pull request.
In your tracker, each person sees, and starts runs on, only the issues their own account can see.
Close to this workspace’s monthly limit. See budgets
This workspace’s monthly limit is used up; runs start again on 1 Nov, or when an admin raises it.
Admins set a monthly limit and each project’s share. Near it, a note says so; at it, new runs pause.
The agent, the gates and live previews run in containers.
nightlab’s work is as good as the gates you give it. Your tests and analysis catch what they catch, and your team reviews the rest.
To do the work, code and tickets are sent to the model provider your workspace uses, under that provider’s terms. The agent works in a sandbox, apart from nightlab’s own credentials. How your data is kept
nightlab sits between your tracker and your repository, and uses your checks, your tools and your model on the way.
Tickets come from
Your tracker
Where your team files the work.
What nightlab does here
The work happens in
nightlab
Where the change is written and checked.
What nightlab does here
Draft PRs go to
Your repository
Where your code lives, and a person merges.
What nightlab does here
Using something else? Say so in your request.
nightlab is invite-only for now. Tell us about your team and the first tickets you’d hand it.
Have a question first? Write to hello@nightlab.io.
We’ll answer at . Nothing else to do for now.
Your answers are still in the form. Try again in a minute, or email them to hello@nightlab.io.