Changelog
Changes you can see when using Gestrics, version by version. Anything invisible in day-to-day use — refactors, tests, build tweaks — is left out.
This file follows Keep a Changelog and Semantic Versioning.
1.1.0 — 2026-09-17
The first release that actually ships. It replaces the installer uploaded on 10 August under this same number: that build was produced before the licensing code existed, so it did not include the activation its own release note announced.
Added
- A proper menu bar (File, Edit, View, Window, Help), with the app's real features instead of Electron's generic default: new contact or project, export and import backup, check for updates, reopen the getting-started guide, download the technical log, terms of use and support contact. In Spanish or English depending on the app's chosen language.
- New-version notice. On startup the app checks whether a later version has been released and, if so, says so in a strip below the header with a download link. It never downloads or installs anything on its own. "Not now" silences that particular version, so the notice comes back when the next one ships. Offline, the strip simply does not appear.
- Licence activation and validation. The app requires an active licence to run, and lets you deactivate the current computer so you can activate it on another one.
- "Send delivery" on the job card. Previously you had to scroll to a separate card at the bottom of the page, upload the files there and then, in a second step, tick them and send; anyone who did not know that card existed could not find how to deliver the work at all. Files are now picked inside the send dialog itself.
- "Send invoice" on the invoice card, with the invoice file visible and the download button beside it. Emailing the invoice was possible before, but only through a path you had to know about in advance.
- CAT category breakdown on the project page. It was previously only visible by reopening the edit form.
- Free-text language pair, with the common combinations offered as suggestions. It used to be six fixed options, all between English, French and Spanish, plus an "Other" that forced a detour on every project.
- Phone, address and tax ID in contact export and import. They were dropped on every export.
- Charts in Metrics: collected per month over the last twelve, and collected per client, largest first. Until now the tab was only figures and tables: you could read how much had been collected in total, but not whether this month is going better than the last, nor which clients the money comes from.
- A configurable main currency in the translator settings. Totals in the header and in Metrics are summarised in it. The most-billed one is suggested, but the choice is the translator's: it is usually the currency they think and pay taxes in, which need not be the one they earn most in.
- A support address inside the application: in the translator profile, next to the technical log download button, on the server-unavailable screen and on the recovery screen after an error. It lived only on the website, so anyone who got stuck inside the program had no one to write to without leaving to look for it.
- The license activation screen now says who to write to. The messages for a suspended or blocked license, or one activated on too many devices, all ask you to contact support, and that screen —the very first one, with the whole app behind it— gave no address at all: the only one in the app lives in the translator profile, on the far side of the door that won't open.
- The setup guide can always be reopened, from Settings. It used to be a header icon that only appeared if you had skipped the profile step, so anyone who filled in their name —most people— lost the wizard and the tour for good. It now sits next to Diagnostics, where the rest of the housekeeping lives, and takes up no room in a header that has none to spare.
- The empty contact list now says where to start. On a fresh install it was the first thing you looked at —an icon, "No contacts" and nothing else— with both doors in plain sight but neither announcing itself as the first step. It now names both: the "New contact" tab above and the "Import contacts" button below. It only shows while the list is genuinely empty, never when it is the search box or the status filter that found nothing.
- The new-project form now says where clients come from when there are none. Anyone who buys the app for the invoicing goes straight to Projects and finds the client dropdown with a single option, "pick one": clients are your Outreach contacts, which is a different tab, under a different name, with nothing tying the two together. The hint only shows while the list is empty.
- The onboarding wizard now explains what the tax country decides, with the same sentence the translator profile already used: that choice drives the name of each tax, the rates offered, the tax ID label and whether the invoice carries Veri*Factu. It was the only one of the two places where you pick it that said nothing — and it is the first one you go through.
- 14-day free trial. The whole application can be used, with no key and no card, for fourteen days from the first time it is opened. A strip under the header shows how many are left, turning from amber to red for the last three; from there you can buy a license or enter one you already have. Once the time is up, the application asks for a license to get back in and says so in those words, instead of pointing you to a purchase email that never existed. Your data stays where it was.
- Gestrics now downloads for Mac too. A single installer that covers both Apple Silicon and Intel, with nothing to choose between. It carries no developer signature, so the first time macOS refuses to open it and you have to allow it from System Settings → Privacy & Security; the website explains this next to the download button.
Changed
- The approximate total in Metrics now converts 24 currencies, not four. Exchange rates were only fetched for the dollar, pound, Swiss franc and Canadian dollar, so invoicing in Swedish krona, Mexican pesos or yen left that money out of the consolidated total. Rates are now fetched for every currency in the dropdown that the European Central Bank publishes. The four it does not — Argentine peso, Chilean peso, Colombian peso and dirham — are still left out, and the screen lists them rather than hiding it.
- The currency dropdown is no longer 159 entries long. Reaching the euro meant scrolling past the Afghan afghani, the Angolan kwanza and the Azerbaijani manat. It is now 28 — the ones a translator with international clients actually gets paid in. A project already saved in any other one keeps it: it still appears in that project's own dropdown, so opening and saving it does not change its currency.
- The Spanish interface no longer mixes "follow-up" with "seguimiento". The English wording is unchanged — there "follow-up" is the right term.
- Shorter, clearer button labels. The two "Show key" buttons in Settings are now "Show"; the Stripe one is "Connect", pairing with the "Disconnect" next to it; "Deactivate this device" is now "Deactivate"; and the getting-started button says what it opens: "Open getting-started guide".
- The privacy policy now also lists the version check. It is the fourth connection the app makes, alongside the mail server, Keygen and the exchange rates, and that list exists in order to be complete. No data is sent — it is a read request for a static file — but it now says so. Because this changes the list of processing activities, the app asks for the legal texts to be accepted again next time it opens.
- The main currency is now picked by name, not by its code. The profile field shows "Euro" or "US Dollar", with the code in the tooltip, and the list is sorted alphabetically by that name. The currency dropdowns on a project still show the code: they sit inline in narrow fields where a long name does not fit.
- The app's English is no longer a literal translation of the Spanish. An audit of all 867 pairs, read one by one: calques were removed ("E.g.:" where "e.g." belongs, Spanish dashes, sentence orders copied across) and terms that had several forms at once were unified — "encargo" was "job" twelve times and "assignment" once, and "factura rectificativa" had three different English words, one of them ("credit note") a different document altogether.
- The "Send delivery" button is now "Send deliverables". It opened a dialog titled "Send deliverables", and what gets sent are the files, not the job.
- The terms of use no longer claim the invoice complies with Spanish Royal Decree 1007/2023. The invoicing section said that, on the Spain profile, the app generates documents "following, in 'No Veri*Factu' mode, the technical requirements" of that decree. That was not accurate: the hash-chained record the app keeps is its own traceability measure, and neither the QR code nor the hash follows the format required by Order HAC/1177/2024. The text now describes what it actually does and states plainly what it does not yet meet, so nobody relies on it with their accountant.
- Full visual overhaul: new wordmark, consistent icons throughout, a shared design for dialogs, skeleton placeholders instead of spinners, custom scrollbars, and a single system of corner radii and shadows.
- Every piece of interface copy rewritten, in both Spanish and English.
- Template editing and preview merged into one screen, instead of two separate modes.
- The email subject saves itself as you type.
- The invoice is no longer stored as a file: it is generated at the moment you download or send it, so it always reflects the current data. Previously a copy frozen at invoice-creation time was kept, which meant anyone generating a payment link afterwards could send the client an invoice without that link.
- Currencies are named by their ISO code — EUR, USD, GBP — in Metrics and in the header, instead of by symbol. Only the euro and the dollar have a symbol in Spanish, so a single list mixed "€" and "US$" with "GBP" and "CHF".
- The header shows a single abbreviated total in the main currency — "EUR 201k" — instead of a list of per-currency amounts that did not fit the cell. The full amount appears on hover, and a negative profit is shown in red.
- A freshly installed Metrics tab no longer greets you with a grid of dashes. Four cards reading "—" and three tables repeating "Not enough data" were the first impression for someone who had just installed the app.
- Tax-number placeholders no longer show a Spanish format. "00000000X" appeared under fields labelled RFC, SIRET or GST depending on the country. In the Spanish interface the client's field was also labelled "CIF / NIF", so a Mexican translator saw Spanish wording above their client's RFC; it now uses the same neutral wording the English interface always had.
- The "Quoted" counter explains what it counts on hover: quotes already sent to the client. It read 0 while the first project sat in the "Quoted" state, and without an explanation that looked like a fault at the most fragile moment of all.
- The project form's examples are prefixed with "E.g." so they do not read as data already entered. The new-contact and new-project buttons lose their "+".
- The rate writes its decimal separator according to the language: "0,11 EUR/word" in Spanish, where it previously read "0.11" right below amounts written with a comma. The quote the client receives stays in English, with a point.
- The "server unavailable" screen no longer asks for a terminal command. It showed
cd server && npm startto someone with no terminal —the local server is started by the application itself— and no folder by that name even exists. It now states the only thing a user can actually do: close Gestrics and open it again, which relaunches the process. - Connecting your email is no longer required to get in. The onboarding wizard's "Connect your email" step could not be skipped, does not close on Escape or on an outside click, and covers the rest of the app — so anyone without an app password to hand was locked out of what they had just installed, even though projects, quotes and invoices work without email. It can now be left for later: while it is still pending, the Settings gear carries an amber dot that explains itself on hover, and any attempt to send says so in the interface language instead of failing against the server.
- The wizard's email step now says which account is connected, not just that one is. A green tick with no address asks you to take its word for it, and that is exactly the doubt that leads to retyping an app password that was fine.
- The wizard's second step was called "Billing details" and collected two of the profile's twenty-seven fields. It is now "Name and tax country" and says where the rest —tax ID, address, IBAN— gets filled in, instead of implying an invoicing setup that stops halfway.
- The Terms of Use now cover the trial period. Section 3 becomes "Trial period, license to use and activation" and describes the fourteen days: every feature, no key and no means of payment, counted on the device itself. It previously said only that use was subject to payment and a license key. Because this is a substantive change, the application asks for the terms to be accepted again the next time it opens.
- The support address is now
contact@outreachstudio.app. It replacessoporte@, and it is the one shown in the translator profile, on the "server unavailable" screen, on the recovery screen after an error, on the licence activation screen and on the line that asks for the send log to be attached. It comes from a single constant, so all five change together; the website advertises the same one.
Fixed
Backup
- Restoring a backup silently dropped eleven columns. The restore writes each table naming its columns one by one, and the ones added later were never added there. Among the losses: the issuer identity frozen at invoicing time — so an old invoice went back to using your CURRENT details — the tax country it was issued under, the date of supply, the payment-reminder state — your client received the whole chasing sequence again for an invoice they may already have paid — the Stripe payment link, and the flag marking a deliverable as already sent. The quietest one: the period of a recurring invoice, which is what stops the same month being invoiced twice; without it, restoring was enough to issue that month's invoice a second time. A backup now returns exactly what it stored, and a check verifies it by exporting, restoring and comparing.
Invoices and quotes
- One invoice in ten did not add up to its own total. VAT and withholding are rounded to the cent, but the total was computed on the full decimals, so the totals block could contradict itself: on a €50.03 base the invoice read 50.03 + 10.51 − 7.50 with a TOTAL of 53.03 instead of 53.04. Sweeping bases from €50 to €10,000 at the usual rates, 1,160,062 of 11,940,012 combinations failed to add up. Each amount is now rounded to its currency's smallest unit — the yen has no cents, the Kuwaiti dinar has three — and the total is the sum of those figures, which is what gets paid.
- The CAT breakdown lines did not add up to their own total. Each line was rounded on its own while the total came from the exact amounts, so the printed lines could differ from the figure below by a cent: at €0.0333 per word, four lines added up to €43.92 while the total read €43.91. On a quote that invites a question from the client; on an invoice the mismatch was against the taxable base, which is precisely what those lines exist to determine. The difference is now allocated to the largest line and the document adds up.
- An invoice with no issue date vanished from the accounting CSV. It was dropped even when exporting everything with no date range, so an issued invoice could simply never reach your accountant without anything saying so. It now appears in the full listing, with the date column blank so the problem is visible; a quarterly export still leaves it out, since without a date it cannot be assigned to a period.
- A client name in Hindi (or any Indic script) came out as empty boxes. The fallback font meant to cover them was looked up under a filename that does not exist on Windows, so it was never used. It now prints correctly, and the internal warning that reported the lost characters — which did work — stops firing.
- New warning when invoicing a client whose details are in Arabic or Hebrew. The PDF prints those letters reversed and unjoined, because it does not lay out right-to-left text. Since the recipient's name is mandatory on an invoice, the dialog now warns you before issuing instead of letting you find out in the document you already sent.
- A country written without accents left the invoice missing its mandatory wording. The dropdown on the client card stores canonical names, but importing contacts from a spreadsheet stores whatever the file says: "Espana", "Belgica", "Paises Bajos", "Deutschland", "Holanda", "USA"… None were recognised, and an unrecognised country meant the app did not print the reverse-charge wording on an intra-EU invoice. Accents, dots and the most common endonyms now resolve alike. And when the country still isn't recognised, the issuing dialog warns before you issue instead of staying silent.
- Editing a paid invoice wiped its payment date. Just opening the invoice and saving again was enough, even without changing anything: the dialog doesn't send the payment date, and the server blanked it anyway. From then on, the CSV for your accountant reported that invoice as unpaid with an empty payment-date column, it dropped out of "Collected" and out of the average time-to-payment in Metrics, and the job card offered to generate a payment link again for something your client had already paid.
- The default due date counted from today, not from the invoice date. An invoice dated earlier said "30 days" and fell due after 47. The sum was also done in hours: the day daylight saving ends is 25 hours long, so the term landed a day early. It is now 30 days from the invoice date, counted in days.
- Dates were off by one day outside the Madrid time zone. A date stored as
2026-08-20was read as midnight UTC, so in Mexico, the United States, Brazil, Chile, Colombia, Peru, Argentina or Canada it was shown and printed as the 19th. It affected everything at once: the invoice issue and due dates, the quote's validity, the date of supply, and every date in the interface. Writing failed the other way round — the UTC day was used — so invoicing in the afternoon in Mexico issued the document with tomorrow's date, and that date is frozen into the invoice ledger. Alerts were off too: an invoice showed as overdue on its own due date, and the payment reminder reached the client a day early.
- You could issue an invoice without your own tax details. Until now the tax ID and address were optional fields in Settings, so a fresh installation could generate an invoice whose issuer was just a name. Such an invoice is not valid anywhere. The app now refuses to issue it and says exactly which fields are missing and where to fill them in; the rejected invoice consumes no number and leaves no trace. The client's details are not blocked — their tax ID is not always mandatory, and requiring it would prevent invoicing a private individual — but the issuing dialog warns when they are missing and explains when they matter.
- Correcting an issued invoice left two documents in circulation under the same number. When you changed the VAT or withholding on an invoice you had already sent, the app asked for a reason and recorded the correction in its internal ledger, but the PDF still came out with the original number and date and the new amounts: the client ended up with two different pieces of paper both claiming to be invoice 2026-001. The QR code, which did read the right ledger entry, also contradicted the heading printed right above it. The document is now issued as what it is — "RECTIFICATIVE INVOICE #R-2026-001", with its own date, the invoice it corrects, the reason and the rectified amount — and the QR agrees with the heading. The project card and the email attachment use that number too.
- The invoice said two different things about when it was due, and neither was yours. The top right read "Payment due: 30 days end of month" and halfway down the page "Payment due upon receipt": both were hardcoded and contradicted each other, while the due date you actually picked when issuing never appeared anywhere. The invoice now shows that real date, next to the issue date. Leave it blank and nothing is printed, rather than inventing a term.
- "Invoice notes" did not appear on the invoice. The issuing dialog asks for that text under exactly that label and suggests using it for an account number or payment terms; it was then stored and never shown on the document. It now prints below the payment terms, on its own page if needed and without truncation — it is where a legal mention goes, such as the reverse charge on an intra-EU invoice.
- Changing your own details rewrote invoices you had already sent. The issuer's name, tax ID, address and bank details were read from Settings every time a PDF was downloaded, not from what they were at issue time. Moving house, fixing a typo or incorporating changed who appeared as the issuer on every earlier invoice, including the ones the client already had. That identity is now frozen on the invoice, and the QR code likewise stops attributing an old invoice to a new tax ID. Invoices issued before this change behave as they did, since they have nothing frozen to show.
- A foreign client's name was destroyed in the PDF. Both documents were generated with the PDF format's standard fonts, which only cover the Western Latin alphabet. Any other character came out as garbage, with no warning: a Polish agency called "Biuro Tłumaczeń Sp. z o.o." was printed as "Biuro T'VÖ7eB7.". The same went for Czech, Turkish, Romanian, Greek, Cyrillic, Japanese, Chinese and Korean — and the recipient's name is a mandatory invoice detail. Only Spanish accents and the euro sign were spared, which is why invoicing within Spain never showed the problem. Both documents now embed a full font, with automatic fallback for alphabets that font does not cover, and anything no installed font can represent is recorded in the application log instead of silently vanishing.
Onboarding
- Switching email provider in the wizard left the previous provider's error on screen: picking "Custom" after failing with Gmail still showed the notice about the Gmail app password, below a form that was now asking for something else.
- With a "Custom" email provider, the "Use SSL/TLS" checkbox came ticked while the suggested port was 587 — precisely the combination that cannot work, since 465 is TLS from the first byte and 587 is STARTTLS. Anyone who typed their own server and left the suggested port failed on the first attempt without having got anything wrong. The checkbox now starts unticked, matching 587, and follows the port on the two values where the answer is not open to debate; on any other (2525, 25, one of the provider's own) whatever you ticked by hand is respected. This covers both forms, the wizard's and Settings'.
- Connecting your email from the onboarding wizard left the Settings screen looking as if no account existed —provider "Gmail", every field empty— with the email already working. The wizard only wrote where the server reads to send, and that screen is painted from somewhere else that nothing was updating; for the same reason, reopening the wizard asked again for the password of an account that was already connected. The password is still not stored there.
Invoicing and tax
- A recurring plan could skip its own first month, and nobody claimed it. The date a plan is created is stored in universal time, but it was read as if it were the translator's local time. For anyone working west of Greenwich, a plan created early on the 1st was recorded as belonging to the following month: that instalment never showed up among the pending periods, the plan counted as up to date, and the retainer went unbilled with no warning at all. In Spain the bug was invisible, because there both readings agree.
- The e-invoicing notice switched its wording a day early or a day late. The date each country's mandate starts to apply was compared against the universal day instead of the local calendar day, so the notice could move by one day depending on the time zone.
- Withholding tax now appears under the name it has in the issuer's country — ISR in Mexico, IRPF in Spain — in the form, on the invoice card and in the PDF. It previously always said "IRPF", so a Canadian invoice displayed a Spanish tax, and a Mexican one could show four different names for the same tax.
- Negative VAT and withholding rates are rejected on both creation and rectification.
- A rectification that only redistributes VAT and withholding without changing the total is now recorded as such.
- An invoiced project can no longer be deleted.
- The manual project status can no longer mark a project as invoiced when no invoice exists.
- CAT breakdown amounts respect each currency's decimal places.
- A skipped month of recurring billing was lost for good: if the app was not opened for a month, on returning only the current one was generated and the plan was marked as up to date, with no warning and no way to recover the missed month from any screen.
- Restoring a backup could issue the same month's invoice twice, each with its own number and its own ledger entry.
- The label on the profile's tax-note field was hardcoded to "VAT / Tax note": one country's tax names on the same line, whoever was looking. It now comes from the fiscal profile like the rest of the app — "GST note" on an Indian profile, and the translated generic when the country has no term of its own.
- The IBAN placeholder suggested a Spanish-shaped number (
ES00 0000…) whatever the fiscal profile said. It is now neutral (XX00 0000…): it keeps the hint about how an IBAN is grouped without assuming the country, and it matches the BIC placeholder beside it. - The accounting CSV export hardcoded both tax column headers in Spanish ("% IVA", "% IRPF"), ignoring the fiscal profile: a translator with a Mexican profile got an "IRPF" column for what their country calls ISR, contradicting the PDF of that same invoice. With the interface in English, the whole header row, each row's status and the file name still came out in Spanish.
- The "Correction history" for an invoice named the withholding tax generically instead of by the name it has in the translator's country: with a Mexican fiscal profile it read "Withholding" where the rest of the app already said "ISR". The VAT on that same line was already correct.
- The warning about a negative tax rate named IVA and IRPF, two Spanish taxes, regardless of the translator's country: a Mexican user was told the problem was their IRPF, which does not exist there — their withholding is ISR — and an Indian user, who only has GST, got the same. It now refers to "tax rates", naming none of them.
- Withholding was labelled "IRPF" on almost everyone's invoice. Only Spain and Mexico had a name of their own for it, so a Colombian, Argentine or Chilean translator — or anyone from the remaining countries — saw the Spanish tax named where theirs belonged. When a country has no specific name, it now says "Retención" (plain "Withholding" in the English interface). VAT is unchanged: that one really is called the same across the Spanish-speaking world.
- The reason field for a credit note asked for it "when changing VAT/IRPF" and offered "VAT applied incorrectly" as the example, two lines below fields that did call each tax by its own name. Those two sentences now use the country's name as well.
Data and backups
- Restoring a backup kept the contact but lost its entire history. Not any more.
- Restoring no longer loses creation and modification dates either.
- Advancing a project's status deleted every deliverable, including files that had never been sent to anyone. Only files that actually reached the client are removed now.
Metrics
- The header overflowed when several currencies were involved: the amount spilled out of its cell and over the label next to it.
- The "Net profit" card stretched across the full width when it wrapped onto a second row, and stopped looking like one card among others.
- The average-rate table showed rows that looked repeated — two "Technical", two "EN-ES". They were not: rows are grouped by label, currency and unit, because averaging 0.15 € with 0.18 $ would mean nothing. Each row now states what tells it apart from its siblings.
Outreach
- Stray spaces were only trimmed from the email address. A name or company pasted from LinkedIn or a spreadsheet kept its leading and trailing spaces, and those went straight to two places the client sees: the first line of the cold email ("Hi␣␣␣␣Marie Dupont␣␣␣,") and the client block on the invoice. Every field is trimmed now, and anything left blank is stored as properly empty.
- Changing a contact's email address wiped its history without asking. Fixing a typo in the domain destroyed the logged sends, the contact dates and the follow-up count, and sent the contact back to "Pending"; the notice appeared afterwards, once done. You are now asked first, told how many sends will be lost, and only when there is something to lose. Cancelling saves nothing and leaves the form as it was.
- A name made only of spaces got past the form and came back from the server as "failed to save contact", as if the app had broken rather than a field being missing.
- Saving a contact could leave it with no name or an unusable email address. The check existed when creating one but not when editing, and editing an already-deleted contact reported success.
- The daily sending limit was saved and displayed, but never enforced.
- Cancelling a batch send during a retry wait took up to a minute to take effect. It now responds almost immediately.
- The estimated duration of a batch send was overstated, worst of all on small batches.
- Contacts whose last send failed showed up as "Pending", with no way to tell them apart from contacts never contacted at all.
- Contact search ignores accents: "jose" finds "José".
- The 5 MB attachment limit was advertised but never checked; the failure only surfaced on sending, as a confusing email error.
- Email addresses with leading or trailing spaces are trimmed on save.
- Deleting a contact could be blocked with no way out by glossary terms or recurring plans that no screen let you manage.
- The notice that trims a batch send on reaching the daily limit left a literal
{{remaining}}on screen in its second sentence ("Sending to {{remaining}} of 8 contacts"), in both Spanish and English: the placeholder occurs twice in the string and only the first one was being filled in. - Pressing Enter at the end of a template did nothing, and whatever you typed next ended up stuck to your signature. Adding a postscript or a link below "Best regards, [Your name]" was impossible: the new line was never drawn, so the caret fell back to the previous one. It also left an invisible line break at the end of the saved text, which went out with the email.
- The Subject line gave no warning about braces that aren't real variables. Typing something like
{{tarifa}}there raised no warning — the template body did — and still stopped the send, marking the contact in red. The warning now appears next to whichever field causes it, subject or body. - A batch send with one of those braces marked every contact in the batch as failed, one by one, over a problem that belongs to the template and not to any of them. It is now flagged before the batch starts and the contacts are left as they were, the same as already happened with a missing subject, no email account or an empty attachment.
- A contact with no company was marked as failed if the template used that tag, with a message sending you off to check the template — when the template was fine and what was missing was one of their own details. Company is optional, yet it was the only one of the four contact fields treated as required when sending. And since failed contacts re-enter the next batch, it failed again every time. It now comes out blank, as specialty and languages already did, and before a batch starts you are told how many contacts are missing a detail the template uses, so you can cancel and fill it in. The same happened in the Projects emails — payment reminder, quote and delivery — which now also accept all five contact tags instead of just two.
- Undo after inserting a tag deleted something else. The tag went in through a route the browser does not record in its history, so Ctrl+Z skipped it and undid the previous edit instead: a word on another line disappeared and the tag stayed put. Same when pasting.
- Inserting a tag between two words left a double space.
- A tag typed by hand still showed as
{{nombre}}. It now turns into a tag like any other when you leave the editor. - Dragging formatted text into the editor smuggled its HTML in. Pasting already stripped it; dropping did not.
- The Subject line now shows what will go out underneath, with the same tags and the chosen contact's details. Before you only saw raw braces.
- Emptying a template and saving brought the factory one back, silently, and that was the one being sent. You are now told it cannot be left empty.
Sending email
- An already-saved password looked exactly like a field that never had one. The server never returns the email account password, not even encrypted, so the Settings field showed up empty whether or not an account was connected. Anyone coming back months later had no way to tell if their email was still set up. Now, when there is one, a green dot and “One is already saved” appear next to the label, and the field itself says “Leave blank to keep it unchanged”.
- The same email could reach the client three times. If the connection dropped right after the message was handed over — the server already had it queued and only the confirmation was lost — the app treated it as failed and sent it again up to three times, then reported an error. In outreach that means the same cold email repeated to a prospect. Only failures known to have happened before delivery are retried now, such as a temporary rejection of the recipient; everything else is reported without sending again.
- Every refusal from the mail server was announced as "check your app password". An address that does not exist, a message that is too large or one blocked by a spam filter all sent you off to retype a password that was perfectly fine, with no way out: the check in Settings kept saying it was correct. Each case now says what actually happened.
- A server that stalled halfway could leave the app on "Sending…" for up to half an hour — ten minutes per attempt, and it tried three times — with nothing to click and no way to tell whether the email had gone out. Each stage of the connection now has its own timeout.
- The subject line could go out with unresolved variables. If it contained "{{idiomas}}" or "{{especialidad}}" — the body template accepts both, and the unresolved-variable warning treated them as fine — the client received the literal braces in the subject line of a cold email. The contact's history even stored the correctly resolved subject, so it did not show up there either.
- An empty attachment was sent as if nothing were wrong. A 0-byte file — an export that failed halfway, or one the cloud had not finished downloading — was accepted, listed as an attachment, and then silently dropped at send time: the client got the email without the file and the app reported success. It can no longer be added, and if one arrives empty by another route the send stops and names it.
- Saving the email settings when the file could not be written to disk — no free space, no permissions, or an antivirus locking it — silently shut down the app's internal server: the window stayed open and everything else stopped responding without a single warning. It now explains the problem and the app stays up.
- A format that cannot be sent is now flagged when you pick the file, not when you send. An .exe or a .docm was accepted as an attachment — the file dialog's filter is only a hint, and picking "All files" got around it — sat in the list like any other, and the rejection only arrived when you pressed Send; in a batch, once per contact. It is now checked when you pick it and when it is saved, with the same rule deliverables already used.
- The sending warnings that were hardcoded in Spanish now read in the interface language: a malformed recipient address, an attachment that is too large, a format that is not accepted, more than five files, and the send-rate limit. Until now only connection errors with the mail provider were translated.
- Changing the email account without typing the password said "Settings saved" and changed nothing: the screen showed the new address while emails kept going out from the previous one. Since the password is never pre-filled, all it took was reopening Settings and editing the address. It now says the password is needed to verify the account and leaves the dialog open with everything you typed, instead of reporting as saved what was not.
Other
- The trial period is now anchored in the data already saved. It previously relied solely on its own record file, so an installation holding contacts, projects and invoices from weeks earlier could still present itself as brand new. Now, if that record is missing, the start is rebuilt from the oldest entry in the database. Nothing new is stored: only dates that were already there are read.
- The main currency dropdown came up completely blank. All 159 currencies were there, but every option rendered with no text and no value: the field was reading two properties the list does not have. On top of that, with no currency saved the browser showed the first one on the list — the UAE dirham — as if it had been chosen; the list now opens with an option that says what the app actually does until you pick one: summarise in whichever currency you bill most.
- “Cancel” in Settings did not revert three fields. The app password, the Stripe key and the licence key are typed outside the settings draft — they are text used to activate or verify something, not a setting that gets saved — so closing with Cancel left them there, still filled in on the next open, as if nothing had been cancelled. The modal now clears them when it opens.
- Response metrics were stuck at 0 after automatic reply detection was removed.
- The file types accepted as attachments are the same everywhere in the app, and include the formats used in translation work.
- Form examples no longer show addresses or numbers that looked like real data already filled in.
- With Windows in dark mode, the application shell appeared flanked by two almost-black bands. A dark-mode block inherited from the scaffolding template had survived, redefining the background, text and border of an interface that deliberately uses a light palette.
- The email templates no longer carry the original installation translator's identity anywhere in the installed application. A migration remained with their name, their degree and their professional profiles written in plain text, inside a file that is installed uncompressed.
- An internal server crash now leaves a record in
send.log. This is a separate path from the error screen, which recorded its own failures before and still does: this is about the process that stores your data. That it had died was recorded nowhere at all, and the reason came down to a race: the log is written through a stream that process shutdown does not wait for, so that last line — the one explaining the crash — arrived or not with nothing to guarantee it, and never arrived at all while the file had yet to be created. It is now written straight to the file before exiting, and the application also records that the internal server has terminated, which until now only went to a console the installed version does not have. - An unexpected server failure no longer takes the last thing you did down with it. The database saves lazily — changes pile up in memory and reach disk a second later — and closing the application properly forces that save before exiting. Crashing did not: there were two uncaught-exception handlers, and the first killed the process before the second, the only one that saved, ever ran. Any uncaught exception, or any unhandled promise rejection, threw away whatever was pending: the contact you had just edited, the hours you had just logged. All four exit paths now save.
- Unexpected interface crashes left no trace in
send.log. There were two nested safety nets, and the inner one —the one that actually caught every failure, being the closer of the two— only wrote to the browser console: the very file the error screen asks you to attach carried not a line about that crash. Only the outer net remains, and it does record the stack trace. - That error screen now appears in the active language. It carried all of its text in Spanish and English at once, one below the other, and was the only screen in the app that did not go through the translation system. On top of that, while no language had been chosen it always fell back to Spanish, even when the system was in English.
- Every warning the app gives you when something cannot be done now reads in the interface language. Until now a good part of them arrived in Spanish even with the app set to English, because the text was written inside the program and shown as-is. There are about fifty: contacts, jobs, invoices, recurring plans, hours, expenses, glossary, deliverables, Stripe, licence and exchange rates. Several also say more clearly what happened — that another contact already uses that email, how many jobs have to go before one can be deleted, or that an already-invoiced job has its amount frozen into its invoice.
Security
The app's first security review, focused on what can realistically happen to a translator: a bad file you open yourself, and a web page open in your browser while Gestrics is running.
- Restoring an incomplete backup no longer deletes issued invoices. Restoring a backup made with an older version — one that did not yet save the invoice ledger — emptied that ledger and reported success. And since invoice numbering is derived from it, the next invoice was named 2026-001 again: a number already sent to another client. The app now stops before touching anything, tells you how many issued invoices would be lost and with which numbers, and only continues if you confirm it explicitly.
- A backup with a tampered invoice ledger is never stored. Ledger entries are hash-chained precisely so that altering one shows; but on restore they were written back as-is, unchecked. A hand-edited backup file could write invented invoices for any amount. The whole chain is now verified before anything is restored, and an entry that does not check out never reaches the disk under any circumstances. If the backup's ledger is damaged, the app tells you and offers to recover everything else - contacts, jobs, invoices - leaving the ledger empty, rather than leaving you unable to restore at all.
- A restore that fails halfway no longer leaves your data halfway. Previously the tables were emptied and then filled row by row, skipping the ones that failed: the result was "restored" with an error count beside it, and an incomplete database. A restore is now a single operation — all of it or none of it — and if something fails it tells you which row, with your data untouched.
- The local server only answers requests addressed to 127.0.0.1. Gestrics runs a server on your machine so the app itself can talk to it. Even though it only listened locally, a web page open in your browser could reach it by pointing its own domain at your machine, and read your contacts, invoices and stored keys from there. The app now checks which name it was called by and turns away anything that is not your own.
- The date of the last licence check is now stored encrypted. The 7-day offline allowance hangs off it, and it sat in plain text inside
license-config.json: a date in a JSON file inviting you to change it in a text editor. It is now encrypted like everything else, and a hand-written date is discarded rather than trusted. This is the same rule already applied to the trial record; this file had simply been left out. If the first launch after updating happens offline, one online check is needed to regain the offline allowance. - An imported contact can no longer smuggle a formula into your exports. Excel and LibreOffice execute a cell that starts with
=,+,-or@. If you imported a contact list from an agency and one of its fields carried a formula, it was stored as-is: exporting your contacts and opening the file ran that formula on your machine. Those cells are now marked as text in CSV and TSV exports. Amounts are left alone, so the CSV for your accountant still adds up, and re-importing one of your own exports into Gestrics gives back the original text. - At 14 days the app now really does close. The end of the trial was enforced by the screen alone: behind it the local server kept answering everything, so there was still a way to go on using the app without a licence. It is now closed from the inside too, and the only thing left open is what you need in order to activate. Your data is untouched: it is all still there, and it comes back the moment you enter your key.
- Starting a fresh data folder no longer grants another trial. The start of the trial is anchored to the oldest trace of your own work, but that was only consulted when the record was missing: starting from scratch and bringing your data over AFTERWARDS gave you fourteen new days losing nothing. It is now always consulted, and the older of the two dates wins. This also fixes the honest case: restoring a backup on a new laptop continues the same trial instead of starting another.
1.0.0 — 2026-08-09
First public release. A desktop CRM for freelance translators, with all data kept on your own machine.
Added
- Outreach: contacts, email templates, batch sending with rate limits, per-contact status tracking and history.
- Projects: jobs with word counts, rates, CAT analysis import, time tracking, deliverables and a per-client glossary.
- Invoicing: invoices with VAT and withholding tax, a purpose-built PDF, a hash-chained ledger compliant with Veri*Factu, rectifications, per-country tax profiles and Stripe payment links.
- Metrics: income, expenses, response rates and a per-client breakdown.
- Full backups, plus contact export and import in CSV, TSV, Excel and ODS.
- SMTP sending with automatic provider detection.
- Spanish and English.
Historial de cambios
Cambios visibles de Gestrics, versión a versión. Lo que no se nota al usar la aplicación (refactorizaciones, pruebas, ajustes de compilación) no se recoge aquí.
El formato sigue Keep a Changelog y el versionado es semántico.
1.1.0 — 2026-09-17
Primera versión que se lanza de verdad. Sustituye al instalador que se subió el 10 de agosto bajo este mismo número: aquel se generó antes de que existiera el código de licencias, así que no llevaba la activación que su propia nota de publicación anunciaba.
Añadido
- Barra de menú propia (Archivo, Editar, Ver, Ventana, Ayuda), con las funciones reales de la aplicación en vez de la genérica que trae Electron por defecto: nuevo contacto o proyecto, exportar e importar copia de seguridad, comprobar actualizaciones, volver a ver la guía de inicio, descargar el registro técnico, términos de uso y contacto de soporte. En español o en inglés según el idioma elegido en la aplicación.
- Aviso de versión nueva. La aplicación comprueba al arrancar si hay una versión posterior publicada y, si la hay, lo dice en una franja bajo la cabecera con el enlace de descarga. No descarga ni instala nada por su cuenta. "Ahora no" silencia esa versión concreta, así que el aviso vuelve cuando se publique la siguiente. Sin conexión, la franja simplemente no aparece.
- Activación y validación de licencia. La aplicación pide una licencia activa para usarse, y permite desactivar el equipo actual para poder activarla en otro.
- "Enviar encargo" en la tarjeta del encargo. Antes había que bajar hasta una tarjeta aparte al final de la ficha, subir allí los archivos y, en un segundo paso, marcarlos y enviarlos; quien no supiera que esa tarjeta existía no encontraba cómo entregar el trabajo. Ahora los archivos se eligen dentro del propio diálogo de envío.
- "Enviar factura" en la tarjeta de la factura, con su archivo a la vista y el botón de descarga al lado. Mandar la factura por correo era posible antes, pero solo por un camino que había que conocer de antemano.
- Desglose por categorías CAT en la ficha del proyecto. Antes solo se veía reabriendo el formulario de edición.
- Par de idiomas de escritura libre, con las combinaciones habituales como sugerencias. Antes eran seis opciones fijas, todas entre inglés, francés y español, más un "Otro" que obligaba a un rodeo en cada proyecto.
- Teléfono, dirección y CIF en la exportación e importación de contactos. Se perdían en cada exportación.
- Gráficos en Métricas: cobrado por mes, los últimos doce, y cobrado por cliente ordenado de mayor a menor. La pestaña era hasta ahora solo cifras y tablas: se leía cuánto se había cobrado en total, pero no si el mes va mejor que el anterior ni de qué clientes viene el dinero.
- Moneda principal elegible en los ajustes del traductor. En ella se resumen los totales de la cabecera y de Métricas. Se propone la que más se factura, pero la elección es del traductor: suele ser la divisa en la que piensa y paga impuestos, que no tiene por qué ser en la que más ingresa.
- Dirección de soporte dentro de la aplicación: en el perfil del traductor, junto al botón de descargar el registro técnico, en la pantalla de servidor no disponible y en la de recuperación tras un error. Estaba solo en la web, así que quien se atascaba dentro del programa no tenía a quién escribir sin salir a buscarlo.
- La pantalla de activación de licencia ya dice a quién escribir. Los mensajes de licencia suspendida, bloqueada o activada en el máximo de equipos piden contactar con soporte, y esa pantalla —la primera de todas, con la aplicación entera detrás— no daba ninguna dirección: la única que hay vive en el perfil del traductor, o sea al otro lado de la puerta que no se abre.
- La guía de inicio se puede volver a abrir siempre, desde Configuración. Estaba en un icono de la cabecera que solo aparecía si se había omitido el paso del perfil, así que quien rellenó su nombre —lo más probable— perdía el asistente y el recorrido para siempre. Ahora vive junto al Diagnóstico, que es donde está el resto del mantenimiento, y no ocupa sitio en una cabecera que no da más de sí.
- La lista de contactos vacía dice por dónde se empieza. Recién instalada era lo primero que se miraba —un icono, «Sin contactos» y nada más—, con las dos puertas a la vista pero sin que ninguna se anunciara como el primer paso. Ahora nombra las dos: la pestaña «Nuevo contacto» de arriba y el botón «Importar contactos» de abajo. Solo aparece con la lista de verdad vacía, nunca cuando es el buscador o el filtro de estado el que no encuentra nada.
- El formulario de un proyecto nuevo dice de dónde salen los clientes cuando no hay ninguno. Quien compra la aplicación por la facturación va derecho a Proyectos y se encuentra el desplegable de cliente con una sola opción, la de «elige uno»: los clientes son los contactos de Prospección, que es otra pestaña, con otro nombre y sin nada que las relacione. La pista solo aparece con la lista vacía.
- El asistente de bienvenida ya explica qué decide el país fiscal, con la misma frase que el perfil del traductor: de esa elección salen el nombre de cada impuesto, los porcentajes que se ofrecen, la etiqueta del identificador fiscal y si la factura lleva Veri*Factu. Era el único de los dos sitios donde se elige que no lo contaba, y encima es el primero por el que se pasa.
- Periodo de prueba de 14 días. La aplicación se puede usar entera, sin clave y sin tarjeta, durante catorce días desde la primera vez que se abre. Una franja bajo la cabecera dice cuántos quedan, y en los tres últimos pasa de ámbar a rojo; desde ahí se puede comprar la licencia o introducir una que ya se tenga. Cumplido el plazo, la aplicación pide licencia para volver a entrar y lo dice con esas palabras, en vez de mandar a buscar una clave de compra que nunca hubo. Los datos siguen donde estaban.
- Gestrics ya se descarga también para Mac. Un solo instalador que vale para Apple Silicon y para Intel, sin tener que saber cuál llevas. Va sin firma de desarrollador, así que la primera vez macOS se niega a abrirlo y hay que autorizarlo en Ajustes del Sistema → Privacidad y seguridad; la web lo explica junto al botón de descarga.
Cambiado
- El total aproximado de Métricas ya convierte 24 divisas, no cuatro. Solo se pedían tipos de cambio para dólar, libra, franco suizo y dólar canadiense, así que facturar en coronas suecas, pesos mexicanos o yenes dejaba ese dinero fuera del total consolidado. Ahora se piden para todas las del desplegable que publica el Banco Central Europeo. Las cuatro que no publica —peso argentino, peso chileno, peso colombiano y dírham— siguen quedando fuera, y la pantalla las enumera en vez de callárselo.
- El desplegable de divisa deja de tener 159 monedas. Para llegar al euro había que pasar por el afgani afgano, el kwanza angoleño y el manat azerbaiyano. Quedan 28, las que un traductor con clientes internacionales puede cobrar de verdad. Un proyecto ya guardado en cualquier otra la conserva: sigue apareciendo en su propio desplegable, así que abrirlo y guardarlo no le cambia la divisa.
- Se acabó el «follow-up» en la interfaz en español, que convivía con «seguimiento» en la misma pantalla: el estado del contacto, la plantilla, el botón del envío en lote y el tipo de entrada del historial dicen ahora todos «seguimiento». Los envíos ya registrados se ven con la palabra nueva sin tener que hacer nada. En inglés no cambia: allí «follow-up» es el término correcto, no un anglicismo.
- Botones con nombres más cortos. Los dos «Mostrar clave» de Configuración pasan a «Mostrar»; el de Stripe, a «Conectar», que hace pareja con el «Desconectar» de al lado; «Desactivar este equipo» a «Desactivar»; y el de la guía de inicio dice ya qué abre: «Abrir guía de inicio».
- La política de privacidad enumera también la comprobación de versión. Es la cuarta conexión que hace la aplicación, junto al servidor de correo, Keygen y los tipos de cambio, y esa lista está para ser completa. No se envía ningún dato —es una petición de lectura de un archivo estático—, pero ahora lo dice. Al ser un cambio de la lista de tratamientos, la aplicación vuelve a pedir que se acepten los textos legales la próxima vez que se abre.
- La moneda principal se elige por su nombre, no por sus siglas. El campo del perfil enseña «Euro» o «Dólar estadounidense», con el código en el tooltip, y la lista va ordenada alfabéticamente por ese nombre. Los desplegables de divisa de un proyecto siguen con el código: van en línea y estrechos, y ahí un nombre largo no cabe.
- El inglés de la aplicación deja de ser una traducción literal del español. Auditoría de los 867 pares leídos uno a uno: se quitaron los calcos («E.g.:» donde va «e.g.», rayas españolas, órdenes de frase copiados) y se unificaron los términos que tenían varias formas a la vez — «encargo» era "job" doce veces y "assignment" una, y «factura rectificativa» llegó a tener tres ingleses distintos, uno de ellos ("credit note") otro documento diferente.
- El botón «Enviar encargo» pasa a llamarse «Enviar entregables». Abría un diálogo titulado «Enviar entregables», y lo que se manda son los archivos, no el encargo.
- Los términos de uso ya no afirman que la factura cumpla el Real Decreto 1007/2023. El apartado de facturación decía que, con el perfil España, la aplicación genera documentos «siguiendo, en modalidad "No Veri*Factu", los requisitos técnicos» de esa norma. No era exacto: el registro encadenado por hash que lleva la aplicación es una medida propia de trazabilidad, y ni el código QR ni la huella siguen el formato que exige la Orden HAC/1177/2024. El texto explica ahora lo que de verdad hace y dice de forma expresa lo que todavía no cumple, para que nadie se apoye en ello ante su asesoría.
- Renovación visual completa: logotipo nuevo, iconos coherentes en toda la aplicación, ventanas emergentes con un diseño común, siluetas de carga en vez de ruedas giratorias, barras de desplazamiento propias, y un sistema único de bordes y sombras.
- Toda la redacción de la interfaz reescrita, en español y en inglés.
- Edición y vista previa de plantillas en una sola pantalla, en vez de dos modos separados.
- El asunto del correo se guarda solo mientras se escribe.
- La factura ya no se guarda como archivo: se genera en el momento de descargarla o enviarla, así que siempre refleja los datos actuales. Antes circulaba una copia congelada al crear la factura, y quien generaba un enlace de pago después podía enviarle al cliente una factura sin ese enlace.
- Las divisas se nombran con su sigla ISO —EUR, USD, GBP— en Métricas y en la cabecera, en vez de con el símbolo. En español solo el euro y el dólar tienen símbolo, así que una misma lista mezclaba "€" y "US$" con "GBP" y "CHF".
- La cabecera muestra un único total abreviado en la moneda principal —"201k EUR"— en lugar de una lista de importes por divisa que no cabía en la celda. El importe completo aparece al pasar el ratón, y un beneficio negativo se pinta en rojo.
- Métricas recién instalada ya no recibe con una rejilla de guiones. Cuatro tarjetas con "—" y tres tablas repitiendo "Datos insuficientes" eran la primera impresión de quien acababa de instalar la aplicación.
- El identificador fiscal del cliente deja de llamarse "CIF / NIF" en español: un traductor mexicano veía terminología española encima del RFC de su cliente. Con la etiqueta caen cuatro marcadores con formato de NIF español que salían bajo campos que dicen RFC, SIRET o GST según el país.
- El contador "Presupuestos" explica qué cuenta al pasar el ratón: los ya enviados al cliente. Marcaba 0 con el primer proyecto en estado "Presupuestado", y sin explicarlo parecía una avería justo en el momento más frágil.
- Los ejemplos del formulario de proyecto llevan "Ej." delante, para que no se lean como datos ya introducidos. Los botones de nuevo contacto y nuevo proyecto pierden el "+".
- La tarifa escribe el decimal según el idioma: "0,11 EUR/pal" en español, donde antes ponía "0.11" justo debajo de importes con coma. El presupuesto que recibe el cliente sigue en inglés, con punto.
- La pantalla de "servidor no disponible" deja de pedir una orden de terminal. Enseñaba
cd server && npm starta quien no tiene terminal —el servidor local lo arranca la propia aplicación—, y encima esa carpeta no existe con ese nombre. Ahora dice lo único que el usuario puede hacer de verdad: cerrar Gestrics y volver a abrirlo, que relanza el proceso. - Conectar el correo deja de ser obligatorio para entrar. El paso «Conecta tu correo» del asistente de bienvenida no se podía omitir, no se cierra con Escape ni con un clic fuera y tapa el resto de la aplicación, así que quien no tuviera a mano una contraseña de aplicación se quedaba fuera de lo que acababa de instalar — aunque proyectos, presupuestos y facturas funcionan sin correo. Ahora se puede dejar para luego: mientras siga pendiente, el engranaje de Configuración lleva un punto ámbar que lo explica al pasar el ratón, y cualquier intento de envío lo dice en el idioma de la interfaz en vez de fallar contra el servidor.
- El paso del correo del asistente dice qué cuenta hay conectada, no solo que la hay. Un tick verde sin dirección obliga a fiarse, y es justo la duda que lleva a reescribir una contraseña de aplicación que estaba bien.
- El segundo paso del asistente se llamaba «Datos de facturación» y recogía dos campos de los veintisiete del perfil. Ahora se llama «Nombre y país fiscal» y dice dónde se rellena el resto —identificador fiscal, dirección, IBAN—, en vez de dar por cerrada una facturación que se queda a medias.
- Los Términos de Uso recogen el periodo de prueba. El punto 3 pasa a llamarse "Periodo de prueba, licencia de uso y activación" y describe los catorce días: todas las funciones, sin clave y sin medio de pago, contados en el propio equipo. Antes decía solo que el uso estaba sujeto al pago y a una clave de licencia. Al ser un cambio sustancial, la aplicación vuelve a pedir que se acepten los términos la próxima vez que se abre.
- La dirección de soporte pasa a ser
contact@outreachstudio.app. Sustituye asoporte@, y es la que sale en el perfil del traductor, en la pantalla de servidor no disponible, en la de recuperación tras un error, en la de activación de licencia y en la línea que pide adjuntar el registro de envíos. Sale de una sola constante, así que las cinco cambian a la vez; la web la anuncia igual.
Corregido
Copia de seguridad
- Restaurar una copia perdía once columnas por el camino, sin decir nada. La restauración escribe cada tabla nombrando sus columnas una a una, y las que se habían añadido después nunca se añadieron ahí. Se perdían, entre otras: la identidad del emisor congelada al facturar —con lo que una factura vieja volvía a tomar tus datos de HOY—, el país fiscal con el que se emitió, la fecha de operación, el estado de los recordatorios de cobro —tu cliente recibía otra vez la reclamación entera de una factura que quizá ya había pagado—, el enlace de pago de Stripe, y el marcador de entregable ya enviado. El más silencioso: el periodo de una factura recurrente, que es lo que impide facturar dos veces el mismo mes; sin él, restaurar bastaba para emitir la mensualidad por duplicado. Ahora la copia devuelve exactamente lo que guardó, y hay una comprobación que lo verifica exportando, restaurando y comparando.
Facturas y presupuestos
- Una de cada diez facturas no sumaba su propio total. El IVA y la retención se redondean al céntimo, pero el total se calculaba sobre los decimales completos, así que el bloque de totales podía contradecirse: con una base de 50,03 €, la factura decía 50,03 + 10,51 − 7,50 y un TOTAL de 53,03 en vez de 53,04. Barriendo las bases entre 50 y 10.000 € con los tipos habituales, descuadraban 1.160.062 de 11.940.012 combinaciones. Ahora cada importe se redondea a la unidad mínima de su divisa —el yen no tiene céntimos, el dinar kuwaití tiene tres— y el total es la suma de esas cifras, que es lo que se paga.
- Las líneas del desglose CAT no sumaban su propio total. Cada línea se redondeaba por separado y el total salía de los importes exactos, así que la suma de lo impreso podía separarse un céntimo de la cifra de abajo: con una tarifa de 0,0333 €/palabra, cuatro líneas sumaban 43,92 € y el total decía 43,91 €. En el presupuesto invita a una consulta del cliente; en la factura el descuadre iba contra la base imponible, que es justo lo que esas líneas sirven para determinar. Ahora la diferencia se reparte sobre la línea de mayor importe y el documento cuadra consigo mismo.
- Una factura sin fecha de emisión desaparecía del CSV contable. Se descartaba incluso al exportarlo todo sin acotar fechas, así que una factura emitida podía no llegar nunca a tu asesoría sin que nada lo dijera. Ahora sale en el listado completo, con la fecha en blanco para que se vea que hay algo que corregir; en la exportación de un trimestre sigue sin salir, porque sin fecha no se puede asignar a un periodo.
- Un nombre de cliente en hindi (o cualquier alfabeto índico) salía en cuadraditos. La fuente de respaldo que debía cubrirlos estaba buscada con un nombre de archivo que no existe en Windows, así que nunca se usaba. Ya se imprime bien, y el aviso interno que denunciaba los caracteres perdidos —que sí funcionaba— deja de saltar.
- Aviso nuevo al emitir a un cliente con datos en árabe o hebreo. El PDF imprime esas letras del revés y sin unir, porque no compone texto de derecha a izquierda. Como el nombre del destinatario es obligatorio en la factura, ahora el diálogo lo advierte antes de emitir en vez de dejarte descubrirlo en el documento ya enviado.
- Un país escrito sin tildes dejaba la factura sin su mención obligatoria. El desplegable de la ficha guarda nombres canónicos, pero al importar contactos desde una hoja de cálculo se guarda lo que traiga el archivo: «Espana», «Belgica», «Paises Bajos», «Deutschland», «Holanda», «USA»… Ninguno se reconocía, y un país que no se reconoce hacía que la aplicación no imprimiera la mención de inversión del sujeto pasivo en una factura intracomunitaria. Ahora los acentos, los puntos y los endónimos más corrientes se resuelven igual. Y cuando el país sigue sin reconocerse, el diálogo de emisión avisa antes de emitir en vez de callar.
- Editar una factura ya cobrada le borraba la fecha de cobro. Bastaba con abrir la factura y volver a guardar, aunque no cambiaras nada: el diálogo no envía la fecha de cobro, y el servidor la ponía a vacío igualmente. A partir de ahí, el CSV para tu asesoría declaraba esa factura como pendiente y con la columna de fecha de cobro vacía, desaparecía de «Cobrado» y del tiempo medio de cobro en Métricas, y la ficha volvía a ofrecerte generar un enlace de pago para algo que tu cliente ya había pagado.
- El vencimiento por defecto contaba desde hoy, no desde la fecha de la factura. Una factura con fecha anterior salía diciendo «30 días» y venciendo a 47. Además, la suma se hacía en horas: el día en que acaba el horario de verano dura 25, así que el plazo caía en la víspera. Ahora son 30 días desde la fecha de la factura, contados en días.
- Las fechas se corrían un día si no trabajas en el huso de Madrid. Una fecha guardada como
2026-08-20se interpretaba como medianoche UTC, así que en México, Estados Unidos, Brasil, Chile, Colombia, Perú, Argentina o Canadá se veía y se imprimía como el 19. Afectaba a todo a la vez: la fecha de expedición y el vencimiento de la factura, la validez del presupuesto, la fecha de operación, y cada fecha de la interfaz. Al escribir fallaba en el sentido contrario —se usaba el día UTC—, de modo que facturar por la tarde en México emitía con la fecha del día siguiente, y esa fecha queda congelada en el libro de facturas. Los avisos también iban corridos: una factura aparecía como vencida el mismo día de su vencimiento, y el recordatorio de cobro le llegaba al cliente un día antes de tocar.
- Se podía emitir una factura sin tus propios datos fiscales. Hasta ahora el identificador fiscal y el domicilio eran campos opcionales de Configuración, así que una instalación recién estrenada podía generar una factura cuyo emisor era solo un nombre. Una factura así no es válida en ningún país. Ahora la aplicación se niega a emitirla y dice exactamente qué campos faltan y dónde rellenarlos; la factura rechazada no consume número ni deja rastro. Los datos del cliente no se bloquean —su identificador fiscal no siempre es obligatorio, y exigirlo impediría facturar a un particular—, pero el diálogo de emisión avisa si faltan y explica cuándo importan.
- Corregir una factura ya emitida dejaba circulando dos documentos con el mismo número. Al cambiar el IVA o la retención de una factura enviada, la aplicación pedía un motivo y anotaba la rectificación en su libro interno, pero el PDF seguía saliendo con el número y la fecha originales y los importes nuevos: el cliente acababa con dos papeles distintos que decían ser la factura 2026-001. El código QR, que sí leía el asiento correcto, además contradecía a la cabecera impresa justo encima. Ahora el documento se emite como lo que es — «RECTIFICATIVE INVOICE #R-2026-001», con su propia fecha, la factura que corrige, el motivo y el importe rectificado — y el QR concuerda con la cabecera. La ficha del proyecto y el archivo adjunto al correo usan también ese número.
- La factura decía dos cosas distintas sobre cuándo hay que pagarla, y ninguna era la tuya. Arriba a la derecha ponía «Payment due: 30 days end of month» y a media página «Payment due upon receipt»: las dos frases estaban escritas a fuego y se contradecían, mientras que la fecha de vencimiento que tú habías elegido al emitir no se imprimía en ninguna parte. Ahora la factura muestra esa fecha real, junto a la de emisión. Si la dejas en blanco no se imprime nada, en vez de inventar un plazo.
- Las «Notas en factura» no salían en la factura. El diálogo de emisión pide ese texto con esa misma etiqueta y sugiere usarlo para el número de cuenta o las condiciones de pago; luego se guardaba y no aparecía nunca en el documento. Ahora se imprime bajo las condiciones de pago, con su propia página si hace falta y sin recortarlo — es el sitio donde se escribe una mención legal, como la inversión del sujeto pasivo de una factura intracomunitaria.
- Cambiar tus datos reescribía las facturas ya enviadas. El nombre, el identificador fiscal, la dirección y los datos bancarios del emisor se leían de Configuración cada vez que se descargaba un PDF, no de lo que había al emitir. Mudarte, corregir una errata o pasar de autónomo a sociedad cambiaba quién figuraba como emisor en todas las facturas anteriores, incluidas las que el cliente ya tenía. Ahora esa identidad queda congelada en la factura, y el QR también deja de atribuir una factura antigua a un identificador nuevo. Las facturas emitidas antes de este cambio siguen comportándose como hasta ahora, porque no tienen nada congelado que mostrar.
- El nombre de un cliente extranjero se destruía en el PDF. Los dos documentos se generaban con las fuentes estándar del formato PDF, que solo cubren el alfabeto latino occidental. Cualquier otro carácter salía como basura, sin ningún aviso: una agencia polaca llamada «Biuro Tłumaczeń Sp. z o.o.» aparecía impresa como «Biuro T'VÖ7eB7.». Lo mismo con el checo, el turco, el rumano, el griego, el cirílico, el japonés, el chino y el coreano — y el nombre del destinatario es un dato obligatorio de la factura. Solo se libraban los acentos españoles y el símbolo del euro, por lo que facturando dentro de España no se veía nunca. Ahora los dos documentos incrustan una fuente completa, con respaldo automático para los alfabetos que esa fuente no cubra, y lo que ninguna fuente instalada sepa representar queda anotado en el registro de la aplicación en vez de desaparecer sin más.
Alta
- Cambiar de proveedor de correo en el asistente dejaba en pantalla el error del proveedor anterior: elegir «Personalizado» después de fallar con Gmail seguía enseñando el aviso sobre la contraseña de aplicación de Gmail, debajo de un formulario que ya pedía otra cosa.
- Con un proveedor de correo «Personalizado», la casilla «Usar SSL/TLS» venía marcada mientras el puerto sugerido era el 587 — justo la combinación que no funciona, porque 465 es TLS desde el primer byte y 587 es STARTTLS. Quien escribiera su servidor y dejara el puerto sugerido fallaba en el primer intento sin haberse equivocado en nada. Ahora la casilla arranca desmarcada, a juego con el 587, y sigue al puerto en los dos valores donde la respuesta no admite discusión; en cualquier otro (2525, 25, uno propio del proveedor) se respeta lo que se haya marcado a mano. Vale para los dos formularios, el del asistente y el de Configuración.
- Conectar el correo desde el asistente de bienvenida dejaba la pantalla de Configuración como si no hubiera ninguna cuenta —proveedor «Gmail» y los campos vacíos— con el correo ya funcionando. El asistente solo guardaba donde lee el servidor para enviar, y esa pantalla se pinta de otro sitio que nadie actualizaba; por lo mismo, volver a abrir el asistente pedía otra vez la contraseña de una cuenta que ya estaba conectada. La contraseña sigue sin guardarse ahí.
Facturación y fiscalidad
- Un plan recurrente podía saltarse su primer mes, y nadie lo reclamaba. La fecha de alta del plan se guarda en horario universal, pero se leía como si fuera la hora local del traductor. Para quien trabaja al oeste de Greenwich, un plan creado a primera hora del día 1 quedaba registrado como del mes siguiente: esa mensualidad no salía nunca en los periodos pendientes, el plan se daba por al día y el retainer se quedaba sin facturar sin ningún aviso. En España el fallo no se veía, porque allí las dos lecturas coinciden.
- El aviso de facturación electrónica cambiaba de texto un día antes o después de tiempo. La fecha en que empieza a obligar el mandato de cada país se comparaba contra el día universal en vez de contra el del calendario local, así que el aviso podía adelantarse o retrasarse una jornada según el huso.
- La retención aparece con el nombre que tiene en el país del emisor —ISR en México, IRPF en España— en el formulario, en la ficha y en el PDF. Antes decía "IRPF" siempre, de modo que una factura canadiense mostraba un impuesto español, y una mexicana llegaba a mostrar cuatro nombres distintos para el mismo impuesto.
- Se rechazan tipos negativos de IVA y de retención al crear y al rectificar.
- Una rectificación que solo redistribuye IVA y retención sin cambiar el total ya se registra como tal.
- No se puede borrar un proyecto ya facturado.
- El estado manual del proyecto ya no permite marcarlo como facturado sin que exista factura.
- Los importes del desglose CAT respetan los decimales de cada divisa.
- Un mes de facturación recurrente saltado se perdía para siempre: si la aplicación no se abría durante un mes, al volver solo se generaba el corriente y el plan quedaba marcado como al día, sin aviso ni forma de recuperar el mes perdido desde ninguna pantalla.
- Restaurar una copia de seguridad podía emitir dos veces la factura del mismo mes, cada una con su número y su asiento en el libro.
- La etiqueta del campo de nota fiscal del perfil decía «Nota de IVA / TVA» a fuego: dos nombres de impuesto de dos países concretos en el mismo renglón, mirara quien mirara. Ahora sale del perfil fiscal como el resto de la aplicación — «Nota de GST» con perfil de India, y el genérico traducido cuando el país no tiene término propio.
- El marcador de posición del IBAN proponía un número con forma española (
ES00 0000…) tuviera el perfil fiscal que tuviera. Ahora es neutro (XX00 0000…): conserva la pista de cómo se agrupa un IBAN sin dar por hecho el país, y hace juego con el del BIC de al lado. - La exportación contable a CSV escribía a fuego y en español las cabeceras de los dos impuestos («% IVA», «% IRPF»), sin mirar el perfil fiscal: un traductor con perfil de México recibía una columna «IRPF» de lo que en su país es el ISR, contradiciendo al PDF de esa misma factura. Con la interfaz en inglés salían igualmente en español la cabecera entera, el estado de cada fila y el nombre del archivo.
- El «Historial de rectificaciones» de una factura llamaba a la retención por su nombre genérico en vez de por el que tiene en el país del traductor: con perfil fiscal de México ponía «IRPF» donde el resto de la aplicación ya decía «ISR». El IVA de esa misma línea sí salía bien.
- El aviso de un porcentaje de impuesto negativo nombraba el IVA y el IRPF, dos impuestos españoles, sin mirar el país del traductor: uno mexicano leía que el problema estaba en su IRPF, que no existe allí —su retención es el ISR—, y uno indio, que solo tiene GST, lo mismo. Ahora habla de «los porcentajes de impuestos», sin nombrar ninguno.
- La retención salía llamada «IRPF» en la factura de casi todo el mundo. Solo España y México tenían nombre propio para ella, así que un traductor colombiano, argentino o chileno —o cualquiera de los demás países— veía el nombre del impuesto español ahí donde debía ir el suyo. Ahora, cuando el país no tiene un nombre concreto, pone «Retención» a secas. El IVA no cambia: ese sí se llama igual en toda Hispanoamérica.
- El motivo de una rectificativa pedía el cambio «al modificar IVA/IRPF» y proponía de ejemplo «IVA aplicado incorrectamente», dos renglones por debajo de unas casillas que sí llamaban a cada impuesto por su nombre. Ahora también esas dos frases usan el del país.
Datos y copias de seguridad
- Restaurar una copia de seguridad conservaba el contacto pero perdía todo su historial. Ya no.
- Restaurar tampoco pierde ya las fechas de creación y modificación.
- Avanzar de estado borraba todos los entregables, incluidos los que aún no se habían enviado a nadie. Ahora solo se borran los que ya llegaron al cliente.
Métricas
- La cabecera se derramaba al haber varias divisas: el importe se salía de su celda y pisaba la etiqueta de al lado.
- La tarjeta "Beneficio neto" se estiraba a todo el ancho al bajar de fila, y dejaba de parecer una tarjeta más.
- La tabla de tarifa media enseñaba filas que parecían repetidas —dos "Técnico", dos "EN-ES"—. No lo eran: se agrupa por etiqueta, divisa y unidad, porque promediar 0,15 € con 0,18 $ no significaría nada. Ahora cada fila dice qué la distingue de sus hermanas.
Prospección
- Los espacios sobrantes solo se limpiaban del correo. Un nombre o una empresa pegados desde LinkedIn o desde una hoja de cálculo se guardaban con los espacios de delante y de detrás, y de ahí salían a dos sitios que ve el cliente: la primera línea del email en frío («Hi␣␣␣␣Marie Dupont␣␣␣,») y el bloque de cliente de la factura. Ahora se limpian todos los campos, y lo que queda en blanco se guarda vacío de verdad.
- Cambiar el correo de un contacto borraba su historial sin preguntar. Corregir una errata del dominio se llevaba por delante los envíos registrados, las fechas de contacto y el contador de seguimientos, y devolvía el contacto a «Pendiente»; el aviso aparecía después, ya hecho. Ahora se pregunta antes, diciendo cuántos envíos se van a perder, y solo cuando hay algo que perder. Cancelar no guarda nada y deja el formulario como estaba.
- Un nombre de solo espacios pasaba el formulario y volvía del servidor como «error al guardar el contacto», como si hubiera fallado la aplicación en vez de faltar un dato.
- Guardar un contacto podía dejarlo sin nombre o con un correo imposible. La comprobación existía al crearlo pero no al editarlo, y editar un contacto ya borrado decía que se había guardado.
- El límite diario de envíos se guardaba y se mostraba, pero no se aplicaba.
- Cancelar un envío por lotes durante una espera de reintento tardaba hasta un minuto en surtir efecto. Ahora responde casi al instante.
- La estimación de duración de un envío por lotes se pasaba de largo, especialmente en tandas pequeñas.
- Los contactos cuyo último envío falló aparecían como "Pendiente", sin forma de distinguirlos de los que nunca se habían contactado.
- La búsqueda de contactos ignora los acentos: "jose" encuentra "José".
- El límite de 5 MB por adjunto se anunciaba pero no se comprobaba; el fallo aparecía al enviar, como un error de correo confuso.
- Los correos con espacios sobrantes al principio o al final se limpian al guardar.
- Borrar un contacto podía quedar bloqueado sin salida por términos de glosario o planes recurrentes que no había forma de gestionar desde ninguna pantalla.
- El aviso que recorta un envío en lote al llegar al límite diario dejaba un
{{remaining}}literal a la vista en su segunda frase («Se enviará a {{remaining}} de 8 contactos»), en español y en inglés: el hueco aparece dos veces en la cadena y solo se rellenaba la primera. - Pulsar Enter al final de una plantilla no hacía nada, y lo siguiente que escribías aparecía pegado a la firma. Añadir una posdata o un enlace debajo de «Un saludo, [Tu nombre]» era imposible: la línea nueva no llegaba a dibujarse, así que el cursor volvía a la anterior. Además dejaba un salto de línea invisible al final del texto guardado, que se iba con el correo.
- El Asunto no avisaba de las llaves que no son variables reales. Escribir algo como
{{tarifa}}ahí no daba ningún aviso —el cuerpo de la plantilla sí lo daba— y aun así paraba el envío al pulsar enviar, marcando el contacto en rojo. El aviso sale ahora junto al campo que lo provoca, sea el asunto o el cuerpo. - Un envío en lote con una de esas llaves marcaba en error a todos los contactos de la tanda, uno por uno, por un problema que es de la plantilla y no de ninguno de ellos. Ahora se avisa antes de empezar y los contactos se quedan como estaban, igual que ya pasaba al faltar el asunto, la cuenta de correo o el contenido de un adjunto.
- Un contacto sin empresa se marcaba en error si la plantilla usaba esa etiqueta, con un aviso que mandaba a revisar la plantilla — cuando la plantilla estaba bien y lo que faltaba era un dato suyo. La empresa es opcional, pero era el único de los cuatro campos del contacto que se trataba como obligatorio al enviar. Y como los contactos en error vuelven a entrar en la tanda siguiente, volvía a fallar cada vez. Ahora sale en blanco, como ya hacían especialidad e idiomas, y antes de empezar un lote se dice a cuántos contactos les falta algún dato que la plantilla usa, para poder cancelar y rellenarlo. Lo mismo pasaba en los correos de Proyectos —recordatorio de cobro, presupuesto y entrega—, que además ahora aceptan las cinco etiquetas de contacto y no solo dos.
- Deshacer después de insertar una etiqueta borraba otra cosa. La etiqueta se metía por una vía que el navegador no apunta en su historial, así que Ctrl+Z se la saltaba y deshacía la edición anterior: desaparecía una palabra de otra línea y la etiqueta se quedaba donde estaba. Igual al pegar.
- Insertar una etiqueta entre dos palabras dejaba dos espacios.
- Una etiqueta escrita a mano seguía viéndose como
{{nombre}}. Ahora, al salir del editor, se convierte en etiqueta como las demás. - Arrastrar texto con formato al editor colaba su HTML. Pegar ya lo limpiaba; soltar, no.
- El Asunto enseña debajo lo que va a salir, con las mismas etiquetas y los datos del contacto elegido. Antes solo se veían las llaves en crudo.
- Vaciar una plantilla y guardarla hacía reaparecer la de fábrica, sin decir nada, y era la de fábrica la que se enviaba. Ahora se avisa de que no puede quedarse vacía.
Envío de correo
- Una contraseña ya guardada se veía igual que un campo que nunca tuvo nada. El servidor no devuelve nunca la contraseña de la cuenta de correo, ni siquiera cifrada, así que el campo de Configuración aparecía vacío tanto si había una cuenta conectada como si no. Quien volvía meses después no tenía forma de saber si su correo seguía configurado. Ahora, cuando la hay, junto a la etiqueta aparece un punto verde con «Ya hay una guardada», y el propio campo dice «Déjalo en blanco para no cambiarla».
- Un mismo correo podía llegarle al cliente tres veces. Si la conexión se cortaba justo después de entregar el mensaje —el servidor ya lo tenía en cola y lo único que se perdió fue la confirmación—, la aplicación lo daba por fallido y volvía a mandarlo hasta tres veces, para acabar avisando de un error. En prospección eso es el mismo correo en frío repetido a un cliente potencial. Ahora solo se reintenta lo que se sabe ocurrido antes de la entrega, como un rechazo temporal del destinatario; el resto se avisa sin repetir el envío.
- Cualquier negativa del servidor de correo se anunciaba como «verifica tu contraseña de aplicación». Una dirección que no existe, un mensaje demasiado grande o uno bloqueado por el filtro antispam mandaban a reescribir una contraseña que estaba perfecta, sin ninguna salida: la comprobación de Configuración seguía diciendo que era correcta. Cada caso dice ahora lo que pasó de verdad.
- Un servidor que se quedaba a medias podía dejar la aplicación en «Enviando…» hasta media hora —diez minutos por intento, y lo intentaba tres veces— sin nada que pulsar y sin saber si el correo había salido. Ahora cada fase de la conexión tiene su propio límite de espera.
- El asunto podía salir con las variables sin resolver. Si llevaba «{{idiomas}}» o «{{especialidad}}» —la plantilla del cuerpo admite las dos, y el aviso de variables sin resolver las daba por buenas—, el cliente recibía las llaves literales en la línea de asunto de un correo en frío. El historial del contacto guardaba además el asunto bien resuelto, así que ni ahí se veía.
- Un adjunto vacío se enviaba como si nada. Un archivo de 0 bytes —un export que falló a medias, o uno que la nube todavía no había bajado del todo— se aceptaba, aparecía listado como adjunto y el envío lo descartaba sin decir nada: el cliente recibía el correo sin el archivo y la aplicación informaba de éxito. Ahora no se puede añadir, y si alguno llega vacío por otro camino el envío se detiene y dice cuál es.
- Guardar la configuración de correo cuando el archivo no se podía escribir en disco —sin espacio libre, sin permisos o con un antivirus bloqueándolo— apagaba en silencio el servidor interno de la aplicación: la ventana seguía abierta y todo lo demás dejaba de responder sin un solo aviso. Ahora lo explica y la aplicación sigue en pie.
- Un formato que no se puede mandar se avisa al elegir el archivo, no al enviar. Un .exe o un .docm se aceptaba como adjunto —el filtro del diálogo de archivos es solo una sugerencia y basta con elegir «Todos los archivos»—, se quedaba en la lista como uno más y el rechazo llegaba al pulsar Enviar; en un lote, una vez por cada contacto. Ahora se comprueba al elegirlo y también al guardarlo, con el mismo criterio que ya usaban los entregables.
- Los avisos del envío que estaban escritos a fuego en español ahora salen en el idioma de la interfaz: la dirección de destinatario mal escrita, el adjunto demasiado grande, el formato no admitido, más de cinco archivos y el límite de envíos seguidos. Hasta ahora solo se traducían los errores de conexión con el proveedor de correo.
- Cambiar la cuenta de correo sin escribir la contraseña decía «Configuración guardada» y no cambiaba nada: la pantalla pasaba a mostrar la dirección nueva mientras los correos seguían saliendo de la anterior. Como la contraseña nunca se prerrellena, bastaba con reabrir Configuración y tocar el correo. Ahora avisa de que hace falta la contraseña para verificar la cuenta y deja el diálogo abierto con todo lo escrito, en vez de dar por guardado lo que no lo estaba.
Otros
- El periodo de prueba se ancla también en los datos ya guardados. Antes dependía únicamente de su propio archivo de registro, de modo que una instalación con contactos, proyectos y facturas de semanas atrás podía volver a presentarse como recién estrenada. Ahora, si ese registro falta, el inicio se reconstruye a partir del dato más antiguo que haya en la base. No se guarda nada nuevo: solo se leen fechas que ya estaban.
- El desplegable de moneda principal salía entero en blanco. Las 159 divisas estaban ahí, pero cada opción se pintaba sin texto y sin valor: el campo leía dos propiedades que la lista no tiene. Además, sin divisa guardada el navegador enseñaba la primera de la lista —el dírham de los Emiratos— como si estuviera elegida; ahora la lista abre con una opción que dice lo que la aplicación hace mientras no elijas: resumir por la divisa en la que más factures.
- «Cancelar» en Configuración no revertía tres campos. La contraseña de aplicación, la clave de Stripe y la clave de licencia se escriben fuera del borrador de ajustes —son texto para activar o verificar algo, no un ajuste que se guarde—, así que cerrar con Cancelar las dejaba escritas y seguían ahí al volver a abrir, como si no se hubiera cancelado nada. Ahora el modal las limpia al abrirse.
- Los indicadores de respuesta se quedaban en 0 tras la retirada de la detección automática de respuestas.
- Los formatos de archivo admitidos como adjunto son los mismos en todos los puntos de la aplicación, e incluyen los propios de la traducción.
- Los ejemplos de los formularios ya no muestran direcciones ni números que parecieran datos reales ya introducidos.
- Con Windows en modo oscuro, el armazón de la aplicación aparecía flanqueado por dos bandas casi negras. Sobrevivía un bloque de modo oscuro heredado de la plantilla del andamiaje que redefinía el fondo, el texto y el borde de una interfaz que usa una paleta clara a propósito.
- Las plantillas de correo ya no llevan la identidad del traductor de la instalación original en ninguna parte de la aplicación instalada. Quedaba una migración con su nombre, su titulación y sus perfiles profesionales escritos en claro, dentro de un archivo que se instala sin comprimir.
- Una caída del servidor interno ya deja constancia en
send.log. Es un camino distinto del de la pantalla de error, que registraba y sigue registrando lo suyo: aquí se trata del proceso que guarda los datos. Que se hubiera muerto no quedaba anotado en ningún sitio, y el motivo dependía de una carrera: el registro se escribe por un flujo que el cierre del proceso no espera, así que ese último renglón —el que explica la caída— llegaba o no sin que nada lo garantizara, y con el archivo aún sin estrenar no llegaba nunca. Ahora se escribe directamente antes de salir, y la aplicación anota además que el servidor interno ha terminado, cosa que hasta ahora solo iba a una consola que la versión instalada no tiene. - Un fallo inesperado del servidor ya no se lleva por delante lo último que hayas hecho. La base de datos se guarda en diferido —los cambios se acumulan en memoria y bajan a disco un segundo después—, y cerrar la aplicación por las buenas fuerza ese guardado antes de salir. Estrellarse, en cambio, no lo hacía: había dos manejadores de excepciones no controladas y el primero mataba el proceso antes de que el segundo, el único que guardaba, llegara a ejecutarse. Cualquier excepción no capturada, o cualquier promesa rechazada sin capturar, tiraba lo que estuviera pendiente: el contacto recién editado, las horas recién anotadas. Ahora los cuatro caminos de salida guardan.
- Los cierres inesperados de la interfaz no dejaban rastro en
send.log. Había dos redes de seguridad anidadas, y la interior —que era la que atrapaba todos los fallos, por estar más cerca— solo escribía en la consola del navegador: el archivo que la propia pantalla de error pide adjuntar llegaba sin una línea sobre ese fallo. Queda solo la red exterior, que sí registra la traza. - Esa pantalla de error aparece ya en el idioma activo. Llevaba todo su texto en español y en inglés a la vez, uno debajo del otro, y era la única de la aplicación que no pasaba por el sistema de traducción. Además, mientras no se hubiera elegido idioma caía siempre en español, aunque el sistema estuviera en inglés.
- Todos los avisos que la aplicación te da cuando algo no se puede hacer salen ya en el idioma de la interfaz. Antes buena parte de ellos llegaba en español aunque la tuvieras en inglés, porque el texto se escribía en el interior del programa y se enseñaba tal cual. Son unos cincuenta: contactos, encargos, facturas, planes recurrentes, horas, gastos, glosario, entregables, Stripe, licencia y tipos de cambio. De paso varios dicen mejor lo que pasa — que ese correo ya lo tiene otro contacto, cuántos encargos hay que quitar antes de poder eliminarlo, o que un encargo ya facturado tiene el importe congelado en su factura.
Seguridad
Primera revisión de seguridad de la aplicación, centrada en lo que de verdad puede pasarle a un traductor: un archivo malo que abre él mismo, y una web abierta en el navegador mientras Gestrics está en marcha.
- Restaurar una copia de seguridad incompleta ya no borra las facturas emitidas. Restaurar una copia hecha con una versión anterior —de las que no guardaban el libro de facturas— vaciaba ese libro y decía que todo había ido bien. Y como la numeración se calcula a partir de él, la siguiente factura volvía a llamarse 2026-001: un número que ya se le había enviado a otro cliente. Ahora la aplicación se detiene antes de tocar nada, dice cuántas facturas emitidas se perderían y con qué números, y solo sigue si lo confirmas expresamente.
- Una copia con el libro de facturas manipulado no se guarda. Los asientos van encadenados por hash, precisamente para que alterar uno se note; pero al restaurar se guardaban tal cual, sin comprobarlos. Un archivo de copia editado a mano podía escribir facturas inventadas con el importe que se quisiera. Ahora la cadena se verifica entera antes de restaurar nada, y un asiento que no cuadre no llega al disco bajo ningún concepto. Si el libro de la copia está dañado, la aplicación te lo dice y te ofrece recuperar todo lo demás —contactos, encargos, facturas— dejando el libro vacío, en vez de dejarte sin poder restaurar nada.
- Una restauración que falla a medias ya no deja los datos a medias. Antes se vaciaban las tablas y luego se iba fila por fila, saltando las que fallaban: el resultado era "restaurado" con un recuento de errores al lado, y una base de datos incompleta. Ahora la restauración es una sola operación — entra entera o no entra nada— y si algo falla te dice qué fila fue, con tus datos intactos.
- El servidor local solo atiende a quien pregunta por 127.0.0.1. Gestrics levanta un servidor en tu equipo para que la propia aplicación hable con él. Aunque solo escuchaba en local, una web abierta en el navegador podía alcanzarlo haciendo que su dominio apuntara a tu propio equipo, y leer desde ahí tus contactos, tus facturas y tus claves guardadas. Ahora se comprueba con qué nombre se ha llamado y se rechaza cualquiera que no sea el tuyo.
- La fecha de la última validación de la licencia se guarda cifrada. De ella cuelga el margen de 7 días que la aplicación concede sin conexión, y estaba en claro dentro de
license-config.json: una fecha en un JSON invitando a cambiarla con el Bloc de notas. Ahora va cifrada como el resto, y una fecha escrita a mano se descarta en vez de aceptarse. Es el mismo criterio que ya se seguía con el registro del periodo de prueba; este archivo se había quedado fuera. Si el primer arranque tras actualizar ocurre sin conexión, hará falta una comprobación con red para volver a tener margen sin ella. - Un contacto importado ya no puede colar una fórmula en tus exportaciones. Excel y LibreOffice ejecutan una celda que empiece por
=,+,-o@. Si importabas una lista de contactos de una agencia y alguno de sus campos venía con una fórmula dentro, se guardaba tal cual: al exportar tus contactos y abrir el archivo, la fórmula se ejecutaba en tu equipo. Ahora esas celdas salen marcadas como texto en los CSV y TSV. Los importes no se tocan, así que el CSV para tu asesor sigue sumando igual, y volver a importar en Gestrics una exportación propia devuelve el texto original. - A los 14 días la aplicación se cierra de verdad. El fin de la prueba lo hacía cumplir solo la pantalla: por detrás el servidor local seguía respondiendo a todo, así que seguía habiendo por dónde seguir usando la aplicación sin licencia. Ahora se cierra también por dentro, y lo único que queda abierto es lo necesario para activar. Tus datos no se tocan: siguen ahí enteros, y vuelven en cuanto introduces la clave.
- Estrenar carpeta de datos ya no regala otra prueba. El inicio de la prueba se apoya en la marca más antigua de tu propio trabajo, pero eso solo se miraba cuando faltaba el registro: bastaba con empezar de cero y traerse los datos DESPUÉS para tener catorce días nuevos sin perder nada. Ahora se mira siempre y manda la fecha más antigua de las dos. De paso arregla el caso honrado: restaurar una copia en un portátil nuevo continúa la misma prueba en vez de estrenar otra.
1.0.0 — 2026-08-09
Primera versión pública. CRM de escritorio para traductores autónomos, con los datos guardados en el propio equipo.
Añadido
- Prospección: contactos, plantillas de correo, envío por lotes con límites de frecuencia, seguimiento del estado de cada contacto e historial.
- Proyectos: encargos con recuento de palabras, tarifas, importación de análisis CAT, control de horas, entregables y glosario por cliente.
- Facturación: facturas con IVA y retención, PDF propio, libro de asientos encadenado conforme a Veri*Factu, rectificativas, perfiles fiscales por país y enlaces de pago con Stripe.
- Métricas: ingresos, gastos, tasas de respuesta y desglose por cliente.
- Copias de seguridad completas, exportación e importación de contactos en CSV, TSV, Excel y ODS.
- Envío por SMTP con detección automática de proveedor.
- Español e inglés.