[Android Q&A, Help & Troubleshooting] svyr:
it's not simple. it's annoying and longwinded. and defeats about half the point of automated backup apps.

the Carbon/Helium app is horrible.

While this went ok I had to reset my device today for another reason.

So before doing that, I backed up using Carbon, and transferred the data via the the web interface as the dev suggested

but was unable to restore the packages as uploading the zip back fails.

(the server on the n4 just stops after the upload. Moreover - there's no logs of any kind for the user as to why it fails. and no upload progress.).

Dunno if the dev will reply what the problem with the android web server component is but for now since i needed the backup urgently

I ended up having to extract the zip and convert the backup into individual manifests/copy the zip contents into app packages folders

Here's the powershell code to do this if anyone else has a similar problem (use at your own risk, I only tested it once on my device)

$backuppath='E:\_MediaServerE\backup\' #extract your backup.zip contents here (those are the .ab, png files in the zip you downloaded + a backup.json maniest the app generated for all the packages)
$jsonFile=$backuppath+"backup.json"
$jsonText=[System.IO.File]::ReadAllText($jsonFile)
$files = Get-Item -Path ($backuppath + "*")
[System.Reflection.Assembly]::LoadWithPartialName("System.Web.Extensions")
$ser = New-Object System.Web.Script.Serialization.JavaScriptSerializer
$jsonPackageDefs = $ser.DeserializeObject($jsonText)

function getPackageDef([string]$pname, [Object]$packagesIn){
$ret = ""
foreach($p in $packagesIn.packages){
if($p.packageName -eq $pname){
$ret = $ser.Serialize($p)
break;
}
}
return $ret
}

#for each file copy it to a subfolder with the package name, and find the json manifest in the manifest collection
#and write it to the app folder
foreach ($f in $files){

if($f.Attributes.ToString() -eq "Directory"){
#skip
}
elseif($f.basename[0] -eq "." -or ($f.basename+$f.Extension) -eq "backup.json"){
#skip
}
else{
$bn=$f.BaseName
$bn
if([System.IO.Directory]::Exists(($backuppath+$f.BaseName))-eq $false){
[System.IO.Directory]::CreateDirectory(($backuppath+$f.BaseName));
}

if([System.IO.File]::Exists($backuppath+$f.BaseName+"\"+$f.BaseName+$f.Extension)){
[System.IO.File]::Delete($backuppath+$f.BaseName+"\"+$f.BaseName+$f.Extension)

}
if([System.IO.File]::Exists($backuppath+$f.BaseName+"\"+$f.BaseName +".json")){
[System.IO.File]::Delete($backuppath+$f.BaseName+"\"+$f.BaseName +".json")
}

$f.CopyTo(($backuppath+$f.BaseName+"\"+ $f.BaseName + $f.Extension))
$packageDetailsText=getPackageDef $f.BaseName $jsonPackageDefs;

$jsonFileNameOut=$backuppath+$f.BaseName + "\" + $f.BaseName + ".json"

[System.IO.File]::WriteAllText($jsonFileNameOut, $packageDetailsText)
}
}

I then copied the results to internal storage\carbon and was able to restore.

I hate the carbon app it's probably the worst experience I had backing up my device. It's cost me hours of worrying and coding to restore my data and i paid for that crap... There is hardly any documentation to follow and the dev doesn't even warn to not copy files on the app page (that's for the previous issue just above, this one is more about the 'proper' way breaking) Moreover it failed to backup the com.ea.games.nfs13_row game correctly due to its size so I lost the save data for it.

This is not an experience people should have with a backup app.

He should just provide a secondary way to transfer things using the files in the carbon folder (and/or a zip of the backup) instead of the web server bit that breaks, and takes forever. (and yes, I realize the web server generates the zip from the carbon folder and adds the manifest for the download, but if you can't upload it back for restoring properly - what's the point)

oh and keep in mind - you're storing unencrypted tar equivalents of your phone app data - so take care about where you keep the zip or the ab files. (the ab files are tars with a slight header change) (not that Carbon asks you to provide any means of protecting them, so more of an unrelated aside)