sphaira looks very good, even better than Homebrew Details, looking forward to supporting multiple languages (such as Chinese). I have been enduring hbmenu for a long time.
Sphaira, the HB-Menu replacement app, is absolutely beautiful! Please consider making it publicly available and adding more features to enhance its functionality.I decided to release my ftp server publicly. It has builds for various platforms, such as the wii, 3ds, nds etc...but i figure that most users of this app will be using the switch version
There exists 2 builds for the switch, application and sys-module. The application is to be launched via hbmenu, the sys-module runs in the background.
Performance wise, it out performs ftpd (application), sys-ftpd-light (sys-module) and a few other homebrew apps that feature ftp servers, all while having a smaller memory footprint.
Do keep in mind that the sys-module version will perform much slower than the application version due to reducing the amount of memory ftpsrv uses.
Link to the project
Link to the releases
Whilst i'm here, i might as well release a public build of sphaira, my hb-menu replacement app. Have fun!

Hi @TotalJustice Tried to PM you but no avail, I am not programmer but some good fella is a good one.I guess I could create a thread for sphaira. Irs is the infrared camera on the joycon. Sphaira is full of random features because i was too lazy to create a new project and copy over my gui lib and set everything up, so any new features were added to sphaira instead.
good idea. the name listing will only be possible in the app version as the only way (that i know) to retrieve the game name is using `nsGetApplicationControlData()` and the struct passed in is ~130KiB in size, which is massive as it returns the compressed jpeg as well sadly.
the sysmod version would instead just list the title id's of all the games instead.
this will take me a couple of days due to work keeping me busyand i will need to restructure the vfs code quite a bit.
You need to buffer r/w as well, see vfs-nx.c. the socket size may also need updating.@TotalJustice I tried changing CMakeLists.txt to increase buffer size to 64k but the speed did not change.
ftp_set_options(ftpsrv_sysmod 769 6 1024*64)
I don't use stdio, I use native fs services.Hi @TotalJustice Tried to PM you but no avail, I am not programmer but some good fella is a good one.
He was telling me if you are using LibNX stdio in your code (I can not tell, I have no such knowledge) the code is going to run into problems mounting all of the saves at once. Mainly because the line https://github.com/switchbrew/libnx...8799f/nx/source/runtime/devices/fs_dev.c#L111 is an array of 32, so can overflow with all the titles.
An example of a code to handle many things open at once, well until console exhaust, is on https://github.com/J-D-K/FsLib/blob...808a982d7458fe7/3DS/FsLib/source/FsLib.cpp#L8 is a C++ map.
Hope this help you.
Regards mate.
It's unlikely I'll make the code public, or add features. I will look into adding translations tho.Sphaira, the HB-Menu replacement app, is absolutely beautiful! Please consider making it publicly available and adding more features to enhance its functionality.

Great then, that is easy.I don't use stdio, I use native fs services.
That comment is wrong, I was meant to say ports less than 1024 are privileged and won't work. However if you open socket service as system, you can use them. Hence why port 21 works.I am not able to mount save. I have put in a game title id that has save in config.ini
save_application_id = 0x010048802017A000
Why there is the comment port needs to be <1024? I have been using 5000 and it seems to work fine with yours too.
Love the mount point concept. Is there a way to add more directory to mount point with config.ini?
##########
# ftpsrv #
##########
#######################################################################
# Rename config.ini.template to config.ini for changes to take effect.#
#######################################################################
[Login]
# disabled by default, do not enable if using ldn_mitm as
# it's a security risk - you have been warned!
anon = 1
# if anon is disabled, then user and pass must be set.
; user =
; pass =
[Network]
# ports to be opened (< 1024), however, port 21 works fine for me...
port = 21
[Log]
# enables log output to /config/ftpsrv/log.txt
log = 0
# options specific to Nintendo Switch
[Nx]
# enables showing all available mount points at root "/"
# for example, SdCard is as at "/sdmc:"
mount_devices = 1
# mounts the application save data, needs mount_devices = 1
save_application_id = 0x010048802017A000
# mounts the application bcat data, needs mount_devices = 1
bcat_application_id = 0x0100F2C0115B6000
# enables led on the controller to light flash
led = 0
Post automatically merged:
How does ftp work in sphaira? Is there a config setting for ftp and mtp? I can't get ftp to work and mtp has only the sd card.
Both don't work.For the save, are you using application version or sysmod?
I make it spit out the values and I got this, don't know how to interpret the result code but is uid all 0 a problem?Btw TomSwitch, if you're interested in getting the sysmod to perform better, I'd recommend making changes to the application version instead. Set all the values to match the sysmod and make tweaks there. It'll be much easier / quicker to debug. You can add nxlink output as well and if it crashes, it won't fatal your switch.
Although saying that, maybe hold off until I release the next version as theres a few areas in the code that are blocking (meaning, it can hang/stop responding) I've fixed everything locally but haven't commited the changes yet.
Made this change and is workingI make it spit out the values and I got this, don't know how to interpret the result code but is uid all 0 a problem?
View attachment 473604
Yeah, I'm using latest ams. Did you upgrade ams after installing the forwarders?I tried the NRO forwarder functionality and it worked for a bit, then atmosphere crashed and the forwarders no longer work. Is this compatible with the latest pre-release Atmosphere?
I tried on firmware 19 and forwarder not working.Yeah, I'm using latest ams. Did you upgrade ams after installing the forwarders?
Nope, everything was exactly the same AMS wise before and after using the forwarders. Which makes it even more confusing that it seemed to work.Yeah, I'm using latest ams. Did you upgrade ams after installing the forwarders?
I believe that's because I don't commit the changes using FS commit. Iirc that is needed for save writes. I just forgot about it when I added save mounting.The save mounted cannot write through to the actual game save. The read out works fine but writing does not work whether the game is running or not. Having the ability to read the save when the game is running is very nice. Not able to write even when the game isn't running is I suppose a bug.
i thought this a bit more, instead of using ns to read the application name (and the jpeg, that we don't need), i can just use ncm to read find and read the control nca and read the nacp (which has the application name). should be faster too due to not having the fetch the jpeg data. this is probably what ns does internally anyway.sad, but no problem at all.
i'm working on the save listing now. theres 2 ways it can be listed:

BCAT should be a «Account» by example if you have 2 users: Pepito & Susanita, and two games: Karts & Bros, you can see:i'm working on the save listing now. theres 2 ways it can be listed:
"/save:/account_name/bcat/game_name"
or
"/save:/bcat/account_name/game_name"
which would you prefer?
doing "save:/game_name/account_name/bcat/" isn't an option as it would be very inefficient to list games. i'd basically have to loop through every game, check if it has a save, has a save for x user, has a save for bcat etc. whereas with the first 2 options, i can use a filter and only fetch what i need. jksv and such can get away with it because they have a lot of memory to work with. the sysmod is working with like 2kb of ram heh.
/save:/Pepito/Karts
/Bros
/Susanita/Karts
/Bros
/bcat/Karts
/Bros
/save:/Karts/Pepito
/Susanita
/bcat
/Bros/Pepito
/Susanita
/bcat
thanks! i have save listing working now, the games will be listed like `Another Code: Recollection [0100CB9018F5A000]` and if the game is no longer installed (so i cant fetch the name), i will just show the id [01009B90006DC000]BCAT should be a «Account» by example if you have 2 users: Pepito & Susanita, and two games: Karts & Bros, you can see:
Code:/save:/Pepito/Karts /Bros /Susanita/Karts /Bros /bcat/Karts /Bros
Or:
Code:/save:/Karts/Pepito /Susanita /bcat /Bros/Pepito /Susanita /bcat



