ARMANOS

Import

Import accounts from a spreadsheet

Your accounts already live in a spreadsheet. ARMANOS reads that file, shows you what each column became, and only then creates the profiles.
13
Columns understood
.csv .txt .tsv
File shapes
200
Profiles per batch
100
Saved templates

Your accounts already live in a spreadsheet

Onboarding fifty accounts one at a time is the most tedious thing this app can ask of you. The list already exists somewhere: an export from a supplier, or a sheet your team keeps.

Press From a spreadsheet above the profile list. The file picker takes .csv, .txt and .tsv, which is what Excel, Google Sheets and most supplier exports produce.

The file is read by a real CSV parser, not a split on commas. That matters because a reader one column off does not fail loudly. It creates profiles that look correct and carry someone else's proxy, and undoing that is worse than doing the work by hand.

What arrives in the fileWhat the reader does with it
A byte order mark from ExcelStripped, so the first header still matches instead of turning into an unknown column.
Semicolons or tabs instead of commasThe delimiter is counted on the header line outside quotes, so comma, semicolon and tab are all recognised.
A quoted field with commas or line breaksKept whole. A name like "Ivanov, Ivan" stays one cell and does not shift the rest of the row.
A doubled quote inside a fieldRead as one literal quote, the way RFC 4180 defines it.
Windows line endings, a trailing blank lineHandled. A row that is empty in every cell is dropped instead of becoming a blank profile.
The ARMANOS profile list with the From a spreadsheet and Create a batch buttons above the cards.
Both ways in sit above the profile list: From a spreadsheet reads your file, Create a batch builds from a saved template.

Columns are matched by meaning, not by exact name

Your column names are yours, not ours. Each header cell is normalised before it is compared: case is dropped, spaces, underscores, dashes and dots are removed, and quotes and brackets go too. Profile Name, profile_name and PROFILE NAME are one and the same thing.

Each field then has a generous list of aliases, and they are not only English. The app itself speaks 22 languages, and column names are matched in many of them: Russian, Ukrainian, Spanish, French, German, Polish, Turkish, Japanese, Chinese, Korean and more. Every alias is one customer who does not have to rename a column before importing.

Two rules keep the matching honest. When a file has two columns that mean the same field, the first one wins, because the later one is usually the emptier one. And a column that matches nothing is never guessed at: it is listed by name in the preview and left out of the import.

FieldHeaders that match itWhat it becomes
NameName, Profile name, Account, Title, Имя, Название, NombreThe profile name. The only required cell.
GroupGroup, Folder, Category, Team, Группа, Папка, GrupoA real group, created if it does not exist yet.
ProxyProxy, Proxy URL, Proxy address, Прокси, 代理One cell in the seller's own notation.
Proxy typeProxy type, Protocol, Тип, Протоколhttp, https, socks5 or ssh.
Proxy hostProxy host, Host, IP, Хост, СерверThe address the profile goes out through.
Proxy portProxy port, Port, ПортA port between 1 and 65535.
Proxy userProxy login, Proxy username, Логин проксиOnly headers that say proxy.
Proxy passwordProxy password, Proxy pwd, Пароль проксиOnly headers that say proxy.
TemplateTemplate, Fingerprint, OS, Platform, Шаблон, СистемаOne of the five fingerprint templates.
ScenarioScenario, Use case, Purpose, СценарийThe profile's scenario. Rows without one get privacy.
TagsTags, Labels, Теги, МеткиSplit on commas and semicolons inside the cell.
NotesNotes, Comment, Description, Заметки, ОписаниеCarried across as written.
2FA2FA, TOTP, OTP secret, Authenticator, Ключ 2FAThe one-time code key for that account.

A column called Password belongs to the account, not the proxy

An accounts spreadsheet almost always has a Login column and a Password column next to each other. They belong to the account, not to the proxy, and the importer treats them that way.

This was once wrong, and the damage was quiet. A perfectly ordinary table with Name, Login, Password, IP, Port, Proxy login and Proxy password mapped the account credentials into the proxy settings. The account password was then written into the shared proxy library and sent to the proxy provider on every launch of that profile. The real proxy password was gone, so the proxy answered 407 and the profile did not work.

Only headers that say proxy match the proxy credential fields now. A bare Login or Password column stays unmatched, is named in the preview as a column left out, and is not imported anywhere.

The symptom was not the problem

The person would report a proxy answering 407. The real event was their account password leaving for a proxy provider. That is why the credential aliases are deliberately narrow: a column silently mapped to the wrong field is worse than an import that refuses to guess.

What one row becomes

Each row is turned into a profile draft, field by field, and the draft is what you approve in the next step.

The proxy can arrive in one column, in whatever notation your seller sent it in. host:port, host:port:user:pass, user:pass@host:port and socks5://user:pass@host:port are all read, and a label after a pipe or a rotation link after a hash is picked out of the same line. Invisible characters that travel with a pasted address, like a non-breaking space, are removed before parsing.

Or the proxy can arrive as separate columns, which is what an exported template looks like. There the type is not guessed. An empty type cell means the seller did not say, and http is the reasonable reading of that. A named type the app does not support is reported instead of being downgraded, because a silent downgrade means you think you are on socks5 while you are going out in the clear.

  1. 1

    Name

    Taken as it is. An empty cell marks the row as a problem instead of creating an unnamed profile.

  2. 2

    Proxy

    Read from the single proxy column, or from the type, host, port, user and password columns.

  3. 3

    Template

    The word in the cell resolves to one of macos-chrome, windows-chrome, linux-chrome, android-chrome or android-tablet. Windows, ubuntu, phone and tablet all land where you expect. A word that matches nothing falls back to macos-chrome.

  4. 4

    Group, tags, notes

    The group is held as a name for now. Tags are split on commas and semicolons inside the cell. Notes come across as written.

  5. 5

    One-time code key

    A bare base32 secret or a whole otpauth:// link. The link carries its own digits, period and algorithm.

  6. 6

    Scenario

    Taken from the cell when there is one. Rows without it get the privacy scenario.

Nothing is created until you have seen the mapping

The import runs in two steps on purpose. The file is read and matched first, and what the app understood is shown before a single profile exists.

The preview names both sides: your header on the left, our field on the right. You check our reading against your own file instead of trusting it. Columns that matched nothing are listed by name.

Under that sits a sample of the first five rows as values, not as claims about column names: the line number, the name, the group and the proxy address that will actually be used. A mapping that is one column off shows up here, in the values.

Cancel drops the parsed file inside the app's main process. A later press of Create profiles cannot act on a file you thought you had dismissed.

File
accounts.csv, rows found: 120
Mapping
Аккаунт > Name · Логин прокси > Proxy user · Тип > Proxy type
Columns left out
Purchase date, Manager
Sample row
line 2 · Amazon Seller DE · Marketplaces · socks5://198.51.100.10:8000
Rows with problems
3. Lines: 14, 27, 88

Line numbers are the ones in your spreadsheet: the header is line 1, so the first account is line 2.

A row that cannot be read is named by its line number

A row with a problem is still built and still shown. Hiding it would mean an import that silently drops rows, and you would find out weeks later that account 47 never arrived.

The checkbox decides what happens next. Ticked, which is the default, only clean rows are created. Unticked, a row is created minus the part that failed, so an unreadable proxy cell gives you the profile without a proxy rather than nothing at all.

A row with no name is left out either way. Everything else is a choice you make with the values in front of you.

Problem in the rowHow it looksWhat the import does
No nameThe Name cell is emptyThe row is never created, with the box ticked or not.
Proxy not readable"ask the seller" in the Proxy cellReported with the line number. The profile is created without a proxy rather than with an invented one.
Proxy type unsupportedA protocol the app does not speakReported. Nothing is quietly downgraded to http.
2FA key unusableA secret with characters that are not base32Reported, never stored. Wrong codes fail the login, and a few failures lock the account out.

The import fills the groups and the proxy library too

Group names in the file become the same first-class groups the rest of the app uses. Matching is case-insensitive, so Sales and sales do not become two groups, and a group that does not exist yet is created.

When you are signed in, the local group id is translated to the server's id before the profile is created. Without that step the server rejects every row that has a group, and an import of a hundred rows with groups created zero profiles. The group column is second in the app's own example file, so that failure reached almost everyone.

Proxies from the file join the shared library as well, deduplicated by host, port and user, and labelled with the profile they came in with. Rotation, checks and a single password change then reach an imported profile the same way they reach a hand-made one.

The one-time code key is written to the profile as soon as it exists, so an imported profile is ready to sign in rather than half set up.

  • Created

    Profiles that now exist.

  • Skipped

    Rows the app refused, with the reason from the last refusal.

  • New groups

    Groups the import had to create along the way.

  • Proxies saved to the library

    New entries added. Addresses already in the library are reused, not duplicated.

A template carries your decisions, never a fingerprint

Open a profile, set it up the way you need it, and press Save as a template. The template is those decisions under a name.

It carries the scenario, the OS template, the group, the proxy, the rotation interval, the start URL, the headless choice, the engine build such as 153.0.7978.0, the notes and the tags. A proxy you typed in by hand travels whole, including the key file path for an SSH exit, and its password is sealed with the system keychain when the system offers one.

It does not carry the fingerprint, and that is the more important half. A fingerprint is derived from the profile's own id under generation 4, so fifty profiles built from one template are fifty different machines. Copying one machine fifty times is the fastest way to have a group of accounts recognised as a group, and it shows on the first launch, with no history needed.

  • Stored in a template

    Scenario, OS template, group, proxy, rotation, start URL, headless, engine build, notes, tags.

  • Never stored

    The fingerprint, the cookies, the sessions. Each new profile derives its own machine from its own id.

  • Limits

    Up to 100 templates, a name up to 60 characters, up to 12 tags per template.

A batch with names that continue the series

Press Create a batch, pick a template, type a base name and a count. The batch is created from the template, so the decisions are shared and the machines are not.

Names continue the series instead of starting it again. Numbers are padded with zeros to the width of the largest one, so Work 01 to Work 50 sorts in order, while Work 1 next to Work 10 does not. If Work 01 and Work 02 already exist and you ask for three more, you get 03, 04 and 05.

Your plan's room is checked before the first profile is created, not in the middle of the run. Free carries 2 profiles, Professional 10 to 100, Business 200 to 1000, Enterprise 5000 and up. When the batch does not fit, the message says how many do.

Up to 200 profiles are created per press. The first failure stops the run, because if the quota ran out or the network went away, the next forty-nine attempts would fail the same way while you waited for all of them.

  1. 1

    Pick the template

    The line under the picker names the scenario, the OS template, the group, the proxy and the engine build it will use.

  2. 2

    Name and count

    A base name, and how many. The count is capped at 200 per press.

  3. 3

    Read the preview line

    It shows the first and the last name before you press anything. Fifty profiles with unexpected names can only be renamed one at a time.

  4. 4

    Create

    Profiles appear in the list, each with its own fingerprint, its own storage and the shared decisions from the template.

What this does not do

  • Excel and OpenDocument workbooks are not read. Save the sheet as CSV or TSV first: the picker takes .csv, .txt and .tsv.
  • The import brings settings, not sessions. Cookies, signed-in state and local storage are not in a spreadsheet and do not come with it.
  • A proxy that parses is not a proxy that works. The import reads the address, it does not dial it. Check the entries afterwards in the Proxies view.
  • Rows are not matched against profiles you already have. The same name twice gives two profiles, and re-importing the same file creates everything again.
  • A bare 2FA secret is read with the standard settings: 6 digits, a 30 second step, SHA1. If your provider issues 8 digits or a 60 second step, put the whole otpauth:// link in the cell.

How to check

Every claim on this page is one file you can open, and most of them have a stand that fails when the behaviour changes.

The file is read as CSV, not split on commas: BOM, semicolons, tabs, quoted commas and line breaks inside a field.
apps/desktop/src/lib/csv.js · apps/desktop/test/csv-import.js
Columns are matched by meaning, and a column that matches nothing is named rather than guessed at.
apps/desktop/src/lib/profileImport.js · apps/desktop/test/csv-import.js
An account Login or Password column never becomes the proxy's login or password.
apps/desktop/src/lib/profileImport.js · apps/desktop/test/csv-proxy-columns.js
A group name from the file becomes a real group, and a signed-in account gets the server id instead of the local one.
apps/desktop/src/main/main.js · apps/desktop/test/csv-import-groups.js
A template copies decisions but not the fingerprint, the quota is checked before creation, and batch names continue the series.
apps/desktop/src/lib/presets.js · apps/desktop/test/заготовки-и-пакет.js

Bring your list in

Download ARMANOS, press From a spreadsheet above the profile list, and check the mapping before anything is created.