How can I start applications on specific workspaces in i3 when it starts?

Why is this not working in my config file? :

workspace 1; exec firefox; workspace 2; exec chromium; workspace 1

5 Answers 5


According to the Arch Wiki i3 page, to autostart an application on a specific workspace, you use i3-msg:

exec --no-startup-id i3-msg 'workspace 1:Web; exec /usr/bin/firefox'
  • 7
    Yes, a line like exec --no-startup-id i3-msg 'workspace 1; exec firefox; workspace 2; exec urxvt; workspace 1' works. But, I find it a little odd to use exec on i3-msg which is a command meant to execute i3 commands. Why can't I directly write workspace 1; exec firefox; workspace 2; exec urxvt; workspace 1 in my config file?
    – Gradient
    Commented Oct 24, 2013 at 5:05
  • 13
    This just opens everything in Workspace 1 for me.
    – cmc
    Commented Oct 30, 2014 at 16:15
  • 6
    Works for most apps. However google-chrome-stable always opens on the last workspace in my setup. For example, with this configuration, Chrome opens on workspace 4 next to htop.
    – danijar
    Commented Jun 23, 2015 at 20:05
  • 5
    Note that i3 now provides layout saving/restoring features that make it unnecessary to call i3-msg in most cases.
    – Wieland
    Commented Apr 16, 2016 at 15:32
  • 4
    @danijar I would imagine it is because the amount of time it takes to startup Chrome exceeds the amount of time it takes to switch to workspace 4 and open urxvt. Google is smart and knows that the sooner it can get you a window the better, but they do this by returning "success" to the executing terminal/application (eg exec) ASAP and then loading the browser in a forked process, which is why exec thinks it was done with Chrome and it moved to the next line in your config. Add && sleep 3 and I'd bet Chrome opens in workspace 3. May need to go as high as 5 depending on # of extensions.
    – dragon788
    Commented Jun 19, 2017 at 22:23
# This is what I use in ie config
# custom variables for workspaces
set $ws1 "1< txt >"
set $ws2 "2> fm "
set $ws3 "3< Web >"
set $ws4 4
set $ws5 5
set $ws6 6
set $ws7 7
set $ws8 8
set $ws9 9

#                         *** Workspace specific settings ***                     #
# Assign Workspaces:
assign [class="Firefox"] $ws3
assign [class="Chromium"] $ws3
assign [class="Google-chrome-beta"] $ws3
assign [class="^Geany"] $ws1

NOTE: to apply config, you can use:

i3-msg reload

  • 1
    This works for some applications, but not for others. I suspect it could be related with the string used in the class argument. Is there any way to know exactly to which class is an application associated? Commented Mar 25, 2019 at 7:29
  • 5
    @LuísdeSousa you xprop | grep CLASS in terminal, your mouse pointer changes into a crosshair, you click on the program you want to get the class of and use the second variable that comes up in your terminal. Example result for Chrome: WM_CLASS(STRING) = "google-chrome", "Google-chrome" Commented Mar 27, 2019 at 3:34
  • @kittenparry. Thank you for the suggestion, but still using the string from the xprop command the windows are not assigned to the desired workspace. Commented Mar 28, 2019 at 9:33
  • 10
    @LuísdeSousa some programs don't work with it like Spotify. For them you might write something similar to this for_window [class="Spotify"] move to workspace $ws10 where $ws10 is your workspace variable. Commented Mar 28, 2019 at 9:35

It's an autostart on workspace launch only, not an autostart when i3 starts but I thought it could be useful.

For example, to launch my web browser in the named second workspace "web" this is what I did in my config :

bindsym $mod+2 workspace 2:web; layout tabbed; exec [ $(ps h -C vimb | wc -l) = 0 ] && /usr/bin/vimb -s

When I hit key 2, my web browser starts but when it's already opened it didn't relaunch it, it just switch to the web workspace.

Note: the layout part can be annoying sometime, it's not a requirement.

For more details see my conf

  • 2
    You can do it much easily by assigning workspace. For example to move pidgin to 3-rd workspace on its every launch, I have in the config assign [class="Pidgin"] $tag3.
    – Hi-Angel
    Commented Oct 23, 2016 at 2:34
  • 1
    Assigning to a workspace is different. @tyjak's solution will cause an application to launch when you open a particular workspace. Assigning an application to a workspace will cause that application to be moved to a workspace whenever you open it.
    – Mike
    Commented Nov 19, 2016 at 8:29

I just got it working with this at the end of my ~/.config/i3/config file:

for_window [class="Firefox"] move container to workspace 2
exec --no-startup-id firefox
  • According to Arch Linux i3 Example for Firefox: First set your variable set $ws1 "Firefox" and then insert following line for_window [class="Firefox"] move to workspace $ws1 Commented Nov 25, 2018 at 0:05
  • Thank you. It works for me. Commented Aug 22, 2022 at 4:55

Just use assign [class="<use your program name here e.g. - Firefox>"] $workspace<eg. 5>. It is working for me.


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .