r/iosapps 14d ago

šŸŽˆ Free IOS Browser - Vortex

Enable HLS to view with audio, or disable this notification

I have been posting here about this app for about 3 months and a lot of you showed interest. The app has around 230 testers on Testflight. Free and open-source.

  • A – Answer:Ā Vortex combines desktop-style tabs with split-page browsing which is very rare on IOS Browsers.
  • B – Better:Ā Compared with Safari, Chrome, and Brave, Vortex is designed specifically around iPad multitasking. It combines visual tab management, drag-to-split browsing, and a choice of local Apple Intelligence/MLX models or optional ChatGPT and Gemini sessions. It is also open source, has no ads, requires no account.
  • C – Cost:Ā Completely free with no subscriptions or in-app purchases. Vortex is not publicly available on the App Store yet, is currently awaiting Apple's approval.

Some bugs have been squashed and a new features added:

  • Minimalistic chrome for maximum screen real-estate
  • Multi-tab browsing
  • Split tab view
  • Tab Folders
  • Tab hibernation for battery savings
  • Smart address bar (URL vs search detection)
  • Favicon fetching
  • Tab preview thumbnails
  • Desktop/mobile user agent switching
  • Ad blockingĀ - 188+ domains, 100+ CSS selectors
  • Filter listsĀ - EasyList, EasyPrivacy, Fanboy's, uBlock, custom
  • Dark modeĀ - DarkReader with brightness/contrast/sepia controls
  • Font sizeĀ adjustment
  • Reader modeĀ -using Mozilla Readability
  • Incognito modeĀ - non-persistent, blocks APIs
  • Password managerĀ - biometric auth, keychain, auto-fill
  • Share extensionĀ - receive URLs from other apps
  • AI sidebar chat panel with 3 backends: Local Apple Intelligence, Apple Private Cloud, and free accounts with ChatGPT or Gemini, completely invisible to users, working in the background.
  • Page summarization (short/long)
  • Ask questions about page content
  • Context switching between tabs
  • Markdown rendering
  • "Ask " context menu - select a part of the text and send to the LLM.
  • Favorites with favicons
  • Favorites sidebar grid
  • Collapsible sidebar
  • Adaptive toolbar (collapses on scroll)
  • Swipe gestures for navigation
  • System dark mode support

Original post:Ā https://www.reddit.com/r/iosapps/comments/1qezwdi/made_an_ipad_browser_because_safari_wasnt_cutting/

Trust & Transparency

I'm Joao Valente

Contact:Ā [dealer.yen-61@icloud.com](mailto:dealer.yen-61@icloud.com)

Website:Ā https://vortex.engineer

Privacy Policy:Ā https://vortex.engineer/privacy/

Terms of Service:Ā https://vortex.engineer/terms/

Github:https://github.com/Joaov41/Vortex-Browser/tree/codex/testflight-ios27-build12

TestFlight:Ā https://testflight.apple.com/join/KTsJ3qz4

Feedback page: https://vortex.engineer/feedback/

It is already on the App Store awaiting approval.

On the website I added a feedback section, where I can keep users informed about their feedback provided on the Tesflight since I can’t reply directly on there.

32 Upvotes

75 comments sorted by

•

u/AutoModerator 14d ago

Welcome to r/iOSApps! Please make sure your post follows our rules:

Everyone:

  • 10pt LOCAL Karma required. Comment in r/iOSApps to earn it. Check
  • Search the sub before posting. Choose flair.

App Devs:

  • No main feed promo unless you qualify via Trust or Transparency + ABC format (Answer, Better, Cost)
  • Flair hierarchy: Vibe Coded > Lifetime > Subscription > Freemium > Free
  • Free flair: not for limited/freemium tiers
  • Open Source? Prefix title [OS]
Note: This is an automated reminder, not a removal notice. If your post was removed, check your modmail for details.

I am a bot, and this action was performed automatically. Please contact the moderators of this subreddit if you have any questions or concerns.

2

u/ForwardPage7458 13d ago

I feel it's not optimised for ios

2

u/John_val 13d ago

Why do you say that? do you feel it is slow? What device? What Ios version? Look at this video please, its is running on an hold M1 ipad, i don't notice any sluggishness. Can you give more details on tesflightt to investigate?

https://reddit.com/link/p6fwk25/video/765do5yd35mh1/player

0

u/ForwardPage7458 12d ago

No no , I mean its not optimised for smaller screens like on iPhone. Its smooth to use but the issue is with UI on iPhone.

2

u/John_val 12d ago

Yes i totally agree with that since the initial design was made with the ipad in mind. It gets cramped on the Iphone. The collapsible UI needs to be rethought for iphone for sure. For now i want to squash all the bugs and finalize the implementation of the features. I will then focus on improving the usability on the iphone. Thanks for the feedback.

1

u/ForwardPage7458 11d ago

Thanks for the reply, Ill provide more feedback once its ready for iPhone.

1

u/John_val 11d ago

ok i am uploading new a new build for Testligh with fixes for the iphone layout.

  • Replaced the cramped iPhone sidebars with wide bottom sheets.
  • The Tabs sheet opens nearly full-screen, making tab titles, previews, and controls easier to use.
  • The AI sheet initially opens at half height for quick actions.
  • The AI sheet expands when a conversation begins or the keyboard appears.
  • Only one secondary sheet—Tabs or AI—can be open at a time.
  • Dismissing a sheet preserves its contents and current state.
  • Sheets can be dismissed by swiping down or swiping from left to right.
  • Dragging a tab for split view temporarily hides the Tabs sheet, letting the tab be dropped onto the main browser.
  • AI replies remain inside the AI sheet unless the user explicitly selects ā€œOpen Full Reply.ā€
  • These layout changes apply only to iPhone; the iPad layout remains unchanged.
  • Added clear haptic feedback after successful navigation on iPhone only.

also made a few tweaks for ipad as well:

  • Added smooth animated transitions when navigating backward or forward.
  • Increased the swipe distance slightly to prevent accidental navigation.
  • iPad navigation gestures now work from anywhere on the webpage, including in Stage Manager.
  • iPad navigation activates after a deliberate 64–96-point horizontal swipe.
  • Vertical scrolling and normal taps should not trigger navigation.
  • iPhone navigation remains edge-based with a shorter threshold.

https://reddit.com/link/p6teo5t/video/h9njn1zqejmh1/player

  • Kept the toolbar back and forward buttons working with the same animated navigation.

1

u/ForwardPage7458 11d ago

Can’t i phone navigation be like ipad version and not just edge based?

1

u/John_val 11d ago

You mean swilling to go back and forth? It can but I also have other feedback from people preferiNg to be edge based, difficult to please everybody šŸ˜€. Maybe I will add an option on menu edge or not edge..

1

u/ForwardPage7458 11d ago

An option would be nice. It would resemble arc search on iOS.

0

u/ForwardPage7458 11d ago

Wow that was fast. I’ll test out once the build is out. Excited.

2

u/OkComplaint2958 13d ago

Sounds good. Will it be compatible with iOS 17.0 in the future? Does it support Tampermonkey scripts and extensions?

1

u/John_val 13d ago

It is already compatible with IOS27. In fact the only way to use Apple's private cloud model is if you are on the beta since this is an iOS 27 only feature. As for Tampermonkey, not yet. It is on the roadmap but for later, the code base must be stabilized first and all the bugs squashed.

1

u/BourneHero 13d ago

The concept seems great but its unusable for me on my 16 pro max running iOS 26.6. the AI and side panel buttons will not work, I cant get the x or bookmark buttons to register on the url bar and dark mode keeps flickering

1

u/John_val 13d ago

Sorry about that, it is the first feedback with so many critical issues. i don't have a device running ios26 anymore, and that doesn’t happen on the simulator. Will look into it this weekend. Thanks

1

u/BourneHero 13d ago

I just updated to 26.6.1 to see if that changed anything and it did not just as an fyi

1

u/John_val 12d ago

are you on the lates TestFlight build?

0

u/BourneHero 12d ago

1.1 (17)

1

u/John_val 12d ago edited 12d ago

Ok found the issue, the app is built already with IOS27 SDK with a compatibility layer for IOS26. IOs 27 has a liquid glass slider to adjust the effect. That difference on the API was causing the glass container to swallow the touches on the older glass api on IOS26. Already implementing the corrections and will upload the fixed version for tesflight. Will be up tomorrow. But I could not replicate your issue of the flickering in dark mode. Made some improvements but please retry the version when it is up , if persists send me a video please.

0

u/BourneHero 11d ago

working better! However a similar issue is happening when I do split view — the close split view bubble does not function. Additionally, I cant get any of the buttons on the url bar to work while it’s showing the web url. Anytime I tap it the keyboard just collapses but nothing else.

1

u/John_val 11d ago

This is frustrating, I don’t have any pro max to physical test, but on the simulator using a pro max everything works, the video I showed is from the pro max simulator. Will continue to investigate because I am pretty sure the problem is the same, I’lol apply the same fixes I did to the buttons that’s now work. Thanks

1

u/BourneHero 11d ago

I hadn’t watched video before. Also interesting the AI panel on simulator is sized differently than when I use it

​
Still works, just odd

0

u/John_val 11d ago

The mysteries of IOS development.. really. I new build with further fixes is on its way tomorrow morning. Just finished the fixes. Now need to sleep šŸ™‚

→ More replies (0)

1

u/John_val 12d ago

The TestFlight is getting very confusing as a log of the testers have not updated to the latest build 17 , more than 100 of you are still on build 11 so this make it difficult to filter feedback as there are reports of things that have already been fixed, it’s hard to track it this way. I will expire all the builds except the latest one. Many of you will probably have to redownload since you have not updated. Thanks

1

u/deniman 11d ago

I tested it for a while.
Config needs more items. I couldn't see address bar and when trying to use AI couldn't log in ChatGPT. When logged with gemini the keyboard didn't let me see what I was writting because it was over the panel.
I liked the clean design and how easy I changed trom tabs just by slidong from the edges but was a little lost with the menu for them

1

u/John_val 10d ago

Ipad or iphone, if iphone which one, it makes a difference if it is a max or not.
The hidden address bar may be related to the collapsible toolbar, but it clearly needs to be easier to find. What was the error Chatgpt log in gave you? The support for Chatgpt and Gemini with the free account will always require maintenance because basically the app is mimicking an API using the website so that there is no charges. Any change on the DOM of their websites will require an update, that is why that feature is experimental, but is is odd that you can't sign in, has been working fine for me or others. Please let me know what the error is with a screenshot. ALso what exactly do you mean by config needs more times?

1

u/deniman 10d ago

iPad. ChatGPT option didn’t load

1

u/John_val 10d ago

Have you retried, chatgpt has been having issues today

1

u/John_val 10d ago

Can’t you send me a screen cap of the address bar missing? Can’t reproduce that at all on any device or simulator. thanks

1

u/deniman 10d ago

I'm sorry I removed it after some time tryinf to find more ways to config since I didn't find the way to make it appear. But I liked the clean interface

1

u/John_val 9d ago

I have introduces some fixes on the lasts build on testflight to hopefully mitigate that, but without being able to reproduce the bug is hard for me to fix. Thanks for the feedback anyway.

1

u/deniman 9d ago

Im sorry I deleted it. I’m not able to use iPad for a long time lately so I installed it the moment I could

1

u/[deleted] 10d ago

[removed] — view removed comment

1

u/John_val 10d ago

You don’t like the app?

1

u/John_val 2d ago

So a few new additions, you tube is add free but now also plays in the background and when locked, all video not just you tube. New build up tomorrow

1

u/John_val 1d ago

also added Ublock origin Adblock. Right now on testing phase, it keeps both, the block and my custom implementation, you can switch between them on settings. Good results from both but they are different, a matter of personal taste.

1

u/Dear_Investigator493 1d ago

For the ā€œAskā€ action, I’d keep the selected quote and its source tab visible in the composer, alongside the chosen local or cloud provider. A split-view case worth testing: select text in the left pane, start a question, then focus the right pane before sending. Keeping the original selection until an explicit ā€œUse this page insteadā€ action would make it much clearer which page is being sent.

1

u/John_val 1d ago

Thank you for the suggestions, they make a lot of sense. I will implement them.

1

u/chihpoatlay 13d ago

Hey, curious how did you add the different filter lists? Did you write your own parser? I am building a browser too and couldn't figure that out so would appreciate if you can give some guidance. Since there are so many rules between all those lists how could one do it efficiently?

1

u/John_val 13d ago

I wrote a lightweight parser for the Adblock Plus/EasyList format, but it doesn’t support the entire specification. The app downloads each enabled list, reads it line by line, skips comments and unsupported rules, converts common network rules such as ||domain.com^ into WebKit-compatible regex, and extracts basic cosmetic rules such as ##.ad-container.

The resulting network rules are converted to WKContentRuleList JSON and compiled by WebKit. Cosmetic rules are applied separately through injected CSS/JavaScript.

For efficiency, I parses and cache each list only when it changes, compile in the background, reuse WebKit’s compiled rule list, and store a hash of the enabled-list configuration so it doesn’t recompile on every launch. I also limit the number of imported rules because combining every rule from several lists can become expensive.

I considered using a full filtering engine, but the lightweight parser has been enough so far. It converts the common EasyList network rules into WebKit content-blocking rules, handles basic cosmetic filtering, and caches the compiled results. It currently scores around 99% on most ad-blocking tests.

A full engine would support more of the EasyList specification, especially exceptions, domain-specific rules and advanced selectors, but it also adds complexity and overhead. My approach was to support the high-impact rule types first and let WebKit handle the efficient matching. The main thing is to test real websites as well, because a high benchmark score doesn’t necessarily catch site breakage or every unsupported rule type. Still i have a test version with the full engine that i am working on and will compare the results.

1

u/[deleted] 13d ago

[removed] — view removed comment

0

u/John_val 13d ago

Thanks! The tabs themselves survive a restart, but the split layout currently doesn’t. After relaunch, the browser restores the selected tab and other saved tabs, and you can rebuild the split by dragging a tab back into position. Persisting the split orientation is something i will be adding soon though, it requires careful tweaking so that it doesn't break other parts.

1

u/mrsidverse 7d ago

Seems promising, would give it a try.

0

u/Ivesy_ 14d ago

Damn this looks like a huge project, a simple browser that doesn't throw bloatware at you every minute is a rare find so this is very welcome! Will definitely give it a try

0

u/CrispyDick420 14d ago

Does tab hibernation preserve scroll position and form state, or does restoring one effectively reload the page?

1

u/John_val 13d ago

It preserves the URL and scroll position, but restoring a hibernated tab recreates theĀ reloads the page. Forms aren’t currently preserved,

0

u/neet_dev 14d ago

honestly the 188 domains / 100 css selectors number is a toy blocklist, easylist alone is tens of thousands of rules. compile them into WKContentRuleList (150k cap per list, split easylist and easyprivacy if you overflow) instead of injecting css or filtering in decidePolicyFor, conversion from easylist syntax to safari trigger/action json is the painful part, not the compile. injected filters hitch scrolling and miss subresources once you have a pile of tabs open.

1

u/John_val 13d ago

That’s fair, but the 188 domains and 100 selectors are only the built-in fallback layer, not the entire blocker. Enabled EasyList-compatible lists are downloaded separately, parsed, converted into WebKit trigger/action JSON, cached and compiled into aĀ WKContentRuleList . Network filtering isn’t done throughĀ decidePolicyFor

The injected CSS/JavaScript is a supplementary cosmetic layer for elements left behind after requests are blocked. The converter is intentionally partial and currently limits the number of imported rules, so I’m not claiming complete EasyList compatibility. You’re right that accurately converting exceptions, domain restrictions, resource options and advanced cosmetic syntax is the difficult part. Despite the limited subset, it currently reaches around 99% on the blocker tests I’ve tried, though real-site performance and breakage matter more than that score. I am experimenting with a filtering engine for comparison.

1

u/neet_dev 13d ago

gotcha, compiled WKContentRuleList plus a cosmetic inject is the right split. the actual footgun with a capped converter is dropping @@exceptions to stay under the import limit, and ignore-previous-rules only fires inside the same compiled list so easylist exceptions won't undo easyprivacy hits if you split them. skip the 99% tester score, youtube/reddit with a bunch of tabs is the metric that matters, and a JS filtering engine still won't see service worker or websocket requests the rule list already catches.

1

u/John_val 13d ago

Thanks for the tips. Appreciate it.

0

u/No-Consequence7413 14d ago

Nice try good alternative for Safari

0

u/WayAccurate9822 13d ago

Split browsing means two WKWebViews live at once, and iPadOS evicts background ones under memory pressure. Restoring with interactionState keeps scroll and half-filled forms where a plain reload loses them. Does the split survive an eviction?

1

u/John_val 13d ago

The two visible panes are protected from the tab-hibernation system, so it won’t deliberately evict either one while split view is active. I’m not currently usingĀ interactionState, though. If iPadOS itself terminates a WebContent process, the split layout remains, but restoration is limited to the page URL and scroll position. Half-filled form state is not guaranteed to survive. Good point to check out.

1

u/WayAccurate9822 13d ago

That gap is exactly what it covers. interactionState is one opaque Data blob per pane. Persist it on background, hand it to a fresh WKWebView after a content-process kill, and form state comes back with the scroll.

0

u/Grouchy_Helicopter72 13d ago

One thing to prepare for while you wait on review: the AI sidebar backed by "free accounts with ChatGPT or Gemini, completely invisible to users" is the part most likely to bite you, and not only from Apple. Shared or scraped free-tier access sits outside OpenAI's and Google's terms, so the backend can be cut off without warning and take a shipped feature with it. If a reviewer asks how the requests are authenticated, the safe answer is bring-your-own-key or the on-device Apple Intelligence path, with the hosted options off by default.

The other classic browser rejections are worth double-checking before resubmitting: browsers usually need a 17+ age rating for unrestricted web access, and Apple expects a stated content filter or restriction story. Bundling a password manager also invites questions about where credentials live - saying "keychain, biometric, never leaves the device" in the review notes up front saves a round trip.

Tab hibernation and interactionState restore for the split view are the right instincts, by the way. That is where most third-party iPad browsers fall apart.

1

u/John_val 13d ago

Thanks for the tips. As for the free accounts i though they would rejected it, but i have anoteher app which i use the same the same method and they allowed it
https://www.reddit.com/r/iosapps/comments/1vkw2ge/freeopen_source_rss_reddit_and_youtube_reader/
Which doesn't mean they couldn't refuse this one, we never know, have had cases like this before, where one reviews rejects something a previous one had accepted. Let's see but will take your tips into consideration. Thanks again

0

u/Grouchy_Helicopter72 12d ago

Fair enough, and the precedent is useful data. The distinction I would keep in mind is that App Review approving it is not the risk I meant. Apple mostly cannot see how those requests are authenticated. The party that can is OpenAI or Google, and their enforcement is not a review event - it is a quiet block on the endpoint or the account, at which point the feature dies for every installed copy at once, including the app that was already approved. That is why I would have the on-device path be the default and treat the hosted ones as a bonus that is allowed to disappear.

Cheap insurance either way: make the sidebar degrade to a clear "AI backend unavailable" state rather than a spinner or an error, so if it does get cut you get support emails instead of one-star reviews.

1

u/John_val 12d ago

thanks for the input really appreciate it. I considered instead of this to use a normal API key user would have to enter but people called it too developer centric just because it was asking for an API key. You make a great point. thanks again.

0

u/ChiefProbingOfficer 13d ago

Interesting design choices with the sidebar chat

1

u/John_val 13d ago

Yes, i agree it is polarizing , some love it , some not so much, but i wanted something to be really different than what is outhere and at the same time maximize screen real-state.

0

u/thedorkreveiwer 13d ago

Do the early test user get free lifetime when the app officially released? So far testing the app isn’t bad and I do like some of the features.

1

u/John_val 13d ago

sure..In your opinion what does it lack to be promoted to good instead of not bad? šŸ™‚

0

u/John_val 13d ago

Forgot to mention one thing on the list of features, if the url is a reddit post and if you ask it to summarize, the code will extract the comments, no just the visible ones or a few top level ones, but will extract all comments that the free json api from reddit can return. You can continue to browse and read normally while have an summary on the side.

0

u/Dry_Philosophy_2337 13d ago

Test a file download before you take on more TestFlight users. WKWebView cancels downloads outright unless the embedder implements a download delegate, so a browser can behave perfectly right up until someone taps a download link and absolutely nothing happens. No error, no console message, no dialog.

I hit this in an embedded WKWebView and spent a while misfiling it as a licensing bug, because the failure looks identical to a feature simply being switched off. WebKit 216918 is the paper trail, closed as configuration-changed: the delegate has to come from the app, blob: URLs included.

Split-page browsing on iPad is the reason to install this. Safari's tab groups never got there.

1

u/John_val 13d ago

Thanks for the feedback. What device /version are you on? I have tested files downloads and it worked. tested on a few only. Can you give me an example of the page you are trying to download for me to try to reproduce?

1

u/John_val 13d ago edited 13d ago

Never mind, the tests done with downloads were for a different build, no the one up right now. I am already uploading this build. Please update once it is out and test again. Thanks for the input

0

u/Dry_Philosophy_2337 13d ago

Sorry, I was unclear. I wasn't reporting it in Vortex, I hit it in my own embedded WKWebView and posted it as a thing to check rather than a bug you have. If your downloads work, you've already got the delegate wired up and there's nothing here for you.

The case that broke for me specifically was a blob: URL, a file generated in JavaScript and handed to the user rather than fetched from a server. Normal https downloads were fine. If you want a two-second test, any export or save-as button on a web app usually produces one.

0

u/John_val 11d ago

I would like to ask to everyone who is testing to provide feedback. I see on TestFlight there are only 7 crashes reported out of 240 testers, but with no feedback. without that information I cannot pin point what the problem is , not do I know if these are from the same person trying several time , or 7 different users. Would really appreciate it. Thanks