You can now install it through Blish HUD and all future updates for SPARK will automatically update for you.
This version also comes with a new 'import from another character' feature to let you import existing profiles you've made from one character onto another one!
I think SPARK is finally at a point where I am okay with the public trying it out, finding bugs, and seeing if it runs well enough.
I've also migrated the server structure to postgres and redis so this should handle a larger amount of players using SPARK than my private beta tests did. Hoping it won't kill the server if a lot of people suddenly start using it, but that's what a beta is for, after all!
How do I access SPARK?
You will need:
1. Blish HUD with your API key added to it (these are safe to add, GW2 API keys only read data)
2. The SPARK module file (see here)
Because this is NOT submitted to Blish HUD yet until I've beta tested it thoroughly, you have to manually install this addon. Instructions are provided in the release, as well as in the Discord.
How do I submit bugs/feedback/questions?
I have a SPARK Discord server for people who want to discuss development and report things so I can fix them and work on it.
Keep in mind, some quirks are things I can't fix (like text cutting off in the profile editor and such, waiting on Blish HUD to fix this).
How long is my data retained?
24 hours at most. After that, if you haven't been online then your profile information gets wiped from the server entirely. I do not keep your data, nor do I want to store it indefinitely.
The exception to this is user reports. If you report a profile, it snapshots a copy of the profile on the server, plus your message, and saves that into a permanent database for review and moderation.
Can I contribute to SPARK?
You can!
A while ago, I migrated SPARK's codebase off of my own self-hosted repo and onto GitHub purposely so it was publicly accessible.
You can find the source code here.
It's licensed under the GNU General Public License v3.0.
The server portion of the addon is not public, but if I ever discontinue this project, all server code and setup instructions will be available for others to self-host and continue without me.
Keep in mind, everything is a heavy work in progress still. There's much work to be done. I'd estimate I have about 80% of what I want in the first release ready. It's been... 6 or 7 weeks of development so far, I forget exactly when I started on it initially.
This first page is the in-progress revamp to make things a single page without scrolling. More options to come as I work on new features.
One new feature is auto-hide UI. This closes most SPARK windows when you open a map, load zones, or view a vista.
Blocks also now have their own manage window!
Profile Editor Window
Profile Selection
The profile editor has a few tabs, the first being where you set your profiles on each character.
Here you can make a profile, duplicate it, save it, set it to be active, or delete. The UI on this is a bit rough and needs work, but it works well for the most part.
Later on, I may allow you to copy profiles from your other characters in case you have duplicates on different classes.
Profile Editor
The profile editor (god I'm good with names, the profile editor profile editor) is where you set the bread and butter for your profile.
You can add in a custom name to override your character name, set a custom profession similarly, your pronouns, an RP hook for what your character is known for it recognized for, a description, and at a glance.
Unfortunately, multi-line input boxes don't have word wrap, so that's why the text here is cut off. Blish HUD has a pull request in review for this though so maybe eventually it'll be fixed.
Profile Editor - At A Glance
You can set up to 5 'At a Glance' icons on your profile, utilizing existing icons in Guild Wars 2. This search returns up to 50 results, is almost instantaneous, caches via Blish HUD, and disposes when closes to free memory.
SPARK is bundled with an asset icon file for the search so it works locally, then goes through Blish HUD's gw2dat server to retrieve the icon files.
Here you can set a custom tooltip for them, which looks like so in use:
They're pretty neat!
Preferences
Here is where you can set your experience level for roleplay, some preferences, themes, and styles. I might expand on this later on based on feedback.
Current Info
This tab is basically "what is your character up to" and out of character info about yourself.
This information gets added to your presence on the online list when people are viewing profiles, like so:
It's a good way to get a quick glimpse at someone before opening their profile!
Profile Viewer
View Profile
A full profile can have a lot of info.
Some things, like the info from preferences, I might remake and try and make it look nicer somehow. It works for now, but I might make it some kind of dropdown or something to see that info.
On this page, you can hit 'Copy Name' to copy their account name to whisper the player easily (I tried to make a whisper function and it failed spectacularly so I gave up on that). You can bookmark a player, block them, or report them.
The report box pops up on the profile viewer itself and lets you type a short message on why you are reporting the person.
Some notes:
You can only report someone who is stored in SPARK's database. This is because that information is authenticated to be truly from that account, not falsified in some manner, and a source of truth. If they have no logged in for 24 hours, reporting that profile won't go through.
Multiple people can report a profile. All reports get saved into a single report file for that user, with report reasons appended at the top of the file.
I have the ability to entirely ban someone's GW2 account from accessing SPARK in case someone is using it to post hateful things or something.
Private Notes
Profiles also have a private notes tab!
This is saved locally to your PC and never transmitted on SPARK and is a little personal notepad where you can keep some information in about players you interact with. Like if someone gave you a cupcake you could put in their profile "They gave me a cupcake. It smelled like poison. I told them I ate it but I gave it to someone else."
Online List Viewer
The online list automatically filters for you based on if you choose NA or EU in the Spark Module (see the first screenshot to see that option!)
You can search profiles here and search all fields, specify which field, and sort by various fields.
The renown heart next to a profile means it's someone you have bookmarked as well!
The online list refreshes automatically, but you are able to manually refresh it. Keep in mind, the server temporarily caches the online list, so it might be around 5 to 10 seconds out of date at times to keep the server resources lower.
Saved Profile Viewer
Recently Viewed
When you view a profile, it downloads to your disk as a small 1kb to 10kb file. This gives you a local copy of it in case SPARK is down or the user hasn't been online in 24h and SPARK doesn't retain the data anymore.
Any time you open a profile here, it first checks with SPARK to see if there's a new copy or not available, then downloads it.
Keep in mind, if someone blocks you, you cannot retrieve new copies of their profile and will never see them online again. This is for privacy reasons.
Bookmarks
The next tab is your bookmarked users who you want to specifically save and easily keep track of.
There's currently no limit on this, so uh, let me know if this becomes an issue with a lot of them later.
Block Manager
Here's where you can put blocks on SPARK if someone has a profile you don't like or you don't want them to see your profiles at all.
I want people to be able to curate their experience using SPARK which is why this exists.
Blocks are local first to remove any lingering remnants of someone you blocked, and then synced with the server to ensure someone blocked can't see you online, your location (if not hidden), or any profile updates or profiles from you. Before you connect to SPARK, it always syncs your blocklist first before your data is transmitted to ensure complete privacy.
That's all I have to share for now! Let me know your thoughts and I hope to have more to show soon!
There's now a way to search for icons in the game from items, currencies, skills, traits, specializations, minis, etc.
To do this, I've made it so my webserver for SPARK will check once a day and rebuild the icon index with new entries, which takes about ~2 minutes to run through all 57,000+ entries.
I'll bundle the latest version of the icon index in the addon itself, which is compressed to 1.2MB roughly (10MB uncompressed). But whenever you load the module, it should check if your icon index is out of date, then download the new one to your PC to use instead.
What happens behind the scenes is that when you search anything, it checks the name, description, and keywords of everything in the list and if it matches it'll return the icon ID for it.
Then, Blish HUD resolves every one of those IDs and loads them in here. This might take a few seconds for some to appear, but it works pretty well so far!
The UI still needs a bunch of work and there's a few more quality of life stuff I need to do. Hoping I can have this ready for initial release within a month potentially, but I'll do some private testing with friends first.
So far, this addon is probably like 8 to 10MB or so in size. I don't imagine it growing too significantly large beyond this.
I did the first test of SPARK with others and it worked pretty much perfectly!
I need a few updates to the UI to explain a few things, like adding API keys to Blish to use it, and some other things like blocking, but it seems to run really well on the first test run!
I won't have anything fancy to show for a little bit probably in terms of features, I'm working right now to improve the authentication and secure everything as much as I can as the next steps.
I've gotten the minimum viable product finished for SPARK at this point, but it's very rough, and not production ready.
If there's any concerns or questions, lemme know! Happy to discuss this in further detail as I slowly build this out.
For people who want the technical details on what I'm planning or implementing (some of this already is added), see below:
Authentication
SPARK will not need any login, password, or accounts to operate.
To publish or read SPARK data, the addon will use your Guild Wars 2 API key that you add into Blish HUD itself. It just needs account and character permissions to read these values. While these keys just provide read-only information, keeping these private is important. It's why you add this to Blish HUD, not my addon directly.
Your API key is also NOT sent to the SPARK server. Instead, SPARK generates a temporary GW2 subtoken from whatever key is in Blish HUD.
The SPARK server uses that subtoken to ask the official GW2 API who the account belongs to and verifies it this way (and caches for a short while so we don't spam the GW2 API each time you do something).
The reason for this is that the server doesn't trust any user-submitted data, especially the account and character fields in your profile data, because someone could edit these outside the addon to something else.
The server treats the GW2 API as the authority, which prevents someone from submitting a profile or presence update pretending to be a different account or character owned by someone else.
The golden rule for anything online is to never trust the client.
Profile / Data Validation
SPARK will ONLY accept fields that match the server's expected fields. If someone tries to add new fields or data that the server isn't expecting, it gets rejected. This also includes field lengths, accepted values/types, formatting, and so on.
Text fields are sanitized to reject unsafe control characters and oversized payloads. This helps prevent any malformed requests and bad data, or someone trying to push something malicious through the server.
The server database also uses parameterized values to prevent forms of SQL injection attacks.
These will be kept incredibly strict to prevent forms of abuse.
Privacy
SPARK profile and presence data should be treated as public *within* SPARK.
By "Presence", I mean a small profile snippet that people can hover over on the online list, which contains your name, account name, race, profession, status, and some other fields. It's like a mini-profile, essentially.
Essentially, treat your profile and information as if everyone else using SPARK can see it. Even when I (eventually) add some private fields you can share with specific accounts.
You can add private notes to profiles to track information, however. This is stored locally, and never sent to the server whatsoever.
You also can hide your current location. Taking a date to Caudecus' Manor for something spicy? This will show as 'Hidden' to all players instead.
You also can set yourself to be invisible, making it so your profile stops showing up in the online list when you're playing.
Account Blocks
Because of the strict authentication system, this means we can apply blocks across the service securely and when we process requested data.
If person A blocks person B, this means person B will forever see person A as offline, and can never retrieve their profile data anymore. If they bookmarked them or looked at them recently, they have only a local cache of the profile. This cache will never update again so long as the block exists.
Person A will also not see person B on the online list anymore on any character, hiding them until the block is removed.
The SPARK API does not provide players information on if they are blocked by someone, it simply rejects the requested information on the server's end and excludes specific information when it sends data back to someone without them knowing this.
Blocking someone will not remove your profile(s) from their recently viewed or from their bookmarked profiles. This is on purpose, as someone could keep track of this to determine if someone blocked them. It's better to just make you permanently offline to them and never give them profile updates anymore.
First test with passing information to/from the server is successful. I'm just using a dummy .json file on the server and pretending to be a second user for this.
A lot of the API endpoints weren't hard to set up since I utilize endpoints to deliver patreon content into my own game (so it's never bundled in the public build), so this wasn't too bad to get working.
I'm still ironing out a few quirks with it, and need to cache a few things to make it more performant. I just wanted to make it work first before I tweak it further.
Some things to note:
If you set your status to Invisible, you immediately are removed from the online list and won't appear to anyone anymore. This is done in the module settings page. I might add a quick access menu for this.
If you block someone on the module settings (or hit block on their profile to add it in automatically), they will no longer be able to see you online or any of your profiles anymore. You also will not see any of their profiles either.
You retain a cached list of recently viewed profiles on your machine. This means if someone is offline, you can still view their profile without waiting for them to come back online. You can favourite them as well to permanently keep them in a list.
If you view a profile in the favourite/recently viewed list, it will attempt to retrieve a copy of the profile off the server if they are online, or just use the cached copy if not.
This also is the case if you are blocked. You will never know that the user is online, and it will always serve you the last cached version of the profile you saw. You'll never see any further updates if someone blocked you, as if they never come online again. I think this is the best compromise for user privacy around blocking others. Otherwise, if someone keeps track of who they favorited and sees one disappear, they'd know you blocked them. I'd rather avoid that situation.
The server itself has a block account function. If someone is being malicious, harassing others, or making profiles promoting bigotry, hate, discrimination, etc. I can ban them permanently from accessing the RP Profile service on that GW2 account entirely. All API calls use your GW2 account ID as your identity, pulled directly from the game.
If you swap to the character selection screen, you disappear from the online list since you're probably AFK or swapping characters.
Other stuff I'm looking at:
Profile Notes:
An area for users to leave notes on profiles they have bookmarked to remind themselves of past interactions or things to keep in mind, etc. Would be entirely offline, never passed to the server. Just syncs up to specific profiles when you open them if they match the account + character + profile ID (since characters can have multiple profiles).
Private Profile Section
This would be a section that you can specify access to for various friends to see or if you want to share information with someone but not another. Likely just another big description box you can put whatever you want in that won't be seen except by people you specify.
Or, y'know, for people who wanna put whatever spicy RP details here and not broadcast it to the public so you can make sure you are sharing anything 18+ with consenting adults.
Like with other RP addons on other websites, I suspect people will just post all of that on their public profile regardless though, so it's kind of futile.
Lower on the priority list right now to add.
Multi-Message Chat Helper
I was thinking of adding an in-game window that can let you write out a big RP message and have it automatically post it in chat for you one by one in chunks that fit the chat limit, with whatever separators you want to style it with.
It's probably just some simple string manipulation, and I'd probably enforce some limit on it so someone can't maliciously spam chats with it. If it seems like it'll be abused, it might just be a simple way to copy/paste what you need so you have to do it manually.
I've seen a tool that sort of does this already but it's outside the game. Something in-game might be a bit easier than alt-tabbing, especially for those on a single monitor.
This is a low priority addition, not something I'm gonna focus on unless there's a huge demand since it's probably a fucking pain based on GW2 chat limits and anti-spam stuff.
Dice Rolling
I'd eventually like to add some kind of dice roll feature where you can set up a group with others who are using the tool, and if you roll a dice (can specify whatever, like 1d20, 3d10, 4d20, etc.), it rolls and submits the result to all connected people.
I think for this I'd need to implement something with websockets though, so if I do make this, it'd come much later when I'm done with the main module functionality.
Better tooltips (max lines, options to choose what is shown)
Global OOC info if you want the same across multiple profiles
Better search (double the icons included, with better deduplication)
Server status in the icon menu
And more!
I'm constantly working to add new stuff to SPARK! Please tell your friends about it!
More ways to roll dice will be coming soon. I also am looking at potentially adding new statuses, an additional profile page for extra info (age, height, birthplace, etc.) and more!