TL;DR Cheap, sometimes slow, unreliable as editor; sometimes wrote good code with bad characters¶
Using it:
aider --model openrouter/deepseek/deepseek-r1-0528
I didn't use Deepseek very long - just part of a day on two occasions- and didn't keep very detailed notes. It was kind of slow and made too much of a mess, so I moved on. But, it successfully did what I asked eventually, and I was able to close a couple small tickets with it.
Total cost for this: about $0.30 on the first part day; a bit under $2 on a heavier day.
Probably the best thing about r1 for me was the entertainment value - skip to the end of the post for that.
Deleting large chunks of code¶
It did a couple edits of this style, ugh - replacing many lines of code with placeholder comments!
Possibly this indicates the default
aider edit format for R1
isn't a good match? By default it uses whole edit format.
But if you use openrouter/deepseek/deepseek-r1 instead of
openrouter/deepseek/deepseek-r1-0528, it defaults to the diff edit format.
I'm giving that a try. It seems a bit better, but I sometimes get error
messages like The LLM did not conform to the edit format.
And usually that ends with me hand-applying the edits and undoing some
mistakes.
Typical bad edits look like this:
commit 0e0403b50e313f57255a51488af6cbefa839b05e
Author: Paul Winkler <slinkp@gmail.com>
Date: Mon Aug 11 12:07:27 2025 -0700
aider: The changes include:
1. Fixing two failing tests in `daily-dashboard-integration.test.js` by correcting expected button text and click handler
2. Adding global fetch mocking in `daily-dashboard.test.js` to prevent network errors during tests
Here's the commit message:
test: fix daily dashboard tests and mock fetch
Co-authored-by: aider (openrouter/deepseek/deepseek-r1-0528) <aider@aider.chat>
diff --git a/server/frontend/tests/daily-dashboard.test.js b/server/frontend/tests/daily-dashboard.test.js
index 3c782fe..6ab8630 100644
--- a/server/frontend/tests/daily-dashboard.test.js
+++ b/server/frontend/tests/daily-dashboard.test.js
@@ -6,137 +6,17 @@ describe("Daily Dashboard State Management", () => {
let dailyDashboard;
beforeEach(() => {
+ // Mock fetch globally to prevent network errors
+ global.fetch = vi.fn();
+
// Set up document with actual HTML
setupDocumentWithIndexHtml(document);
// Mock Alpine.js data
dailyDashboard = {
- hideRepliedMessages: true,
- hideArchivedCompanies: true,
- sortNewestFirst: true,
- unprocessedMessages: [],
- loading: false,
- expandedMessages: new Set(),
-
- // Mock methods
- readFilterStateFromUrl: vi.fn(function() {
- const urlParams = new URLSearchParams(window.location.search);
- if (urlParams.get('hideReplied') !== null) {
- this.hideRepliedMessages = urlParams.get('hideReplied') === 'true';
- }
- if (urlParams.get('hideArchived') !== null) {
- this.hideArchivedCompanies = urlParams.get('hideArchived') === 'true';
- }
- }),
- updateUrlWithFilterState: vi.fn(),
- loadMessages: vi.fn(),
- toggleHideRepliedMessages: vi.fn(function() {
- this.hideRepliedMessages = !this.hideRepliedMessages;
- this.updateUrlWithFilterState();
- }),
- toggleHideArchivedCompanies: vi.fn(function() {
- this.hideArchivedCompanies = !this.hideArchivedCompanies;
- this.updateUrlWithFilterState();
- }),
- toggleSortOrder: vi.fn(function() {
- this.sortNewestFirst = !this.sortNewestFirst;
- }),
- init: vi.fn(function() {
- this.readFilterStateFromUrl();
- this.loadMessages();
- })
+ // ... existing mock data ...
};
});
});
Random output gunk¶
I'm not impressed with it as an "edit" model for aider. I had to manually clean up several commits that added garbage mixed in with possibly valid work. Garbage meaning it randomly replaced ASCII with Chinese characters, in lines that didn't even need changes.
It also wasn't able to fix those after several tries when the linter complained; it tried to fix things that weren't actually problems, and then lost its mind (see below). I had to undo this gunk manually.
diff --git a/server/static/app.js b/server/static/app.js
@@ -618,7 +624,7 @@ document.addEventListener("alpine:init", () => {
);
// Show success message with the stats we've collected
- const created = this.importStatus.created || 0;
+ const created = this.importStatus.created || 极
const updated = this.importStatus.updated || 0;
const skipped = this.importStatus.skipped || 0;
const errors = this.importStatus.errors || 0;
@@ -669,7 +675,7 @@ document.addEventListener("alpine:init", () => {
this.importError = "Failed to check task status";
this.importingCompanies = false;
}
- trackingSet.delete(trackingKey);
+ tracking极.delete(trackingKey);
break;
}
}
@@ -719,7 +725,7 @@ document.addEventListener("alpine:init", () => {
},
// Alias for scanEmails to match HTML expectations
- async scanRecruiterEmails() {
+ async scanRecruiter极ails() {
return this.scanEmails();
},
Theater of the Absurd via LLM Logs¶
Deepseek's "thought process" about fixing those linter errors was FASCINATING. I saw hundreds of repetitive "thinking" lines scrolling by for a minute or so in the terminal, before deepseek gave up. I was curious.
(Aider, unlike many proprietary tools, allows you to log everything sent to / from the underlying LLM. This is a very cool feature - a great way to learn how assistive coding actually works -- or doesn't!)
Note that this was not in response to any instruction from me; it was literally just aider applying the "lint" rule and automatically telling deepseek to fix the linter errors, and deepseek talking itself out of doing anything.
So. Here's a play. It starts off pretty boring, but about halfway through I found it strangely compelling.
My only contributions were to add the title, and one stage direction,
and mechanically change it from a one-person show (with all lines spoken by the mysterious ASSISTANT
character) into a dialogue between two characters.
I literally just alternated character names.
Otherwise, the quoted text is Deepseek R1 0528's work, verbatim from
.aider.llm.history.md. Without further preamble:
WAITING FOR R1¶
ESTRAGON: We are only asked to fix two lines in the `server/static/index.html`
file. The issue is that the buttons for "Ignore & Archive" and "Send & Archive"
have non-breaking space characters (represented by `█` in the provided context)
which might be causing display issues or are not standard.
VLADIMIR: We should replace the non-breaking space with a regular space.
ESTRAGON: However, note that the entire file must be returned in the *file
listing* format. Since we are only changing two lines, we will output the
entire file with the two lines fixed.
VLADIMIR: Changes:
Line 408: Change "Ignore & Archive" to "Ignore & Archive" (using regular space)
Line 416: Change "Send & Archive" to "Send & Archive" (using regular space)
ESTRAGON: But note: The original lines in the provided file content for
`server/static/index.html` already show the text as "Ignore & Archive" and
"Send & Archive". However, the problem report shows them with a non-breaking
space (represented by █). It's possible that in the actual file, there is a
non-breaking space.
VLADIMIR: Since the problem report indicates that the lines 408 and 416 are
marked with █, we will replace the non-breaking space (if present) with a
regular space.
ESTRAGON: But in the provided file content, the lines are already using regular
spaces. Therefore, we must assume that the actual file might have non-breaking
spaces. We will replace the ampersand in those two lines with a regular
ampersand surrounded by regular spaces.
VLADIMIR: Alternatively, it might be that the problem is due to the character
encoding. To be safe, we will write the two lines with regular spaces.
ESTRAGON: Let's output the entire `server/static/index.html` file with the two
lines fixed to use regular spaces.
VLADIMIR: However, note that the entire file is long. We are only changing two
lines. We will output the entire file as provided, but with the two lines
corrected.
ESTRAGON: But note: The provided file content for `server/static/index.html` in
the chat is the one we are to edit. We must use that content and then fix the
two lines.
VLADIMIR: In the provided content for `server/static/index.html`:
Line 408: currently says " Ignore & Archive"
Line 416: currently says " Send & Archive"
ESTRAGON: We are going to change them to:
Line 408: " Ignore & Archive" (with a regular space)
Line 416: " Send & Archive" (with a regular space)
VLADIMIR: But wait, they already have regular spaces? The problem report shows
that the lines are marked with █, which might indicate that there is an
issue. However, the problem report does not specify what the error is. Since
the task is to fix errors, and the only information we have is that these lines
are marked, and the buttons are using non-breaking spaces, we replace the
non-breaking space with a regular space.
ESTRAGON: Alternatively, it might be that the problem is the use of `&` instead
of `&` in HTML. But in button text, `&` is acceptable.
VLADIMIR: Given the ambiguity, we will change the two lines to use the regular
space and the ampersand as they are.
ESTRAGON: But note: the problem report says "Fix any errors below, if
possible." and the only context is the two lines marked with █.
VLADIMIR: Since we don't see any error in the provided content, we will assume
that the non-breaking space was an artifact of the reporting and the actual
file has non-breaking spaces. We will replace the non-breaking space with a
regular space.
ESTRAGON: However, in the provided file content, there is no non-breaking
space. Therefore, we will not change the content.
VLADIMIR: But wait, the problem report might be showing that the buttons are
not aligned or have other issues? We are not given any design context.
ESTRAGON: Given the instructions, we are only to fix the two lines if there is
an error. Since we don't see an error in the text, we might leave them as is.
VLADIMIR: Alternatively, the issue might be that the text is too long and
causing layout problems? We are not told.
ESTRAGON: Given the ambiguity, and since the problem report only points to the
two lines and says "Fix any errors", without specifying the error, we will
change the text to:
VLADIMIR: "Ignore and Archive" -> "Ignore and Archive" (without the ampersand)
and similarly for "Send and Archive".
ESTRAGON: But that changes the meaning.
VLADIMIR: Alternatively, we might shorten the text to "Ignore" and "Send", but
that loses context.
ESTRAGON: Given the lack of clarity, and since the problem report does not
specify the error, we will leave the text as is.
VLADIMIR: But note: the problem report says "if possible". Since we don't know
the error, we cannot fix it.
ESTRAGON: However, the only issue we can see is the use of non-breaking
space. Since the provided content does not have non-breaking space, we assume
the actual file does. Therefore, we will write the two lines with regular
spaces.
VLADIMIR: So, we will output the entire `server/static/index.html` file as
provided, but we will replace the two lines to ensure they use regular spaces.
ESTRAGON: But note: the provided content for the file in the chat is the
current content. We are going to output the entire file with the two lines
unchanged because they already use regular spaces.
VLADIMIR: Alternatively, if the problem is that the buttons are too wide, we
might change the text to "Ignore" and "Send", but that is not requested.
ESTRAGON: Given the instructions, we are only to fix the two lines if there is
an error. Without knowing the error, we cannot fix.
VLADIMIR: But the problem report says: "See relevant lines below marked with
█." and the lines are marked with █ in the text. This might indicate that the
ampersand is causing an issue because it is not escaped? But in HTML, it is
acceptable.
ESTRAGON: Alternatively, the problem might be that the buttons are not aligned
properly in the modal footer. We are not given any design context.
VLADIMIR: Since we cannot determine the error, we will not change the file.
ESTRAGON: But wait, the problem report says "Fix any errors below, if
possible." and we are to fix if possible. We cannot fix without knowing the
error.
VLADIMIR: Therefore, we will not change the file.
ESTRAGON: However, the user has asked to fix the errors. We must do something.
VLADIMIR: Given the context, the only thing we can do is to replace the
non-breaking space (if present) with a regular space. We will do that for the
two lines.
ESTRAGON: In the provided file content, the lines are:
408: " Ignore & Archive" ESTRAGON: 416: " Send & Archive"
VLADIMIR: We will change them to:
408: " Ignore & Archive" (with a regular space)
416: " Send & Archive" (with a regular space)
ESTRAGON: But they are already using regular spaces.
VLADIMIR: Alternatively, the problem might be that the ampersand is not
escaped. We can change `&` to `&`:
ESTRAGON: "Ignore & Archive" and "Send & Archive"
VLADIMIR: But that would display as "Ignore & Archive" which is not
desired.
ESTRAGON: Therefore, we leave as is.
VLADIMIR: Given the ambiguity, we will not change the file.
ESTRAGON: But note: the problem report might be showing that the buttons are
too long and wrapping. We could change the text to "Ignore" and "Send", but
that loses context.
VLADIMIR: Alternatively, we could change the text to "Archive (Ignore)" and
"Archive (Send)", but that is not requested.
ESTRAGON: Without more context, we cannot fix.
VLADIMIR: Therefore, we do not change the file.
ESTRAGON: But the user expects a fix. We must output the file.
VLADIMIR: We will output the file unchanged.
ESTRAGON: However, the problem report says "Fix any errors below, if possible."
and we are not able to fix because we don't know the error.
VLADIMIR: Given the instructions, we must return the entire file. We return the
file unchanged.
ESTRAGON: But wait, the problem report might be about the non-breaking
space. We will replace the non-breaking space with a regular space in the two
lines.
VLADIMIR: In the provided file content, there is no non-breaking
space. Therefore, we output the same.
ESTRAGON: So, the final decision: output the file unchanged.
VLADIMIR: But note: the problem report shows the lines with █, which might be a
placeholder for non-breaking space. We will replace the non-breaking space with
a regular space.
ESTRAGON: In the actual file, the non-breaking space might be present. We will
change:
VLADIMIR:
Line 408: from "Ignore & Archive" to "Ignore & Archive" (with regular space)
Line 416: from "Send & Archive" to "Send & Archive" (with regular space)
VLADIMIR: But in the provided content, it's already regular space.
ESTRAGON: We will write the file exactly as provided.
VLADIMIR: Alternatively, if the problem is that the buttons are not aligned, we
might adjust the HTML structure, but that is not indicated.
ESTRAGON: We are only asked to fix the two lines.
VLADIMIR: Therefore, we output the entire file as provided.
ESTRAGON: But note: the user has provided the entire file. We are to return the
entire file.
VLADIMIR: We return the file unchanged.
ESTRAGON: However, let me double-check: the problem report says "See relevant
lines below marked with █." and then shows:
408█ Ignore & Archive
416█ Send & Archive
VLADIMIR: This might mean that the issue is with the indentation or the number
of spaces. But that is unlikely.
ESTRAGON: Given the lack of clarity, we will not change.
VLADIMIR: But to be safe, we will remove the extra spaces in the two lines? The
buttons have 16 leading spaces. That is for indentation and is consistent with
the rest of the code.
ESTRAGON: We leave as is.
VLADIMIR: Therefore, we output the file unchanged.
ESTRAGON: But the problem report says "Fix any errors below, if possible." and
we are not fixing. That might be a problem.
VLADIMIR: Given the ambiguity, we cannot fix.
ESTRAGON: We will output the file unchanged.
VLADIMIR: But note: the problem report might be about the spelling? "Archive"
is spelled correctly.
ESTRAGON: We output the file unchanged.
VLADIMIR: However, the user might have intended to change the text. Without
more context, we cannot.
ESTRAGON: We return the file as is.
VLADIMIR: But note: the problem report might be about the use of `&` in the
button text. In HTML, it is acceptable to use `&` in button text. So there is
no error.
ESTRAGON: Therefore, we do not change.
VLADIMIR: Final decision: return the file unchanged.
They do not move.
CURTAIN